打印
[Verilog HDL]

Verilog-always语句

[复制链接]
9312|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

always语句总是循环执行,或者说此语句重复执行。
      只有寄存器类型数据能够在这种语句中被赋值。寄存器类型数据在被赋新值前保持原有值不变。所有的初始化语句和always语句在0时刻并发执行。
      



      下例为always语句对1位全加器电路建模的示例,如图2-4。

  • module FA_Seq(A,B,Cin,Sum,Cout);

    input A,B,Cin;
    output Sum,Cout;
    reg Sum,Cout;
    reg T1,T2,T3;

    always @(A or B or Cin) begin
        Sum = (A^B)^Cin;
        T1 = A & Cin;
        T2 = B & Cin;
        T3 = A & B;
        Cout=(T1 | T2) | T3;
    end

    endmodule

      模块FA_Seq有三个输入和两个输出。由于Sum、Cout、T1、T2和T3在always语句中被赋值,它们被说明为reg类型(reg是寄存器数据类型的一种)。
      always语句中有一个与事件控制(紧跟在字符@后面的表达式)。相关联的顺序过程(begin-end对)。这意味着只要A、B或Cin上发生事件,即A、B或Cin之一的值发生变化,顺序过程就执行。在顺序过程中的语句顺序执行,并且在顺序过程执行结束后被挂起。顺序过程执行完成后,always语句再次等待A、B或Cin上发生的事件。
      在顺序过程中出现的语句是过程赋值模块化的实例。模块化过程赋值在下一条语句执行前完成执行。过程赋值可以有一个可选的时延。

      时延可以细分为两种类型:
      1)语句间时延:这是时延语句执行的时延。
    2)语句内时延:这是右边表达式数值计算与左边表达式赋值间的时延。
      下面是语句间时延的示例:

  • Sum=(A^B)^Cin;
  • #4T1=A&Cin;

      在第二条语句中的时延规定赋值延迟4个时间单位执行。就是说,在第一条语句执行后等待4个时间单位,然后执行第二条语句。下面是语句内时延的示例。

  • Sum=#3(A^B)^Cin;

      这个赋值中的时延意味着首先计算右边表达式的值,等待3个时间单位,然后赋值给Sum。


使用特权

评论回复

相关帖子

沙发
gaochy1126|  楼主 | 2021-9-28 13:39 | 只看该作者
1.always@后面内容是敏感变量,always@(*)里面的敏感变量为*,意思是说敏感变量由综合器根据always里面的输入变量自动添加,也就是所有变量都是敏感列表,不用自己考虑。 2.如果没有@,那就是不会满足特定条件才执行,而是执行完一次后立马执行下一次,一直重复执行,比如testbench里面产生50Mhz的时钟就(假设时间尺度是1ns)可以写成 always #25 CLK_50Mhz = ~CLK_50Mhz;
一般always@(*)是指里面的语句是组合逻辑的。*代替了敏感变量。
而一般时序逻辑要写成always@(posedge clk or negedge rst)//时钟信号clk上升沿或者复位信号rst下降沿的时候执行always块内的代码。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1051

主题

11300

帖子

26

粉丝