2015-06-27 3 views
-1

Я использую ModelSim для имитации умножения киосков. У меня есть этот код, но это правда, когда b = 5, и когда я даю другие номера для b, результат выглядит следующим образом: = 65563.
Я пробовал как подписанный, так и неподписанный, но результат ложный. Я просто смущен, где проблема.Модифицированный алгоритм умножения кабины

module multiply(p,a,b,clock); 
output [15:0] p; 
input [7:0] a,b; 
input clock; 
reg [15:0] p,ans; 
integer i; 
integer operate; 
initial 
begin 
    p=16'b0; 
    ans=16'b0; 
end 
always @(negedge clock) 
begin 
    p=16'b0; 
    for(i=1;i<=7;i=i+2) 
    begin 
    if(i==1) 
     operate=b[0]-b[1]-b[1]; 
    else 
     operate=b[i-1]-b[i-2]-b[i]-b[i]; 
     case(operate) 
     1: 
     begin 
      ans=a; 
      ans=ans<<(i-1); 
      p=p+ans; 
     end 
     2: 
     begin 
      ans=a<<1; 
      ans=ans<<(i-1); 
      p=p+ans; 
     end 
     -1: 
     begin 
      ans=~a+1; 
      ans=ans<<(i-1); 
      p=p+ans; 
     end 
     -2: 
     begin 
      ans=a<<1; 
      ans=~ans+1; 
      ans=ans<<(i-1); 
      p=p+ans; 
     end 
     endcase 
    end 
    end 
endmodule 
+0

блоков кода отформатирован – Delimitry

ответ

0

Я думаю, что есть проблема с методом - я побежал следующий испытательный стенд на код, который циклически Копание 1-9 как для a и b. Я предлагаю дать ему попробовать:

module tb(); 

    reg clk; 
    reg [7:0]a; 
    reg [7:0]b; 
    wire [15:0] p; 
    integer i,j,k; 

    multiply inst (p,a,b,clk); 

    initial clk = 0; 

    always #5 clk=~clk; 

    initial 
    begin 
    a=0; 
    b=0; 
    for (j=1; j<10; j=j+1) 
     for (k=1; k<10; k=k+1) 
     begin 
     a=j; 
     b=k; 
     #20 $display("%d * %d = %d", a, b, p); 
     end 
    end 
endmodule 

Результаты были следующими:

1 * 1 =  1 
    1 * 2 = 65530 
    1 * 3 = 65531 
    1 * 4 =  4 
    1 * 5 =  5 
    1 * 6 = 65534 
    1 * 7 = 65535 
    1 * 8 = 65512 
    1 * 9 = 65513 
    2 * 1 =  2 
    2 * 2 = 65524 
    2 * 3 = 65526 
    2 * 4 =  8 
    2 * 5 = 10 
    2 * 6 = 65532 
    2 * 7 = 65534 
    2 * 8 = 65488 
    2 * 9 = 65490 
    ... 

Я не уверен, что вы намерены в каждом из case вариантов, но когда operate=-1 или -2, значения неверны. Дважды проверьте свою логику.

Кроме того, operate никогда не может иметь значение 2 (один из ваших case вариантов), и может иметь значение -3 (напр. b=10), которые вы не охвачены.

0

Используйте этот модифицированный и рабочий код и тестовый стенд для оценки модуля.

module MBA_module(p,a,b,clock); 
    output [15:0] p; 
    input [7:0] a, b; 
    input clock; 
    reg [15:0] p,ans; 

    integer i, lookup_tbl; 
    integer operate; 

    initial 
    begin 
     p=16'b0; 
     ans=16'b0; 
    end 

    always @(negedge clock) 
    begin 
     p=16'b0; 
     for(i=1;i<=7;i=i+2) 
     begin 
      if(i==1) 
       lookup_tbl = 0; 
      else 
       lookup_tbl = b[i-2]; 

      lookup_tbl = lookup_tbl + 4*b[i] + 2*b[i-1]; 

      if(lookup_tbl == 0 || lookup_tbl == 7) 
       operate = 0; 
      else if(lookup_tbl == 3 || lookup_tbl == 4) 
       operate = 2; 
      else 
       operate = 1; 
      if(b[i] == 1) 
       operate = -1*operate; 

      case(operate) 
      1: 
       begin 
        ans=a; 
        ans=ans<<(i-1); 
        p=p+ans; 
       end 
      2: 
       begin 
        ans=a<<1; 
        ans=ans<<(i-1); 
        p=p+ans; 
       end 
      -1: 
       begin 
        ans=~a+1; 
        ans=ans<<(i-1); 
        p=p+ans; 
       end 
      -2: 
       begin 
        ans=a<<1; 
        ans=~ans+1; 
        ans=ans<<(i-1); 
        p=p+ans; 
       end 
      endcase 
     end 
    end 
endmodule 

Ниже испытательный стенд

module MBA_mod_tb; 

    // Inputs 
    reg [7:0] a; 
    reg [7:0] b; 
    reg clock; 

    // Outputs 
    wire [15:0] p; 

    // Variables 
    integer j,k; 

    // Instantiate the Unit Under Test (UUT) 
    MBA_module uut (
     .p(p), 
     .a(a), 
     .b(b), 
     .clock(clock) 
    ); 

    initial clock = 0; 
    always #5 clock = ~clock; 

    initial 
    begin 
     a=0; 
     b=0; 
     for (j=1; j<10; j=j+1) 
      for (k=1; k<11; k=k+1) 
       begin 
        a=j; 
        b=k; 
        #20 $display("%d * %d = %d", a, b, p); 
       end 
    end  
endmodule