Always blocks(conbinational)(总是阻塞(组合))
assign 语句的左侧必须是线网类型,而过程赋值(在 always 块中)的左侧必须是寄存器(reg)类型
Always blocks(clocked)(总是阻塞(时钟))
这里主要讲阻塞赋值与非阻塞性赋值。通常阻塞赋值用于逻辑电路,非阻塞性赋值用于时序电路。
阻塞性赋值也是一句一句执行的,即一句话在上一句结束后才执行赋值。而非阻塞性赋值,是并行执行的。
If statement( If 模块)
If statement lanch( If 模块的锁存器)
我们再写if或者case语句一定要写出else/default,以避免综合时出现锁存器,这是电路不希望的。因为锁存器很容易在信号上产生毛刺;而且也没有时钟信号,不容易进行静态时序分析。
case statement( case 模块)
priority encoder(优先编码器)
priority encoder with case(带casez的优先编码器)
casez语句用来处理不考虑高阻值z的比较过程,casex语句则将高阻值z和不定值都视为不必关心的情况。使用过程中?与z一样。case语句是顺序执行的,其实是个很大的组合逻辑。
也有一种case(1'b1)的写法,也想记录一下如这种,意思为先判断in[0]是否为1,如果为1则执行对应命令,否则去判断in[1]。以此类推
case(1'b1):
in[0]: pos = 0;
in[1]: pos = 1;
in[2]: pos = 2;
in[3]: pos = 3;
default: pos = 0;
endcase
这题我虽然做对了,先放代码如下
module top_module (
input [7:0] in,
output reg [2:0] pos );
always @(*) begin
casez (in)
8'bzzzzzzz1: pos = 0;
8'bzzzzzz1z: pos = 1;
8'bzzzzz1zz: pos = 2;
8'bzzzz1zzz: pos = 3;
8'bzzz1zzzz: pos = 4;
8'bzz1zzzzz: pos = 5;
8'bz1zzzzzz: pos = 6;
8'b1zzzzzzz: pos = 7;
default: pos = 0;
endcase
end
endmodule
但是我看仿真图总感觉怪怪的,就像当输入为10时,输出居然是4???,希望也有人指正
我用同样的代码,在别的仿真软件上跑了一下,同样的代码发现结果是不一样的,可能是网站的一点问题吧。有没有和我同感这个优先编码器,优先的低位的感觉很不舒服哈哈哈~
Avioding latches(避开锁存器)
module top_module (
input [15:0] scancode,
output reg left,
output reg down,
output reg right,
output reg up );
always @(*) begin
casez (scancode)
16'he06b: begin left=1;down=0;right=0;up=0;end
16'he072: begin left=0;down=1;right=0;up=0;end
16'he074: begin left=0;down=0;right=1;up=0;end
16'he075: begin left=0;down=0;right=0;up=1;end
default: begin left=0;down=0;right=0;up=0;end
endcase
end
endmodule