2016-02-29 46 views
0

更新:我正在編輯此問題以將方程更改爲更簡單的方程,但問題大致相同,區別在於這次我真的可以讓它給出計算的正確答案,但我一直存在「鎖存器」的問題(我原來的方程式也工作正常,但同樣的警告鎖存問題)。Verilog中的算術方程除以具有時鐘的級別,接收到「鎖存警告」請指教

我想要做的由步驟的簡單方程步驟,其如下所示:

       c = 50/(|a - 2|^2 + |b - 5|^2) 

數據是無符號的二進制32個比特的值,減法結果是也無符號(絕對值),我想要做什麼在使用時鐘幾個步驟執行此,

 |a - 2| ,    // First this subtraction 
     |b - 5| AND |a - 2|^2, // then a subtraction and a square of before 
     |a - 2|^2 + |b - 5|^2 // then the another square plus the before square 
     c = 50/|a - 2|^2 + |b - 5|^2 /// finally a division of 50 

什麼我期待的是,合成工具生成只在1個減法,1磨邊1個司的全過程,在這個簡化版僅情況發生在平方和減法si這裏只有一個師的操作。第一個問題:我真的在做什麼? Quartus II是否生成「數據通路」?硬件/能源正在實際保存?

我是新的verilog和數字設計的一般和教我自己,請糾正我,如果我的觀念是錯誤的。

我已經分別創建了分割,減法和平方的模塊,因爲我計劃稍後實現它們而不是依賴於/, - ,*運算符。原因是因爲我猜測,通過編程更高效的算法(例如,由互聯網上的作者提供),我可以用Quartus II的算子推斷算法來替代。但是我不確定。

該程序正常運行,是預期的輸出,不過,我收到的Quartus-II有很多的警告這樣

警告(10240):Verilog HDL語言總是在FCM_EQ.v構建警告(88 ):推斷變量「SU_in_a」的鎖存器,其通過始終構造在其一個或多個路徑中保存其先前值的鎖存器警告(13012):鎖存器SQ_in_a [18]具有不安全行爲 警告(13013)鎖存器上的端口D和ENA由相同的信號狀態饋送。S2

我幾乎不知道什麼是鎖存器是,我讀了一個必須避免鎖存器,是寄存器保持其值在不同的時鐘?整個程序就是這樣,所以我不知道我該如何解決這個問題。任何建議或替代解決方案?

頂部模塊是這樣的:

module FCM_EQ (a, b, c, clk, enable, rst_n, all_finish, OBS); 

input [31:0] a, b; 
input clk, enable, rst_n; 
output [31:0] c; 
output [63:0] OBS; 
output all_finish; 

reg [31:0] SU_in_a, SU_in_b; 
wire [31:0] SU_out_r; 

reg [31:0] SQ_in_a; 
wire [63:0] SQ_out_r; 

reg [63:0] DIV_in_b; 
reg [63:0] DIV_in_a; 
wire [63:0] DIV_out_r; 

reg [31:00] botA, botB, c; 
reg [63:00] SQ_botA, SQ_botB, N_C;      
reg [63:0] den_total; 

reg all_finish; 
reg [4:0] state, nextstate; 
reg [63:0] OBS; 

parameter FIFTY = 64'b0000000000000000_0000000000110010_0000000000000000_0000000000000000; 
parameter FIVE = 32'b0000000000000101_0000000000000000; 
parameter TWO = 32'b0000000000000010_0000000000000000; 

parameter reset = 0; 
parameter S0 = 1; 
parameter S1 = 2; 
parameter S2 = 3; 
parameter S3 = 4; 

SUB_VAL SU_inst1(.a (SU_in_a),.b (SU_in_b),.r (SU_out_r)); 

SQ_VAL SQ_inst1 (.a (SQ_in_a),.r (SQ_out_r)); 

DIV_VAL DIV_inst1 (.a (DIV_in_a),.b (DIV_in_b),.r (DIV_out_r)); 

always @ (posedge clk or negedge rst_n) 
    if (~rst_n) 
    state <= reset ; 
    else 
    state <= nextstate; 

always @* 
begin 
      case (state)  
reset:    
      begin 
       if (enable == 1) 
        nextstate = S0;     
       else 
        nextstate = reset; 
      end 
S0: 
      begin 
       SU_in_a = a; 
       SU_in_b = TWO;   
       botA = SU_out_r;         
       nextstate = S1; 
      end 
S1: 
      begin 
       SU_in_a = b; 
       SU_in_b = FIVE;   
       botB = SU_out_r;        

       SQ_in_a = botA; 
       SQ_botA = SQ_out_r; 
       nextstate = S2; 
      end 
S2: 
      begin 
       SQ_in_a = botB; 
       SQ_botB = SQ_out_r;  // SQ_botB is 64 bits (32_32) 

       den_total = SQ_botA + SQ_botB; 
       den_total = den_total >> 24;    
       nextstate = S3; 
      end 
S3: 
      begin 
       DIV_in_a = FIFTY;     
       DIV_in_b = den_total;     
       N_C = DIV_out_r;       
       OBS = N_C; 
       c = N_C [31:0];  // Extract 32 bits en total (16_24)     
       all_finish = 1; 
       nextstate = reset; 
      end 

default: 
      begin 
       nextstate = reset; 
      end 
     endcase 
end 
endmodule 

OBS寄存器只是我小白的檢查方法中的ModelSim寄存器的值,因爲我忽略是否有更好的方式來觀看了這一點。

測試平臺和完整的代碼可以在這裏看到

http://www.edaplayground.com/x/RTC

+0

你在哪裏定義初始狀態? – Morgan

+2

@ sujeto1 EDA遊樂場上的代碼似乎並不是不同的代碼。你發佈了正確的網址嗎? –

+0

@MatthewTaylor我糾正了這個鏈接,實際上eda並不想編譯,但Quartus II做到了。如果你能快速瀏覽一下,這將是非常棒的,我可能會在某些事情上做一個noobie錯誤(我自己已經多次檢查了Division模塊)。我現在也試試摩根如此推薦的東西。 – sujeto1

回答

2

不是一個完整的答案只是快速意見:

always @ (posedge clk) 
    state <= nextstate; //Use Non blocking 

    always @* // Auto sensitivity list 
    begin 
    case (state) 

我也建議正在重置您的狀態:

always @ (posedge clk or negedge rst_n) 
    if (~rst_n) 
    state <= 'b0 ; 
    else 
    state <= nextstate; //Non blocking 
+0

嗨,摩根,你知道嗎?如果我在執行自動靈敏度時始終禁用啓用功能,過程將如何啓動?我的意思是,「狀態」由「nextstate」激活,並且每個時鐘都被激活,但是當過程開始時,「nexstate」沒有任何內容。所以我猜測它是必要的一個啓用或開始或這樣的信號。 – sujeto1

+0

除非「rst」是激活後自動從1設置爲0的信號,否則將永遠激活狀態<= b0。 – sujeto1

+1

@ sujeto1你將不得不驅動重置形式的測試設備,但你的正確的是如何重置工作,所以當你打開所有的電子設備處於預定義的狀態,不要以爲它會是0. – Morgan

相關問題