2013-02-20 62 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