2016-02-11 36 views
0

即時編碼和合成模塊「分頻器」在FPGA中。輸入A,B被認爲產生輸出div,它等於A div B. Ive用測試臺模塊測試了我的代碼,並且它正常工作。但是,當我將它合成到我的fpga中時,代碼的某些部分不能按預期工作。 介紹代碼,然後我會解釋什麼失敗。在Verilog中的數字0-9

module divider(A,B,clk,reset,div,temp); 
input [3:0]A,B; 
input clk,reset; 
output [3:0]div; 
output [3:0]temp; 
reg [3:0]temp,div_result; 
reg [2:0] counter; 
[email protected](A,B) 
begin 
    //temp=4'd0; 
    counter=3'd1; 
end 

always @ (posedge clk or posedge reset) 
if (reset) counter=1; 
else 
begin 
    if (B==4'd1) div_result=A; 
    else if (B==4'd0) div_result=4'b1111; 
    else if (A<B) div_result=0; 
    else if (A==B) div_result=1; 
    else if (A>B) 
     begin 
      temp=A-counter*B; 
      if (temp>=B) counter=counter+3'd1; 
      else begin 
      div_result=counter; 

      end 


     end 




end 
assign div=div_result; 
endmodule 

module test(); 
reg [3:0] A,B; 
reg clk,reset; 
wire [3:0]div; 
wire [2:0] temp; 
divider kappa(A,B,clk,reset,div,temp); 
initial 
begin 
#0 A=4'd8; B=4'd2; clk=0; reset=1; 
#1 reset=0; 
#50 B=4'd1; 
#50 B=4'd3; 
#50 B=4'd4; 
#50 B=4'd5; 
#50 B=4'd8; 
#50 B=4'd9; 
end 
always #5 clk=~clk; 
endmodule 

結果出現,因爲它應該在幾乎所有情況下,除了當在div需要被計數,並且是大於1即7 DIV 7個工作正常,8格5個正常工作,6 DIV 0正常工作但8 div 4不是。既不是9格2等他們都產生輸出0.

我已經創建了很多模塊,工作正常。出於某種原因,儘管我使用clk來計算B可以「適合」到A的次數(因爲A> B,B「適合」至少一次,在A中,所以計數器被設置爲1.如果A-1 * B> = B,它再次合適,所以counter = 2等)。這個邏輯是由clk脈衝產生的。

你能幫我弄清楚這個問題嗎?

+0

我注意到有些東西可能無助,但應該糾正。在'test'模塊中,您將3位寬度'wire [2:0] temp;'傳遞給4位寬度'output [3:0] temp;'在'divider'模塊中。 –

回答

1

我認爲在時鐘塊中使用阻塞語句導致了這個問題。

temp=A-counter*B; 
if (temp>=B) counter=counter+3'd1; 

上面你試圖分配溫度和使用它的權利後,這將在模擬工作正常,但在硬件上不會。首先將所有阻塞轉換爲非阻塞語句,並重新模擬設計以查看它是否仍按預期工作。然後嘗試通過使臨時組合

wire[3:0] temp; 
assign temp = A - (counter * B); 

而且其他然後重置我沒有看到計數器復位改變上述臨時邏輯。

+0

感謝您的回答。我會嘗試你的建議。只要輸入A或B發生變化,計數器就會重置在始終塊上部。 – underhiscanvas

+0

您無法從兩個始終的塊控制計數器,它不會正確合成。但你的模擬器將允許它。 – Morgan

+0

@Morgan Yup。代碼沒有正確合成。我需要改變代碼的邏輯。 – underhiscanvas