作者:飞翔
在学习了一段时间Verilog语言设计电路后,虽然觉得设计比较简单,也能生成对应的电路用于浏览,但总是无法与数字电路的设计方法得到电路一一对应,因此在熟悉了Verilog设计后我们可以与数字电路的设计方法做对比,看看二者的区别与统一。下面以3位计数器为例给大家介绍二者在设计流程以及实现方法上的区别。
1. Verilog设计与电路形成
例1:利用Verilog 设计3位计数器,计数范围0-7.
module count7 ( input clk, output reg[2:0] r=0 ); always@(posedge clk) r<=r+1; endmodule
从上面的例子可以看出,设计非常简单,虽然是RTL设计,但是从上面的例子中很难观察到电路的细节,在QuartusRTL view如图1所示,

图1 Quartus RTL View
因此给我们一个设计思路,寄存器的输出端反馈后,通过一个加法器(实现加1),在将相加后的结果输入到D端即可实现。但在FPGA的应用设计中,真正布线后结果如何呢?看看Mapping后的结果,如图2所示。可见真正mapping后的结果与RTL View的结果相差甚多。这是可以理解的,在FPGA的内部架构中加法器也是要组合逻辑实现的。

如果不熟悉Quartus 下如何查看RTL Viewer 以及Map Viewer可以参照图3的标注双击即可。
图2

图3 Quartus RTLView与 Technology Map Viewer( Post-Mapping)
从图2的显示结果可以看出,对于3个触发器的输入端分别由3个组合逻辑电路(LOGIC_CELL_COMB)实现,分别命名为r[0]~2, r[1]~0和r[2]~1, 其中的~仅是标注,没有特殊含义。如果选中某一个,如r[1]~0, 则在左边显示输入、输出关系,并在左下方给出了组合逻辑方程,如图4。这就是EDA工具的强大之处。其实在真正的电路设计中我们只给出了行为逻辑描述,最终EDA软件通过综合实现了具体细节。

图4 LOGIC_CELL_COMB细节
2. 传统数字电路设计
那么传统数字电路是如何设计的呢? 在传统的数字电路设计中,复杂的时序电路要经过如下步骤:
(1)设计分析,划分状态,
(2)画出状态转移图,
(3)根据状态图列出状态转移表(时序电路中的真值表),
(4)填写卡诺图,化简形成逻辑方程,
(5)根据逻辑方程进行优化,因此在中小规模设计中可能将化简后的结果重新优化,优化原则如下,
-
- 尽量使用库存器件,
- 尽量使用集成度高的器件(如加法器),但要考虑价格因素,
- 尽量使用同一种器件,如或非门和与非门都可以实现,在整体电路设计中可以考虑尽量使用同一种,
(6)画出逻辑电路。
由于在FPGA中实现,我们跳过上面的步骤(5),按照(1),(2),(3),(4),(6)逐步实现。
(1)设计分析: 由于计数器需要按照时钟进行状态跳转,因此是时序电路,状态0-7共8个状态。采用2进制编码,需要3个触发器r[2:0];
(2)状态图,如图5(简单的电路也可以跳过该步骤),

图5 状态图
(3)状态转移表

表1
从状态表可以看出,触发器的q端作为现态(qn)作为输入,求解次态(qn+1)方程。 由于次态与D触发器的d端在上升沿时符合q<=d, 因此这里以r.d[2],r.d[1],r.d[0]表示次态。
例如现态r.q[2],r.q[1],r.q[0]为010,次态应该为3,因此r.d[2],r.d[1],r.d[0]为3,在上升沿时次态由转为现态r.q[2],r.q[1],r.q[0]–>011。有了上表,逻辑电路的化简与组合逻辑电路化简无异,都是输入、输出的真值表。
(4)化简
将输出端(次态)分离,即对3个输出端分别求解,并进行卡诺图化简,求解次态输出方程。
- r.d[0]求解:

表2 r.d[0]状态转移表

表3 r.d[0]卡诺图
化简结果为: r.d[0] = ~r.q[0];
- r.d[1] 求解

表4 r.d[1]状态表

表5 r.d[1]卡诺图
化简结果为: r.d[1] = (~r.q[1]) & r.q[0] + r.q[1] & (~r.q[0]) ;
- r.d[2] 求解

表6 r.d[2]状态表

表7 r.d[2]卡诺图
化简结果为: r.d[2] = ( (~r.q[2]) & r.q[1] & r.q[0] ) + r.q[2] & (~r.q[1]) + r.q[2] & (~r.q[0]) ;
(5)根据化简结果画出电路图

图6
可见,利用状态图,状态转移表,卡诺图,电路图等步骤设计,还是很繁琐的;因此应充分利用Verilog强大的描述功能,以及EDA的分析综合能力进行FPGA或数字IC的RTL设计。但是经过上面的流程可以看出,无论通过那种方式设计,最基本的化简流程还是不变的,只是EDA工具利用软件分析能力在背后实现化简流程。
谢谢老师!🌹