2013-11-04 56 views
0

的代碼基本上如下:值計數時鐘週期150,然後重置爲0,VOutReg計算值多少次跑到150,當VOutReg獲取到50倍,它重置爲0.就是這樣。但是,當我寫一個測試夾具,只有下面的代碼:永遠#20時鐘=時鐘不都是我在結果得到的是時鐘改變,而不是ValueOut。找不到我的錯誤在很簡單的Verilog模塊

代碼:

module Asd(
input CLK, 
output [8:0] ValueOut 
); 


reg [9:0] Value; 
reg [8:0] VOutReg; 

initial Value = 0; 
initial VOutReg = 0; 

[email protected](posedge CLK) begin 
    if (Value == 150) 
     Value <= 0; 
    else 
     Value <= Value + 1; 
end 

[email protected](posedge CLK) begin 
    if (VOutReg == 50) 
     VOutReg <= 0; 
    else begin 
     if (Value == 150) 
      VOutReg <= VOutReg + 1; 
    end 
end 

assign ValueOut = VOutReg; 
endmodule 
+0

你看到價值或VOutReg改變你的模擬都還是他們停留在零?也許在你的總是和@符號之間留出一個空格? – Russell

+0

的解決方案是增加初始語句對所有寄存器又名 初始值= 0; initial VOutReg = 0; 這就是它。它在 – user2909337

+1

@ user2809337之前沒有給我任何值。是的,您需要將計數器信號初始化爲重置信號或初始分配。否則,他們將永遠是未知的。 – Russell

回答

1

我與你的代碼中看到的主要問題是你最後的if語句不具有其他與之相關聯,因此VOutReg未定義如果Value != 150。你也在創建不需要的推斷鎖存器。要真正建立一個寄存器,你需要爲它總是定義的每個寄存器NextD。然後Q,寄存器輸出,變得D,寄存器輸入,在每個正時鐘沿。像這樣:

module Asd(
input CLK, 
output [8:0] ValueOut 
); 


reg [9:0] Value; 
reg [8:0] VOutReg; 
reg [9:0] ValueNxt; 
reg [8:0] VOutRegNxt; 

initial Value = 'b0; 
initial VOutReg = 'b0; 

[email protected](posedge CLK) 
begin 
     Value <= ValueNxt; 
     VOutReg <= VOutRegNxt; 
end 

[email protected](*) 
begin 
    if (Value == 150) 
    begin 
     ValueNxt = 'b0; 

     if (VOutReg == 50) 
      VOutRegNxt = 'b0; 
     else 
      VOutRegNxt = VoutReg + 1'b1; 
    end 
    else 
    begin 
     ValueNxt = Value + 1'b1;  
     VoutRegNxt = VOutReg; 
    end 
end 

assign ValueOut = VOutReg; 
endmodule 
1

你能避免使用如下復位信號(RST)的首次發言。

module Asd(
input CLK, 
input RST, 
output [8:0] ValueOut 
); 


reg [9:0] Value; 
reg [8:0] VOutReg; 

//initial Value = 0; 
//initial VOutReg = 0; 

[email protected](posedge CLK, negedge RST) begin 
    if (!RST) begin 
     Value <= 0; 
    end 
    else begin 
     if (Value == 150) 
      Value <= 0; 
     else 
      Value <= Value + 1; 
    end 
end 

always @(*) begin 
    if (VOutReg == 50) 
     VOutReg <= 0; 
    else begin 
     if (Value == 150) 
      VOutReg <= VOutReg + 1; 
    end 
end 

assign ValueOut = VOutReg; 
endmodule 

此外代碼使用上升CLK邊緣作爲VoutReg邏輯,其可能不會給你的預期值的控制信號,因爲從描述中Voutreg僅取決於ValueCLK。您需要使用Value作爲控制信號。如果需要,您可以使用單獨的always塊進行註冊。