热度 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仿真