信号类型reg&wire
在程序中需要定义信号类型,一般分为reg(寄存器型)和wire(线型)两种,下面将以一张图来阐明:
作为input或inout的信号端口只能是wire型,而作为output的信号端口则可以是wire型或者reg型。reg定义的信号通常会被综合成一个寄存器(rigister),但有一个前提,就是reg信号必须是在某个特定信号边沿敏感触发的always语句中被赋值。
reg变量只能在always和initial语句中赋值,wire 只能用于assign,用连续赋值语句,通过模块化的实例输入和输出端口赋值。
阻塞与非阻塞
在Verilog语言中,有两种赋值运算,一种叫阻塞赋值(blocking assignment),其运算符为‘ = ’;另一种叫做非阻塞赋值(non-blocking assignment),其运算符为‘ <= ’;
阻塞赋值:在顺序代码块中使用阻塞赋值语句,如果这一句没有执行完成,则后面的语句不会执行。
非阻塞赋值:在顺序代码块中使用非阻塞赋值语句,则执行这一句的同时,并不会阻碍后面的语句的执行。
如果后一个语句所用到的是前面一个非阻塞赋值语句中的变量,由于这两个语句‘同时’执行,因此后面的一个语句是前面一个语句执行前变量的数值。非阻塞赋值是Verilog作为硬件描述语言与普通编程语言的一个重大区别。
例1:阻塞赋值(下面的阻塞例子在代码书写中不能适用,在此列出只为讲述阻塞赋值例子)
always@(posedge clk)
begin
b = a;
c = b;
end
a = 7, b=7, c=7;
a = 4, b=4, c=4;
a = 5, b=5, c=5;
例2:非阻塞赋值
always@(posedge clk)
begin
b <= a;
c <= b;
end
a = 7, b=x, c=x;
a = 4, b=7, c=x;
a = 5, b=4, c=7;
a = 0, b=5, c=4;
一般书写习惯里,assign中用‘ = ’,always中用‘ <= ’。
异步复位&同步释放
- 概述:
单独使用异步复位或者同步复位均不可靠。异步复位会影响寄存器的“复位时间”,引起设计的稳定性问题,尤其对于状态机的无意识的复位,将导致进入不确定的状态。同步复位也存在类似问题,而且对于不带同步复位专用端口将会增加额外的逻辑资源。
那么如何解决上述问题,一般情况采用异步复位与同步释放的方式,而且复位信号低电平有效,故两全其美。
- 具体知识:
异步复位:
何为异步,即复位信号和系统时钟信号的触发可以在任何时刻,两者无任何关系,相互独立。
同步复位:
何为同步,即复位信号和系统时钟信号同时为“真”的状况下,方可起作用。
异步复位同步释放: