在verilog语言中,本来>>>就是算数右移的符号,可是在实际仿真的时候我发现效果还是和逻辑右移的效果一样。后来我觉得应该可以自己写一个算了。
方法一:暴力case
case(shift) //shift是要移位的数目
1:
result <= {result[15],result[15:1]}; //假设result是15位的数据
2:
result <={{2{result[15]}},result[15:2]};
......
default:
result <= {16{result[15]}};
endcase
方法二:循环法(后来我发现不可行,不支持非常数)
integer i;//i要在外面定义,不过一般不要用循环,循环是仿真的时候常用的,综合的时候不要用
for( i=0;i < shift;i=i+1)
begin
result <= {result[15],result[15:1]};
end
我写的一个M0 CPU就是使用这种方法进行算数右移的。这里需要注意的是括号:
case(reg_A)//假设数据16位
0: ALUo <= reg_B;
1: ALUo <= {reg_B[15],reg_[15:1]};
2: ALUo <= {{2{reg_B[15]}},reg_B[15:2]};
3: ALUo <= {{3{reg_B[15]}},reg_B[15:3]};
4: ALUo <= {{4{reg_B[15]}},reg_B[15:4]};
5: ALUo <= {{5{reg_B[15]}},reg_B[15:5]};
6: ALUo <= {{6{reg_B[15]}},reg_B[15:6]};
7: ALUo <= {{7{reg_B[15]}},reg_B[15:7]};
8: ALUo <= {{8{reg_B[15]}},reg_B[15:8]};
9: ALUo <= {{9{reg_B[15]}},reg_B[15:9]};
10: ALUo <= {{10{reg_B[15]}},reg_B[15:10]};
11: ALUo <= {{11{reg_B[15]}},reg_B[15:11]};
12: ALUo <= {{12{reg_B[15]}},reg_B[15:12]};
13: ALUo <= {{13{reg_B[15]}},reg_B[15:13]};
14: ALUo <= {{14{reg_B[15]}},reg_B[15:14]};
default:
ALUo <= {16{reg_B[15]}};
endcase
---------------------
作者:Snail_Walker
来源:CSDN
原文:https://blog.csdn.net/c602273091/article/details/38367385
版权声明:本文为博主原创文章,转载请附上博文链接!