旋转左 verilog 大小写

Ruk*_*soi -3 verilog rotation shift

我的任务是用 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

我试过串联,但结果是不正确的。需要大家帮忙...

Gre*_*reg 5

以下将使用一个移位器工作:

assign A_out = {A_in,A_in} >> (16-shift[3:0]);
Run Code Online (Sandbox Code Playgroud)

shift为0时,左侧A_in被选择。随着shift增加,左A_in移到左边,右边的 MSBA_in填充。

如果进行综合,那么您可能需要使用多路复用器,因为动态移位逻辑往往需要更多的门。16 位桶形移位器需要 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];
Run Code Online (Sandbox Code Playgroud)