首页 > 代码库 > 简单无符号乘法器(怎么总是有疏漏,神啊!必须要level up了!)

简单无符号乘法器(怎么总是有疏漏,神啊!必须要level up了!)

module multiplier(input clk,rst,input [7:0] A,B,output [16:0] C);reg [3:0] cnt;reg [16:0] temp;always@(posedge clk or negedge rst)if(!rst)begincnt<=0;temp<=0;endelse if(cnt==8)cnt<=0;else if(B[cnt])begintemp<=temp+(A<<cnt);cnt<=cnt+1;endelsecnt<=cnt+1;assign C=(cnt==8)?temp:0;endmodule 
乘数8位,积17位
 1 `timescale 1ns/1ns 2 module multiplier_tb; 3 reg [7:0] A,B; 4 reg clk,rst; 5 wire [16:0] C; 6  7 multiplier U( 8 .A(A), 9 .B(B),10 .clk(clk),11 .rst(rst),12 .C(C)13 );14 15 initial16 begin17 rst=0;18 clk=0;19 A=8hfc;20 B=8hcf;21 #5 rst=1;22 end23 always24 #10 clk=~clk;25 26 endmodule 
测试平台

图中在第8个脉冲就输出了乘积,为什么这样呢?由程序可知,temp和cnt在一个进程内被赋值,也即:第8个clk沿到达后,temp和cnt同时完成赋值,一个是得出乘积,一个是cnt=8;又由于assign的即时性,所以在第8个clk,已得出乘积。

要考虑乘数的位权,小学都知道乘法算式要错位的写,现在怎么不知道了!!

简单无符号乘法器(怎么总是有疏漏,神啊!必须要level up了!)