tag 标签: verilog乘法器实现

相关博文
  • 热度 2
    2015-12-2 12:36
    1106 次阅读|
    1 个评论
    一、组合逻辑实现     1、源代码     module mult8(outcome, a, b);   parameter  size =16;   input a,b;   output outcome; /*  reg temp_a, outcome;   reg temp_b;   always@(a or b)   begin     outcome = 0;     temp_a=a;     temp_b=b;     repeat(size)       begin           if(temp_b )             outcome=outcome+temp_a;             temp_a=temp_a1;             temp_b=temp_b1;                  end      end*/      reg outcome;   integer i;   always@(a or b)     begin       outcome = 0;       for(i=1; i = size; i=i+1)       if(b ) outcome=outcome+(a (i-1));           end endmodule    2、测试代码       `timescale 10ns/1ns module mul_tp;   reg a,b;   wire out;   integer i, j;    mult8 m1(out,a,b);    initial     begin      a=0;b=0;      for(i=1;i400;i=i+1)      #10 a=i;      end          initial     begin      for(j=1;j400;j=j+1)      #10 b=j;        end       initial    begin    $monitor($time,,,"%d * %d= %d", a, b, out); end  endmodule      3、modelsim仿真      二、时序逻辑实现乘法器    1、源代码        module mux16( clk,rst_n, start,ain,bin,yout,done );   input clk; //芯片的时钟信号。 input rst_n; //低电平复位、清零信号。定义为0表示芯片复位;定义为1表示复位信号无效。 input start; //芯片使能信号。定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。 input ain; //输入a(被乘数),其数据位宽为16bit. input bin; //输入b(乘数),其数据位宽为16bit. output yout; //乘积输出,其数据位宽为32bit. output done; //芯片输出标志信号。定义为1表示乘法运算完成.   reg areg; //乘数a寄存器 reg breg; //乘数b寄存器 reg yout_r; //乘积寄存器 reg done_r; reg i; //移位次数寄存器     //------------------------------------------------ //数据位控制 always @(posedge clk or negedge rst_n) if(!rst_n) i = 5'd0; else if(start i 5'd17) i = i+1'b1;  else if(!start) i = 5'd0;   //------------------------------------------------ //乘法运算完成标志信号产生 always @(posedge clk or negedge rst_n) if(!rst_n) done_r = 1'b0; else if(i == 5'd16) done_r = 1'b1; //乘法运算完成标志 else if(i == 5'd17) done_r = 1'b0; //标志位撤销   assign done = done_r;   //------------------------------------------------ //专用寄存器进行移位累加运算 always @(posedge clk or negedge rst_n) begin if(!rst_n) begin  areg = 16'h0000; breg = 16'h0000; yout_r = 32'h00000000; end else if(start) begin //启动运算 if(i == 5'd0) begin //锁存乘数、被乘数 areg = ain; breg = bin; end else if(i 5'd0 i 5'd16) begin if(areg ) yout_r = {1'b0,yout +breg,yout_r }; //累加并移位 else yout_r = yout_r1; //移位不累加 end else if(i == 5'd16 areg ) yout_r = yout_r +breg; //累加不移位 end end   assign yout = yout_r;   endmodule     2、测试代码        module vtf_test;   reg clk; //芯片的时钟信号。 reg rst_n; //低电平复位、清零信号。定义为0表示芯片复位;定义为1表示复位信号无效。 reg start; //芯片使能信号。定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。 reg ain; //输入a(被乘数),其数据位宽为16bit. reg bin; //输入b(乘数),其数据位宽为16bit.   wire yout; //乘积输出,其数据位宽为32bit. wire done; //芯片输出标志信号。定义为1表示乘法运算完成.   mux16 uut( .clk(clk), .rst_n(rst_n), .start(start), .ain(ain), .bin(bin), .yout(yout), .done(done) );   initial begin clk = 0; forever  #10 clk = ~clk; //产生50MHz的时钟 end   initial begin rst_n = 1'b0; start = 1'b0; ain = 16'd0; bin = 16'd0; #1000; rst_n = 1'b1; //上电后1us复位信号   #1000; ain = 16'd65535; bin = 16'd32768; #100; start = 1'b1; #4500; start = 1'b0; #1000_000; $stop; end        endmodule     3、modelsim仿真