微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于乘法器的累加移位实现

关于乘法器的累加移位实现

时间:10-02 整理:3721RD 点击:
最近在学习Verilog,看的是特权同学的《深入浅出玩转FPGA》, 书中有个例程,关于乘法器设计的,一直没看明白,有没有高手帮忙分析一下。代码如下:
`timescale 1ns/1ps
module mult(clk,rst_n,start,ain,bin,yout,done);
input clk;
input rst_n;
input start;
input[15:0] ain,bin;
output[31:0] yout;
output done;
reg[15:0] areg,breg;
reg[31:0] yout_r;
reg done_r;
reg[4:0] 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  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)
if(!rst_n) begin
yout_r <= 32'h00000000;
areg   <= 16'h0000;
breg   <= 16'h0000;
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[i-1]) yout_r <= {1'b0,yout_r[30:15]+breg,yout_r[14:1]};
else yout_r <= yout_r>>1;
end
else if(i == 5'd16&&areg[15]) yout_r <= yout_r[31:16]+breg;
end
assign yout = yout_r;
endmodul

我对这个乘法器的移位实现没看明白,如红色部分。有看懂的帮忙分析一下啊。
特别是语句yout_r <= {1'b0,yout_r[30:15]+breg,yout_r[14:1]}; 等式右边的长度只有31位,左边是32位,为什么仿真的结果没问题呢?

代码我没仔细看啊,但是两边肯定都是32位的,因为yout_r[30:15]是16位的,breg是16位的加起来是17位了有一位是进位位

verilog里会自动扩展进位吗?如果一个4bit数和一个5bit数相加结果是多少位呢?求教啊

那只是一种算法,,你自己在纸上计算一下两个二进制的数相乘,认真琢磨下那运算过程,就可以理解那段代码了,,
verilog里会自动扩展进位,,一个4bit数和一个5bit数相加结果是6位,,但前提是你把结果赋值给一个大于6位位宽(包括6位)的变量,否则高数会不见。



   多谢解答,学习了.

这个问题问的太空泛了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top