2016-10-02 5 views
0

안녕하세요, 나는 Shift-And-Add 멀티 플라이어를 만들었습니다. 나는 내 출력이 틀린 이유와 항상 85에 혼란스러워합니다. 테스트 벤치에서 뭔가 있습니까? 그건 그렇고.시프트 및 덧셈 배율을위한 Verilog 코드

new1.v

`define M ACC[0] 
module mult4X4 (Clk, St, Mplier, Mcand, Done, Result); 

input Clk,St; 
input [3:0] Mplier, Mcand; 
output Done; 
output [7:0] Result; 

reg [3:0] State; 
reg [8:0] ACC; 

initial 
begin 
    State = 0; 
    ACC = 0; 
end 

always @(posedge Clk) 
begin 
    case (State) 
     0: 
      begin 
       if(St == 1'b1) 
       begin 
        ACC[8:4] <= 5'b00000 ; 
        ACC[3:0] <= Mplier ; 
        State <= 1; 
       end 
      end 
     1,3,5,7 : 
      begin 
       if(`M==1'b1) 
       begin 
        ACC[8:4] <= {1'b0, ACC[7:4]} + Mcand ; 
        State <= State +1; 
       end 
       else 
       begin 
        ACC <= {1'b0, ACC[8:1]}; 
        State <= State + 2; 
       end 
      end 
     2,4,6,8 : 
      begin 
       ACC <= {1'b0, ACC[8:1]}; 
       State <= State +1; 
      end 
     9: 
      begin 
       State <= 0; 
      end 
     endcase 
    end 

    assign Done = (State == 9) ? 1'b1 : 1'b0 ; 
    assign Result = (State == 9) ? ACC[7:0] : 8'b01010101; 
endmodule 

tb_new1.v

module tb_mult4X4; 
    reg Clk,St,nReset; 
    reg [3:0] Mplier; 
    reg [3:0] Mcand; 
    wire Done; 
    wire [7:0] Result; 

    mult4X4 UUT (Clk,St,Mplier,Mcand,Done,Result); 

    initial begin 
     $dumpfile ("mult4X4.vpd"); 
     $dumpvars; 
    end 
    initial 
     Clk = 0; 

    always 
     #5 Clk =~Clk; 
    initial begin 

     nReset = 0; 
     St = 0; 
     Mcand = 4'b1101; 
     Mplier = 4'b1011; 

     #10 
     nReset = 1; 
     St = 1; 
     Mcand = 4'b1111; 
     Mplier = 4'b1001; 

     #10 

     Mcand = 4'b0101; 
     Mplier = 4'b1010; 

     #10 

     Mcand = 4'b1111; 
     Mplier = 4'b1111; 

     #10 
     Mcand = 4'b1101; 
     Mplier = 4'b1010; 

     $finish; 
    end 
endmodule 

많은 시간과 모든 것을 내 FSM을 다음 것으로 보인다 코드 비록 내가 달렸다. 아무도 잘못 된 곳을 지적 할 수 있습니까? 이 하나에 정말 혼동

답변

0

#10 짧은 방법입니다. RTL은 완료하는 데 10 개의 클럭이 필요하지만 매 클럭마다 입력을 변경합니다 (반 클록은 #5 임). 이상인 경우 @(posedge Done);을 사용하십시오 (테스트 벤치가 필요한 클록 수에 관계없이 완료 될 때까지 대기하게 만듭니다).