4-bit shift register
题目:设计一个4-bit移位寄存器(右移),采用异步复位,同步load,enable模式。
(1)复位后,移位寄存器输出0;
(2)load为高电平,将data[3:0]数据load进移位寄存器;
(3)ena为高电平,移位寄存器右移一位;
(4)q作为移位寄存器的输出;
如果load和ena信号同时有效,load信号优先级较高。
module top_module(
input clk,
input areset, // async active-high reset to zero
input load,
input ena,
input [3:0] data,
output [3:0] q);
reg [3:0] q_temp;
always@(posedge clk or posedge areset)begin
if(areset)
q_temp <= 4'd0;
else if(load)
q_temp <= data;
else if(ena)
q_temp <= (q_temp >> 1);
else
q_temp <= q_temp;
end
assign q = q_temp;
endmodule
Rotate 100
题目:设计一个带有同步load和左右使能enable的100-bit的左右旋转器。旋转器从寄存器的另一端插入已移出的位,不像移位器丢弃已移出的位而插入一个零。如果启用,旋转器会旋转这些位并且不会修改/丢弃它们。
(1)laod:加载data[99:0]到移位寄存器中;
(2)ena[1:0]选择旋转的方向:2’b01向右旋转一个bit;2’b10向左旋转一个bit;2’b00,2’b11不旋转
(3)q作为旋转器的输出
module top_module(
input clk,
input load,
input [1:0] ena,
input [99:0] data,
output reg [99:0] q);
always@(posedge clk)begin
if(load)
q <= data;
else begin
case(ena)
2'b00: q <= q;
2'b01: q <= {
q[0],q[99:1]};
2'b10: q <= {
q[98:0],q[99]};
2'b11: q <= q;
endcase
end
end
endmodule
注意移位的方法,q>>1表示将q中的最低位移除,在最高位补0;而q <= {q[0],q[99:1]}表示将q的最低位直接移到q的最高位。
Left/right arithmetic shift by 1 or 8
题目:设计一个带有同步load功能的64bit的算数移位寄存器。既可以左移又可以右移,通过amount信号选择移位的位数。算术右移在移位寄存器(在本例中是q[63])中移动数字的符号位,而不是像逻辑右移那样移动零。算术右移的另一种思考方式是假设被移动的数有符号并且保留符号,因此算术右移可以将有符号的数除以2的幂。
逻辑左移和算数左移没有区别。
(1)load为高电平将data[63:0]加载到移位寄存器中;
(2)ena选择是否移位操作;
(3)amount移位方向及移位多少位;
2’b00: shift left by 1 bit.
2’b01: shift left by 8 bits.
2’b10: shift right by 1 bit.
2’b11: shift right by 8 bits.
module top_module(
input clk,
input load,
input ena,
input [1:0] amount,
input [63:0] data,
output reg [63:0] q);
always@(posedge clk)begin
if(load)
q <= data;
else if(ena)begin
case(amount)
2'b00: q <= q << 1;
2'b01: q <= q << 8;
2'b10: q