赞
踩
assign out1 = a & b | c ^ d; 左边必须要是net类型(例如wire)
always @(*) out2 = a & b | c ^ d;左边必须是变量类型(例如reg)
always @(posedge clk)
组合逻辑: always @(*)
时序逻辑: always @(posedge clk)时序逻辑always块相对于组合逻辑always块的不同点在于输出端多了一组触发器或寄存器
连续赋值: (assign x=y;) // 不能在过程块(always块)内使用;
过程阻塞赋值: (x=y;) // 只能在过程块内使用;
过程非阻塞赋值: (x<=y;) // 只能在过程块内使用。可以把非阻塞赋值的符号“<=”中的<记成一个触发器
assign out_assign = a^b;
always @(*) out_always_comb = a^b;
always @(posedge clk) out_always_ff = a^b;同样是a^b,但是由于 always @(posedge clk) 属于阻塞赋值,计算完的结果会放在寄存器里面,等到下一个时钟信号来了,才可以输出
always @(*) begin casez (in[3:0]) 4'bzzz1: out = 0; // in[3:1] can be anything ,z表示不关心位 4'bzz1z: out = 1; 4'bz1zz: out = 2; 4'b1zzz: out = 3; default: out = 0; endcase end
为避免生成不必要的锁存器,必须在所有可能的情况下为所有的输出赋值(参见31.If statement latches)。这可能涉及许多不必要的输入,会多打很多字。 一个简单的解决方法是在case语句之前为输出赋一个“默认值”例如:
always @(*) begin up = 1'b0; down = 1'b0; left = 1'b0; right = 1'b0;//先定义一个默认值 case (scancode) ... // Set to 1 as necessary. endcase end
1、进入module之后需要有always语句块(end结束)
2、casez语句块注意需要有endcase,每个语句块后面需要加分号“;”,default 不是必需品
3、[7:0]一共是8位,老是看错!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。