2013-03-22 148 views
0

我想根據設計編寫乘數。它由兩個16位輸入組成,單個加法器用於計算部分乘積。一個輸入的LSB與另一個輸入的16位進行AND操作,AND門的輸出重複地加到前一個輸出。它的Verilog代碼如下,但我似乎無法使輸出正常工作。Verilog中的邏輯問題

module datapath(output reg [31:15]p_high, 
       output reg [14:0]p_low, 
       input [15:0]x, y, 
       input clk); // reset, start, x_ce, y_ce, y_load_en, p_reset, 
       //output done); 

reg [15:0]q0; 
reg [15:0]q1; 
reg [15:0]and_output; 
reg [16:0]sum, prev_sum; 
reg d_in; 
reg [3:0] count_er; 

initial 
begin 
     count_er <= 0; 
     sum <= 17'b0; 
     prev_sum <= 17'b0; 
end 

[email protected](posedge clk) 
begin 
     q0 <= y; 
     q1 <= x; 
     and_output <= q0[count_er] & q1; 
     sum <= and_output + prev_sum;  
     prev_sum <= sum; 
     p_high <= sum; 
     d_in <= p_high[15]; 
     p_low[14] <= d_in; 
     p_low <= p_low >> 1; 
     count_er <= count_er + 1; 
end 
endmodule 

enter image description here 我創建了一個測試平臺,測試電路和我看到的第一個問題是,我希望它與操作不起作用。 x操作數的16位與y操作數的LSB進行和操作。 y操作數在每個時鐘週期後移位一位,並通過連續添加部分乘積來計算最終產品。

但是,我從sum和prev_sum行開始出現問題,它們的輸出顯示爲xxxxxxxxxxxx。

+1

* 「具有獲取輸出工作的煩惱」 *。你可以請更具體嗎?如果我們首先了解發生了什麼問題,那麼更容易進行調試。 – Tim 2013-03-22 23:47:08

+0

我添加了更多內容。 – GamingX 2013-03-23 01:17:35

回答

1

你似乎沒有被正確重置,你需要的所有信號,或者你似乎混淆了非阻塞任務的工作方式。

後初始開始:

  • sum是0
  • prev_sum是0
  • and_output被X

第一上升沿之後:

  • sum是X,因爲and_output是X和X + 0返回X.此時總和保持X永遠,因爲X +的東西始終是X.

你正在創建一個寄存器,在幾乎每一個信號的設計,這意味着你的信號沒有立即更新。你需要區分你想註冊的信號和只是組合術語的信號。用posedge clock上的非阻塞語句更新寄存器,並通過將組合條件置於always @*塊中立即更新組合條件。

我不知道你正在嘗試使用的算法,所以我不能說哪一行應該是哪一行,但我真的懷疑你打算讓x/y花費一個時鐘週期傳播到q0/q1q的另一個週期傳播到and_output,又一個時鐘週期傳播從and_output總結。


評論上更新的代碼:

  • 合流塊應該使用阻塞賦值,非阻塞不分配。在always @ *塊內使用=而不是<=
  • sum <= and_output + sum;看起來不對,應該是sum = and_output + p_high[31:16]根據你的圖片。
  • 您在此處分配兩次p_low [14]。讓第二條語句明確設定位[13:0]只:

    p_low[14] <= d_in; 
    p_low[13:0] <= p_low >> 1; 
    
+0

我已經更新了代碼,但不知道評論是否能夠保存修改後的代碼。我還粘貼了我試圖實現的電路鏈接。更新的代碼:http://pastebin.com/NSaayfHG,設計:https://dl.dropbox.com/u/793037/2013-03-22_2236.png – GamingX 2013-03-23 03:39:03

+0

@GamingX - 我編輯了一些關於你的新代碼的額外評論希望這會讓你開始。如果您仍然有問題,請嘗試跟蹤模擬器中的信號以查看問題所在。 – Tim 2013-03-23 04:00:20

+0

我不認爲您所做的更改已保存。一旦你做出改變,它可能會創建一個新的鏈接。 – GamingX 2013-03-23 04:13:48

0

你是混合在同一順序always塊,這可能會導致意想不到的結果阻塞和非阻塞賦值:

d_in <= p_high[15]; 
p_low[14] = d_in; 
+0

我修改了它,但沒有正面結果,但感謝您指出。 – GamingX 2013-03-23 01:18:15