Menu Close

Verilog语言设计与数字电路比较

作者:飞翔

在学习了一段时间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工具利用软件分析能力在背后实现化简流程。

 

 

Posted in FPGA, FPGA 教材教案, IC 教材教案, Quartus II, Quartus II, Verilog, 开发工具, 教材与教案, 文章, 编程语言

1 Comment

发表回复

相关链接