结构语句
initial
只执行一次
initial begin
sys_clk <= 1'b0;
touch_key <= 1'b0;
#20 sys_rst_n <= 1'b0;
#110 sys_rst_n <= 1'b1;
end
always
一直重复执行 while(1)
always #10 sys_clk <= ~sys_clk //产生20ns周期时钟信号
always可以使边沿触发、也可以是电平触发
always @(敏感列表)
其中的敏感列表类似于while(判断语句)
例如:
always @(posedge sys_clk or negedge sys_clk) begin //边沿触发 描述时序逻辑
if (!sys_clk)
count <= 24'd20;
else if (count <= 24'd20)
count <= 24'd25;
end
always @(a or b or c or d) begin //电平触发 描述组合逻辑
a <= a | b ;
end
always @(*) begin // 对所有输入变量都是敏感的
a <= a | b ;
end
赋值语句
阻塞赋值
在一个always中,后面的语句是在前一个语句结束后才开始的。
执行赋值时,计算RHS(等号右边的),更新LHS(等号左边的)。
b = a;
非阻塞赋值
多个语句同时计算RHS,计算完后同时更新LHS。
非阻塞赋值智能给寄存器类型赋值,REG。
b <= a;
使用方法
组合逻辑用 阻塞赋值“=”
时序逻辑用 非阻塞赋值“<=”
在同一个always块里,不要同时用阻塞和非阻塞;
不允许在多个always块中,对同一个变量赋值;
条件语句
IF语句
### IF
if(XXX)
XXX;
### IF-ELSE
if(XXX)
XXX;
else
xxx;
### IF-ELSEIF
IF(XXX)
XXX;
else if (XXX)
XXX;
else if (XXX)
XXX;
条件语句必须在initial和always块中
其他
0,X,Z 都判定为假;1为真
if后面的操作语句可以为begin+end 组成的块语句,相当于大括号
CASE语句
case (num)
4'h0 : seg_led <= 8'b1100_0010;
4'h1 : seg_led <= 8'b1100_0011;
default : seg_led <= 8'b1100_0111;
endcase
- 分支表达式的值必须不同 (4‘h0 4’h1 …)
- 所有表达式的位宽必须相等,必须指定位宽
- casez,不考虑高阻值Z
- casex,不考虑高阻值Z和不定值X