数字电路设计之算数右移的verilog实现

来源:互联网 发布:电视如何解除网络禁用 编辑:程序博客网 时间:2024/06/05 07:59

在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

0 0
原创粉丝点击