verilog学习(二) 高级知识点

结构语句

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
  1. 分支表达式的值必须不同 (4‘h0 4’h1 …)
  2. 所有表达式的位宽必须相等,必须指定位宽
  3. casez,不考虑高阻值Z
  4. casex,不考虑高阻值Z和不定值X

猜你喜欢

转载自blog.csdn.net/shenchen2010/article/details/120947693
今日推荐