本帖最后由 xiaopinglove 于 2013-4-28 12:07 编辑
//------------------------------------------------
//专用寄存器进行移位累加运算
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[i-1]) yout_r = {1'b0,yout[30:15]+breg,yout_r[14:1]}; //累加并移位
else yout_r <= yout_r>>1; //移位不累加
end
else if(i == 5'd16 && areg[15]) yout_r[31:16] <= yout_r[31:16]+breg; //累加不移位
end
end
最近学习视频的时候在做这个实验的时候,虽然有视频讲解,但是还是没能明白这个乘法器所实现的关键操作,关键就是这一部分
else if(i > 5'd0 && i < 5'd16) begin
if(areg[i-1]) yout_r = {1'b0,yout[30:15]+breg,yout_r[14:1]}; //累加并移位 //为什么把数都累加到中间的17位呢?
else yout_r <= yout_r>>1; //移位不累加 //为何又是右移呢?
end
else if(i == 5'd16 && areg[15]) yout_r[31:16] <= yout_r[31:16]+breg; //累加不移位
还是没有理解到,能不能麻烦特权大哥空闲的时候能够给予解惑啊!?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
这个地方是这个意思
1,你想i ==1 的时候第一次加法,那个加数最后一位后面是不是有14 个0呢?这个很容易看懂吧。当i==2的时候呢,第一次加进去的那个数最后一位后面是不是只剩下了13个0呢?。。。。。。。。。。。到了i==15的时候第一次加进去的那个数最后一位是不是抵达了最后一个bit。呵呵,所以特权说了他是先加再移位,我们只是想着先移位再加。所以理解不了。
2,最后一个bit不能再移位了,i==15的时候第一个加数到了最后一个bit 了。这i==16的时候就是我们蠢人能看懂的思维方式加进去的。
一周热门 更多>