关于FPGA设计的书里有一些介绍。
系统上电后发出reset信号,使CPU进入“空闲”状态,从这个状态开始,依次进入取指-->译码-->执行状态,周而复始,CPU就开始工作了。
---------- ---------- ---------- ----------
| 空闲态 |------->| 取指态 |------->| 译码态 |------->| 执行态 |-----
---------- ---------- ---------- ---------- |
^ |
| |
---------------------<-------------------------
硬件状态是如何顺次变迁的呢?以“一热态位”状态机实现为例:
rst ---------------- rst
| | | |
------------ | ------------
----<-| 组合逻辑 |<-- | ----<-| 组合逻辑 |<--
| ------------ | | | ------------ |
| ----------- | | | ----------- |
| | D触发器 | | | | | D触发器 | |
---->-|D Q|--------->------- ---->-|D Q|----------->--------......
| | | |
clk -->|clk Q~|--->“S0状态输出” clk -->|clk Q~|--->“S1状态输出”
rst -->|clr | rst -->|clr |
----------- -----------
系统上电后,rst有效,所有D触发器异步清零,也就是说所有状态输出都无效。
第一个时钟上升沿后,经过组合逻辑判断,只有第一个D触发器输出有效状态,Q~为0,使能第一个状态电路。
第二个时钟上升沿后,第一个D触发器就永远输出无效状态,除非rst重新激活,此时,第二个D触发器由于连接在其组合逻辑上的第一个D触发器上的Q~有效,所以它的输出状态S1有效,使能第二个状态电路。
依次类推,第三个时钟上升沿后,第二个D触发器输出失效,激活第三个,然后就这么顺次传递下去,硬件电路就实现了状态变迁。
硬件上实现了状态迁移逻辑后,就可以以此为最小逻辑设计按照状态变迁图设计CPU控制部件了。
下一状态取决于当前状态和输入条件。
------------
输入条件--->| 当前状态 |------->下一状态
------------
基于这个最小化的状态机硬件单元,再复杂的逻辑也可以实现,加上CPU时钟速度非常快,感觉就很神奇了。