|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
最近在学习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位,为什么仿真的结果没问题呢? |
|