版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址
http://www.cnblogs.com/Colin-Cai/p/12045295.html
作者:窗户
QQ/微信:6679072
E-mail:6679072@qq.com
上一章给出了组合电路的仿真实现,这一章开始思考时序电路的仿真实现。但时序电路远比组合电路复杂的多,我们先从组成电路的每个元件说起。在程序实现层次,我们可以考虑给每个基础元件一个自定义描述方式,称为原语。
Verilog原语
Verilog提供了元件原语建模的方式,说白了,就是用一个表格来体现所有情况下的输出。Verilog的原语只允许有一个输出。
比如and门,用Verilog原语来描述如下
primitive myand(out,in1,in2); output out; input in1,in2; table // in1 in2 out 0 ? : 0; 1 0 : 0; 1 1 : 1; endtable endprimitive
Verilog原语中不能使用高阻(因为除了三态门产生高阻输出之外,这的确与真实电路不符,而Verilog并无VHDL那般抽象),不能表示三态门。
对于时序电路,Verilog也一样可以支持。所谓时序电路,意味着电路的输出不仅仅与当前电路的输入有关,还与电路之前的状态有关,所谓电路之前的状态也就是电路之前的输出。
我们来考虑这样一个时序元件,称之为D锁存器,有两个输入en和in,一个输出out。当en为0时,out和in保持一致;当en为1时,out保持不变。这称之为电平触发。用波形图可以描述其特性:
用verilog描述可以如下:
module dlatch(out, en, in); output out; input en, in; reg out; always@(in) if(!en) out <= in; endmodule
电平触发的D锁存器可以用原语描述如下:
primitive dlatch(out, en, in); output out; input en, in; reg out; table //en in : out : next out 0 0 : ? : 0; 0 1 : ? : 1; 1 ? : ? : -; endtable endprimitive
状态表的最后一行next out位置的 - 符号代表状态保持。
再来一个我们数字设计时最常用的元件D触发器,它有两个输入信号clk和in,有一个输出信号out。当clk从0变到1的瞬间(称之为上升沿),out被赋予in的值,其他时候out保持不变。这种触发称之为沿触发。波形图可以用以下描述其特性:
用Verilog描述如下:
module dff(out, clk, in); output out; input