FPGA-02-verilog简单讲解

信号类型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作为硬件描述语言与普通编程语言的一个重大区别

扫描二维码关注公众号,回复: 3317580 查看本文章

 

例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中用‘ <= ’。

 

异步复位&同步释放

  • 概述:

单独使用异步复位或者同步复位均不可靠。异步复位会影响寄存器的“复位时间”,引起设计的稳定性问题,尤其对于状态机的无意识的复位,将导致进入不确定的状态。同步复位也存在类似问题,而且对于不带同步复位专用端口将会增加额外的逻辑资源。

那么如何解决上述问题,一般情况采用异步复位与同步释放的方式,而且复位信号低电平有效,故两全其美。

  • 具体知识:

    异步复位:

何为异步,即复位信号和系统时钟信号的触发可以在任何时刻,两者无任何关系,相互独立。

同步复位:

何为同步,即复位信号和系统时钟信号同时为“真”的状况下,方可起作用。

异步复位同步释放:

 

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/82820866
今日推荐