2016-05-31 21 views
0

我正在寫一個verilog代碼,我正在讀取兩個文件,並將這些數字保存到寄存器。然後,我將它們相乘並添加它們。幾乎是一個倍增累加器。然而,我對我所擁有的代碼感到非常沮喪。它從文件中正確讀取數字並將其倍數化,但這是問題所在?當我第一次使用ModelSim運行它時,我重置了所有的東西,所以我可以清除累加器。然後我開始這個程序,但是我的「macc_out」總是有這麼大的延遲,我似乎無法弄清楚爲什麼。這個延遲不應該在那裏,而應該是得到A * B + MAC的結果。即使延遲後,它也沒有得到正確的輸出。我的第二個問題是,如果我從高位復位到低位(啓動程序),然後回到高位復位(重設所有值),他們不會重置!這是令人沮喪的,因爲我已經爲此工作了一個星期,並且不知道/看不到錯誤。我要求額外的一雙眼睛,看看你能否發現我的錯誤。附加是我的代碼與實例和我的ModelSim功能波形。任何幫助表示讚賞!Verilog代碼2錯誤,我找不到:將感謝一雙額外的眼睛,發現我可能忽略了一個錯誤

module FSM(clk,start,reset,done,clock_count); 
    input clk, start, reset; 
    output reg done; 
    output reg[10:0] clock_count; 
    reg [0:0] macc_clear; 
    reg[5:0] Aread, Bread, Cin; 
    wire signed [7:0] a, b; 
    wire signed [18:0] macc_out; 
    reg [3:0] i,j,m; 
    reg add; 
    reg [0:0] go; 
    reg[17:0] c; 
    parameter n = 8; 
    reg[1:0] state; 


    reg [1:0] S0 = 2'b00; 
    reg [1:0] S1 = 2'b01; 
    reg [1:0] S2 = 2'b10; 
    reg [1:0] S3 = 2'b11; 



    ram_A Aout(.clk(clk), .addr(Aread), .q(a)); 
    ram_B Bout(.clk(clk), .addr(Bread), .q(b)); 
    mac macout(.clk(clk), .macc_clear(macc_clear), .A(a), .B(b), .macc_out(macc_out), .add(add)); 
    ram_C C_in(.clk(clk), .addr(Cin), .q(c)); 




    always @(posedge clk) begin 

      if (reset == 1) begin 
       i <= 0; 
       add<=0; 
       j <= 0; 
       m <= 0; 
       clock_count <= 0; 
       go <= 0; 
       macc_clear<=1; 
      end 
      else 
       state<=S0; 


       case(state) 


       S0: begin 
    //    if (reset) begin 
    //     i <= 0; 
    //     add<=0; 
    //     j <= 0; 
    //     m <= 0; 
    //     clock_count <= 0; 
    //     go <= 0; 
    //     macc_clear<=1; 
    //     state <= S0; 
    //    end   
         macc_clear<=1; 
         done<=0; 
         state <= S1; 
         end 

       S1: begin 
        add<=1; 
        macc_clear<=0; 
        clock_count<=clock_count+1; 
        m<=m+1; 
        Aread <= 8*m + i; 
        Bread <= 8*j + m; 
        if (m==7) begin 
         state <= S2; 
         macc_clear<=1; 
         add<=0; 
        end 

        else 
         state <=S1; 

        end 



       S2: begin 
        add<=1; 
        macc_clear<=0; 
        m<=0; 
        i<=i+1; 
        if (i<7) 
         state<=S1; 
        else if (i==8) begin 
         state<=S3; 
         add<=0; 
       end 
       end 



       S3: begin 
        add<=1; 
        i<=0; 
        j<=j+1; 
        if(j<7) 
         state<=S1; 
        else begin 
         state<=S0; 
         done<=1; 
         add<=0; 
       end 
       end 


    endcase 

    end 


    always @ (posedge macc_clear) begin 
     Cin <= 8*j + i; 
     c <= macc_out; 
    end 

    endmodule 



    module mac(clk, macc_clear, A, B, macc_out, add); 

    input clk, macc_clear; 
    input signed [7:0] A, B; 
    input add; 
    output reg signed [18:0] macc_out; 
    reg signed [18:0] MAC; 

    always @(posedge clk) begin 

    if (macc_clear) begin 
    macc_out <= MAC; 
    MAC<=0; 
    end 

else if (add) begin 
    MAC<=(A*B)+ MAC; 
    macc_out<=MAC; 
    end 

end 
endmodule 



module ram_A(clk, addr,q); 
    output reg[7:0] q; 
    input [5:0] addr; 
    input clk; 
    reg [7:0] mem [0:63]; 
    initial begin 
    $readmemb("ram_a_init.txt", mem); 
     end 

    always @(posedge clk) begin 
      q <= mem[addr]; 
    end 
endmodule 



module ram_C(clk,addr, q); 
    input [18:0] q; 
    input [5:0] addr; 
    input clk; 
    reg [18:0] mem [0:63]; 



    always @(posedge clk) begin 
       mem[addr] <= q; 
    end 
endmodule 

ModelSim Functional Simulation Wave Form

回答

0

1)看看你的MACC模塊示意圖 - 我認爲你的一些「問題」將是從明顯;
2)考慮對你的FSM控制信號(如addmacc_clear之類的東西)使用[email protected](*)(組合)塊,而不是[email protected](posedge clk)(順序) - 它使邏輯更容易斷言它們。現在他們已經註冊,所以你有周期延遲。 ;
3)在你的MAC中,你清除了MAC寄存器的復位,但是你不清除macc_out寄存器。

總之,我認爲你需要退後一步,考慮哪些信號是組合邏輯,哪些信號是順序的,需要在寄存器中。

相關問題