如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x
3 ^, Q6 T: x( H* H6 Cwww.fpga-design.net7 O2 v2 {0 c0 M6 |赋全0:指各位均为二进制0,其余依此类推。
: v3 g7 L5 T" O4 D以WIDTH表示din/dout位宽。
为了说明方便定义这样一个模块
FPGA设计网论坛 专业FPGA设计论坛) b1 \- ]. R# {2 i) ]) C7 M% y5 X==============================================================
FPGA设计网论坛 专业FPGA设计论坛; S7 C3 s _& Tmodule evaluate #(parameter WIDTH = 16)
( input clk,
input rst,
1 k H' I6 U a& c input [WIDTH-1:0] din,
output reg [WIDTH-1:0] dout
" ~# w; b: F* s5 e; H E );
always @(posedge clk)
begin
" _9 @% R' u1 V) t2 D+ e if (rst)
9 l2 P8 u+ [! i dout <= 'b0; //如何赋值
else
* Q8 q0 G8 j2 j7 N dout <= din;
www.fpga-design.net2 A# Z% i% n8 e" r' L4 B. B end
' T3 t! w; \- f" g4 [/ _0 v7 fendmodule
由于位宽已经参数化,那么如何解决参数化赋值问题,以使赋值能“适应参数”。
www.fpga-design.net# o$ h; G( g% t5 b( H' I/ ^赋全0的方法:
6 N: h; i! l! Y' rwww.fpga-design.net; G2 i( L/ @/ y9 h# I" o(1)直接赋0
! Z0 F6 M6 f6 m8 cdout <= 0;此种情况下默认0为十进制以32位表示,如果din位宽大于32位,则高位补零,如果din位宽小于32位,则截取低位,仍为0。
9 [& L* E& X/ q" ^(2)直接赋'b0
0 j, M: r9 _1 ]( j8 q; zdout <= 'b0;
2 @* K |1 {- z0 V3 q2 L(3)利用位拼接
www.fpga-design.net0 K. K! ]8 W' Ndout <= {WIDTH{1'b0}};
; y/ O4 a9 x/ g! N(4)supply0
定义supply0 [WIDTH-1:0] dout_gnd,dout <= dout_gnd;
F1 i. A7 [) v; o& H赋全1的方法:
, }, q( ?. F' J, P1)直接赋~0
& K7 c8 O; T( k. E; o) ?dout <= ~0;
(2)直接赋-1
dout <= -1;
(3)利用位拼接
5 V7 ^# r5 ? j/ W+ Edout <= {WIDTH{1'b1}};
(4)利用supply1
& A& T2 D, C6 h# w2 `定义supply1 [WIDTH-1:0] dout_vcc dout <= dout_vcc;
需要注意的是Verilog中并没有'b1的赋全1方式。
赋全x或者全z均可采用'bx或者'bz的方式
FPGA设计网论坛 专业FPGA设计论坛' O8 A2 s, ~, z% [ 结论:赋全0、全x或者全z可采用'b0、'bx或者'bz的方式;
+ X% |: g* W" t4 `: H! s 赋全1可采用赋~0或赋-1的方式较为简洁。