[资料分享] 如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x

eeleader   2010-9-10 09:28 楼主
如何解决Verilog中参数化的赋值:赋全0,赋全1,赋全Z,赋全x3 ^, Q6 T: x( H* H6 C
www.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  _& T
module 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 f
endmodule

由于位宽已经参数化,那么如何解决参数化赋值问题,以使赋值能“适应参数”。www.fpga-design.net# o$ h; G( g% t5 b( H' I/ ^

赋全0的方法:6 N: h; i! l! Y' r
www.fpga-design.net; G2 i( L/ @/ y9 h# I" o
(1)直接赋0! Z0 F6 M6 f6 m8 c
dout <= 0;此种情况下默认0为十进制以32位表示,如果din位宽大于32位,则高位补零,如果din位宽小于32位,则截取低位,仍为0。9 [& L* E& X/ q" ^
(2)直接赋'b00 j, M: r9 _1 ]( j8 q; z
dout <= 'b0;2 @* K  |1 {- z0 V3 q2 L
(3)利用位拼接www.fpga-design.net0 K. K! ]8 W' N
dout <= {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, P

1)直接赋~0& K7 c8 O; T( k. E; o) ?
dout <= ~0;
(2)直接赋-1
dout <= -1;
(3)利用位拼接5 V7 ^# r5 ?  j/ W+ E
dout <= {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的方式较为简洁。
一个为理想不懈前进的人,一个永不言败人! http://shop57496282.taobao.com/ 欢迎光临网上店铺!

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复