结构语句
initial
initial(只执行一次)
常用于测试文件的编写,用来产生仿真信号(激励信号)
或者用于对存储器变量赋初值
initial begin
sys_clk <= 1'b0 ; // 1'b0 assign sys_clk
sys_rst_n <= 1'b0 ;
#20 sys_rst_n <= 1'b1 ; // #20 are delay 20,unit are ns
end
always
always(一直重复执行)
所以只有和一定时间控制结合在一起才有用
always #10 sys_clk <= ~sys_clk ; //10ns sys_clk reversal
always的时间控制可以是沿触发,也可以是电平触发;
可以是单信号也可以多信号(多信号中间用or连接)
always语句后紧跟的过程块是否可以运行,要看它的触发条件是否满足
always @ (posedge sys_clk or negedge sys_rst_n) begin //posedge is rising edge ,negedge is falling edge
if (!sys_rst_n) begin
counter <= 24'd0;
end else if (counter < 24'd1000_0000) begin
counter <= counter + 1'b1;
end else begin
counter <= 24'd0;
end
end
由关键字or连接的多个事件或者信号名组成的列表称之为“敏感列表”
组合逻辑电路中为高低电平
时序逻辑电路中为边沿触发?
always @ (a or b or c or d or e or f or g or h or p or m) begin // = always @ (*) begin
out1 = a? (b + c) : (d + e); //@ (*)表示块中输入的所有变量的变化都是敏感的
out2 = f? (g + h) : (p + m);
end
组合逻辑电路和时序逻辑电路
1.组合逻辑电路中,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关
2.时序逻辑电路中,任一时刻的输出不仅取决于当时的输入信号,还取决于电路原来的状态。
或者说还与以前的输入有关,因此时序逻辑电路必须具备记忆功能。
赋值语句
1.阻塞赋值,如 b = a;
2.非阻塞赋值,如 b <= a;
3. LHS = RHS;(RHS赋值操作的源头,LHS赋值操作的目标)
阻塞赋值(顺序执行?,一般运用于组合逻辑电路)
可认为只计算RHS并更新LHS
所谓阻塞是指在同一个always块中,后面的赋值语句是在前一句赋值语句结束后才开始赋值的
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
a = 1 ;
b = 2 ;
c = 3 ;
end else begin
a = 0 ;
b = a ;
c = b ; //a=b=c=0
end
end
非阻塞赋值(并行执行?,一般运用于时序逻辑电路)
非阻塞赋值的操作可以看作两个步骤:
(1)赋值开始时,计算RHS
(2)赋值结束后,更新LHS
所谓非阻塞赋值的概念是指,在计算非阻塞赋值的RHS以及更新LHS期间,允许其他的非阻塞赋值语句同时计算RHS和更新LHS
要求:非阻塞赋值只能用于寄存器类型的变量进行赋值,因此只能用于initial和always等过程块中
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
a <= 1 ;
b <= 2 ;
c <= 3 ;
end else begin
a <= 0 ;
b <= a ;
c <= b ; //a=0,b=1,c=2
end
end
经验
描述组合逻辑的always中用阻塞赋值=,组成的组合逻辑电路只与输入电平有关
描述时序逻辑的always中用非阻塞赋值<=,组成的时序逻辑电路往往与触发沿有关
同一个always中不能非阻塞赋值与阻塞赋值不用同时用
不允许在多个always中对同一个变量赋值
条件语句(必须在过程块中用)
1.if else
()中只有1是真值。0、x、z都是假
2.case(num)
分支表达式:控制表达式;
..............
default :控制表达式;
endcase
要求:1.所有分支表达式值不同
2.所有表达式的位宽相等
3.casez
比较时,不考虑高阻值z(只要除z之外相等即可)
4.casex
比较时,不考虑高阻值z和不定值x(只要除z、x之外相等即可)
关于顺序/并行执行的总结
组合逻辑(无记忆)的begin end 间是顺序执行的
时序逻辑(有记忆)的begin end 间是并行执行的
assign用于描述组合逻辑
alway用于描述时序逻辑(沿触发)/组合逻辑(电平触发)
所有的always和assign都是并行执行的
关于always的一些说明
1、一个模块中可有多个always块,并行运作
2、若always块可综合,则表示的是某种结构;若always块不可综合,则表示的电路结构的行为
需要注意的地方
1、assign不能再always中使用
2、assign和实例应用可独立于过程块存在