赞
踩
一个if语句通常可以创造出一个2选1选择器,当条件为真时选择一个输入,为假时选择另一个。
- always @(*) begin
- if (condition) begin
- out = x;
- end
- else begin
- out = y;
- end
- end
这等同于连续性赋值语句的条件运算符:
assign out = (condition) ? x : y;
然而if语句也增加了更多制造错误方式,只有当out总是被赋值时电路才是组合型的。~https://hdlbits.01xz.net/wiki/Always_if
当我们设计一个电路时,首先要考虑的应该是电路:
一定不要先写代码,然后希望由代码产生一个适当的电路。
语法正确的代码不一定会产生一个合理的电路(组合逻辑+触发器)。通常的原因是:我们需要考虑在我们指定的情况之外发生了什么?Verilog的回答是:保持输出不变。
保持输出不变这个行为意味着当前状态需要被记住,因此就产生了一个锁存器。组合逻辑(比如逻辑门)不能记住任何状态。注意这条信息:Warning (10240): ... inferring latch(es),除非是我们有计划的产生一个锁存器,它通常意味着一个bug。组合电路必须在所有条件下都给输出信号赋一个值,这也就意味着我们必须写else从句,或者是在这个always过程块的第一句也就是case之前,就给输出信号提前赋一个默认值。case语句中同样要注意这个问题。
always @(*) begin up = 1'b0; down = 1'b0; left = 1'b0; right = 1'b0; case (scancode) ... // Set to 1 as necessary. endcase end
https://hdlbits.01xz.net/wiki/Always_if2
在Verilog中case语句等同于一系列的if-elseif-else语句,在这些语句中把一个条件表达式和其他的相比较。它的语法和功能不同于c语言中的switch。
- always @(*) begin // This is a combinational circuit
- case (in)
- 1'b1: begin
- out = 1'b1; // begin-end if >1 statement
- end
- 1'b0: out = 1'b0;
- default: out = 1'bx;
- endcase
- end
在优先编码器中经常会用到casez,case语句的行为就像是按顺序检查每一项(事实上,更像一个巨大的真值表),一旦第一项符合就不会再执行后面的可选项了,因此为了编码时缩短代码和编码后方便阅读,可选项可以部分重复。
- always @(*) begin
- casez (in[3:0])
- 4'bzzz1: out = 0; // in[3:1] can be anything
- 4'bzz1z: out = 1;
- 4'bz1zz: out = 2;
- 4'b1???: out = 3;
- default: out = 0;
- endcase
- end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。