一、算术左移、逻辑左移、算术右移、逻辑右移有什么不同?
1.算数左移&算术右移
算数左移和算数右移均是右边补0
2.逻辑右移
算数右移将二进制数整体右移,左边补0即可
3.算数右移
算数右移要将符号位一起移动,并在移动时左边补上符号位
二、一些右移移位寄存器的实现
module Shifter
( input Dsi,
input CLK,
output reg [0:3] Q);
always@(posedeg clk)
Q[0:3]<={ Dsi,Q[0:2]};
endmodule //方法一
module Shifter
( input Dsi,
input CLK,
output reg [3:0] Q);
always@(posedeg clk)
begin
Q[3]<= Dsi;
Q[2]<=Q[3];
Q[1]<=Q[2];
Q[0]<=Q[1];
end
endmodule //方法二
三、本实验流水灯设计要求
根据设计要求,并行装载是将输入端数据装入到移位寄存器,并行装载的时钟全能信号是iLoad。右移的时钟使能信号是iEnable。
本实验设计的流水灯移位寄存器是将移位寄存器内部保存的数据移位。
在时钟上升沿到来时,如果并行装载和右移的控制信号同时有效,该流水灯的功能是并行载入。
四、实验代码
( //信号列表
input wire Clk,
input wire reset,
input wire iLoad,
input wire iEnable,
input wire idata,
input wire [n-1:0] id,
output reg [n-1:0] q
);
always @(posedge reset or posedge clk )
begin
if (reset)
q <= 0;
else if(iLoad)
q[n-1:0]<=id[n-1:0];
else if(iEnable)
q[n-1:0]<={idata, id[n-1:1]};
else
q[n-1:0] <=id[n-1:0];
end
实例化代码
RightShifter # (n) RS0(.Clk(xxx1),.reset(xxx2),.iLoad(xxx3),.iEnable(xxx4),.idata(xxx5),.id(xxxx6),.q(xxx7));