2013-02-20 60 views
0

我正在使用D-Flip Flops编写一个涟漪计数器。但是下面的代码给里面的initial块为q2,q3,q4变量。这是为什么?非法引用错误

module RCounter; 

reg d,d2,d3,d4,clk; 
wire q,q2,q3,q4; 


DFlipFlop a(d,q,clk); 
DFlipFlop a1(d2,q2,q); 
DFlipFlop a2(d3,q3,q2); 
DFlipFlop a3(d4,q4,q3); 

initial 

begin 

clk =1; 


d=0;d2=0;d3=0;d4=0;q2=0;q3=0;q4=0; 

#2 d=1;d2=~q2; d3=~q3; d4=~q4; 
#2 d=0;d2=~q2; d3=~q3; d4=~q4; 
#2 d=1;d2=~q2; d3=~q3; d4=~q4; 
#2 d=0;d2=~q2; d3=~q3; d4=~q4; 
#2 d=1;d2=~q2; d3=~q3; d4=~q4; 
#2 d=0;d2=~q2; d3=~q3; d4=~q4; 
#2 d=1;d2=~q2; d3=~q3; d4=~q4; 

end 

always 
begin 

#2 assign clk = ~ clk; 

end 

endmodule 

d触发器模块:

module DFlipFlop(d,q,clk); 

input d,clk; 
output q; 

assign q = clk?((d==1)? 1:0) : q; 

endmodule 

我怎样才能解决这个问题?

问候

回答

2

正如Vlad Lazarenko指出的,您不能为initial[email protected]块内的电线赋值。

解决方法是简单地将类型从wire更改为reg

如果您使用的是SystemVerilog,或者声明一切(除了三态总线)为logic

reg或wire的定义仅适用于该层级。一个reg可以驱动一个端口,该端口在该模块内被视为导线。

注册并不意味着触发器或注册它是一个模拟器优化。

还值得一提的是,触发器是通过正常实例:

reg x; 
always @(posedge clk or negedge rst_n) begin 
    if(~rst_n) begin 
    //reset condition 
    x <= 1'b0; 
    end 
    else begin 
    x <= next_value; 
    end 
end 
0

您正在试图初始值分配给电线,在这里:

q2=0;q3=0;q4=0; 

这是非法的。

+0

所以我怎么能解决这个问题?我必须为它们分配值。 – 2013-02-20 15:13:04

+2

@JamesAfred:不要这样做?在编写任何硬件描述之前,您似乎需要学习Verilog。 – 2013-02-20 15:13:57

+0

以及我正在通过制作这样的程序来学习它。那我该如何解决这个问题?我现在发布完整的代码。 – 2013-02-20 15:17:43