我的任务是用verilog编写一个16位ALU。当我做需要旋转操作数和进行2的补码加法和减法的部分时,我发现了困难。我知道如何用纸和铅笔解决这个问题,但我无法弄清楚如何在 Verilog 中做到这一点。
例如:
A表示为a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
如果我要旋转 4 位,
答案是
A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 A15 A14 A13 A12
我尝试过串联,但结果是不正确的。
需要大家帮忙...
使用一个变速杆即可进行以下操作:
assign A_out = {A_in,A_in} >> (16-shift[3:0]);
When shift
左边是0A_in
被选中。作为shift
增加左边A_in
向左移动,MSB 向右移动A_in
填写。
如果进行综合,那么您可能需要使用多路复用器,因为动态移位逻辑往往需要更多门。一个16位桶式移位器 http://en.wikipedia.org/wiki/Barrel_shifter将需要 4 级 2 对 1 多路复用器。
wire [15:0] tmp [3:1];
assign tmp[3] = shift[3] ? { A_in[ 7:0], A_in[15: 8]} : A_in;
assign tmp[2] = shift[2] ? {tmp[3][11:0],tmp[3][15:12]} : tmp[3];
assign tmp[1] = shift[1] ? {tmp[2][13:0],tmp[2][15:14]} : tmp[2];
assign A_out = shift[0] ? {tmp[1][14:0],tmp[1][15 ]} : tmp[1];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)