[Verilog HDL] Verilog-always语句

[复制链接]
 楼主| gaochy1126 发表于 2021-9-28 13:39 | 显示全部楼层 |阅读模式

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

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

    1. module FA_Seq(A,B,Cin,Sum,Cout);

    2. input A,B,Cin;
    3. output Sum,Cout;
    4. reg Sum,Cout;
    5. reg T1,T2,T3;

    6. always @(A or B or Cin) begin
    7.     Sum = (A^B)^Cin;
    8.     T1 = A & Cin;
    9.     T2 = B & Cin;
    10.     T3 = A & B;
    11.     Cout=(T1 | T2) | T3;
    12. end

    13. 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块内的代码。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

1148

主题

11651

帖子

26

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:这个社会混好的两种人:一是有权有势,二是没脸没皮的。

1148

主题

11651

帖子

26

粉丝
快速回复 在线客服 返回列表 返回顶部