二进制到RNS(残留数系统)转换器的verilog代码

时间:2015-03-07 18:42:13

标签: verilog fpga system-verilog

我尝试使用查找表将二进制的verilog代码写入RNS转换器。它的概念类似于例如我输入a = 10100100,因此sum8 = 100(最后3位数),sum7 = 2 ^ 2 + 2 ^ 5 + 2 ^ 7,sum5 = 2 ^ 2 + 2 ^ 5 + 2 ^ 7,sum3 = 2 ^ 2 + 2 ^ 5 + 2 ^ 7 .....我们从查找表中找到这些2 ^值。在我的代码中我直接将这两个值分配为(mod3,mod5,mod7)值,但我没有得到sum5,sum3,sum7的正确结果(我得到未定义的输出)....我的代码如下。 有没有其他优化的编写代码的方法?

module spram(,clk,a,dout,mod3,mod5,mod7,bin,sum3,sum5,sum7,sum8
    );
input wire clk;

input [7:0] a;
output  [4:0]sum3;
output  [4:0]sum5;
output  [4:0]sum7;
output reg [2:0]sum8;
 reg [2:0]s30,s31,s32,s33,s34,s35,s36,s37,s38,s39,s50,s51,s52,s53,s54,s55,s56,s57,s58,s59,s70,s71,s72,s73,s74,s75,s76,s77,s78,s79;

parameter ADD_WIDTH = 4;
parameter DATA_WIDTH = 24;
 reg [ADD_WIDTH-1:0] addr;

output reg [DATA_WIDTH-1:0]dout;
output reg [2:0]mod3;
output reg [2:0]mod5;
output reg[2:0]mod7;
output reg [8:0]bin;


always@(addr)
begin
   case(addr)
        4'b0000:
      begin 
          dout<=24'b 000000001001001001;
          mod3<= 3'b 001;
          mod5<= 3'b 010;
          mod7<= 3'b 001;
          bin<= 9'b 000000001 ;
             s30<=mod3;
           s70<=mod7;
           s50<=mod5;
           //sum8<= a[2:0];
       end 
        4'b0001:
      begin
          dout<=24'b 000000010010010010;
            mod3<=3'b 010;
            mod5<=3'b 010;
            mod7<=3'b 010;
            bin<=9'b 000000010;
             s31<=mod3;
           s71<= mod7;
           s51<= mod5;
      end
          4'b0010:
        begin
           dout<=24'b 000000100100100001;
         mod3<=3'b 001;
         mod5<=3'b 100;
         mod7<=3'b 100;
         bin<=9'b 000000100;
            s32<=mod3;
          s72<= mod7;
          s52<= mod5;
      end
        4'b0011:
      begin
        dout<=24'b 000001000001011010;      
          mod3<=3'b 010;
        mod5<=3'b 011;
        mod7<=3'b 001;
        bin<=9'b 00000100;
          s33<=mod3;
         s73<= mod7;
         s53<= mod5;
      end   
        4'b0100:
      begin
        dout<=24'b 000010000010001001;
          mod3<=3'b 001;
          mod5<=3'b 001;
          mod7<=3'b 010;
          bin<=9'b 000010000;
          s34<=mod3;
         s74<=mod7;
         s54<=mod5;
        end
          4'b0101:
        begin
          dout<=24'b 000100000100010010;
        mod3<=3'b 010;
        mod5<=3'b 010;
        mod7<=3'b 100;
        bin<=9'b 000100000;
          s35<=mod3;
         s75<= mod7;
         s55<= mod5;
      end   
        4'b0110:
      begin
        dout<=24'b 000100000100010010;
        mod3<=3'b 010;
        mod5<=3'b 010;
        mod7<=3'b 100;
        bin<=9'b 000100000;
          s36<=mod3;
         s76<=mod7;
         s56<= mod5;
      end
        4'b0111:
        begin
        dout<=24'b 001000000010011010;
          mod3<=3'b 010;
          mod5<=3'b 011;
          mod7<=3'b 010;
          bin<=9'b 001000000;
          s37<=mod3;
         s77<= mod7;
         s57<= mod5;
        end
          4'b1000:
        begin
          dout<=24'b 010000000100001001;
          mod3<=3'b 001;
          mod5<=3'b 001;
          mod7<=3'b 100;
          bin<= 9'b 010000000;
          s38<=mod3;
         s78<= mod7;
         s58<= mod5;
        end
          4'b1001:
        begin
          dout<=24'b 100000000001010010;
          mod3<=3'b 010;
          mod5<=3'b 010;
          mod7<=3'b 001;
          bin<=9'b 100000000;
          s39<=mod3;
         s79<= mod7;
         s59<= mod5;
        end
           default:
         begin
          dout<=24'd0;
          mod3<=3'b000;
          mod5<=3'b000;
          mod7<=3'b000;
          bin<=9'd0;

         end
    endcase 

end 
  assign sum5= s50+s51+s52+s53+s54+s56+s57+s58+s59;
  assign  sum3= s30+s31+s32+s33+s34+s36+s37+s38+s39;
  assign sum7= s70+s71+s72+s73+s74+s76+s77+s78+s79;







 always@(posedge clk)
 begin
 sum8<= a[2:0];
  if (a[0]==1)
    addr<=4'b0000;
 else if (a[1]==1)
     addr<=4'b0001;
  else if (a[2]==1)
     addr<=4'b0010;
    else if (a[3]==1)
       addr<= 4'b0011;
   else if (a[4]==1)
       addr<=4'b0100;
    else if (a[5]==1)
       addr<= 4'b0110;
    else if (a[6]==1)
       addr<= 4'b0111;
     else if (a[7]==1)
       addr<= 4'b1000;

    end




endmodule

0 个答案:

没有答案