[FPGA]多周期移位寄存器设计
设计目标
设计一个多周期移位寄存器,并实现将一个拨码开关的状态值移位输入到寄存器并顺序移位,再将寄存器的每个比特送至一个LED灯上显示。
之后为移位寄存器添加方向选择功能。
基础设计
移位寄存器模块设计
module shift_reg_SIPO(
RST , // 异步复位, 高有效
CLK , // 时钟,上升沿有效
EN , // 输入数据串行移位使能
IN , // 输入串行数据
OUT ); // 并行输出数据
parameter SHLEN = 6;
input RST, CLK, EN;
input IN;
output[SHLEN-1:0] OUT;
reg [SHLEN-1:0] shift_R;
assign OUT[SHLEN-1:0] = shift_R[SHLEN-1:0];
// 时序逻辑 根据输入使能进行串行移位
// shift_R 会被编译为D触发器
always @ (posedge CLK or posedge RST) begin
if(RST)
shift_R[SHLEN-1:0] <= 0;
else
if(EN) begin // 串行移位的使能有效
shift_R[SHLEN-1:1] <= shift_R[SHLEN-2:0];
shift_R[0] <= IN;
end
else begin // 使能无效保持不动
shift_R[SHLEN-1:0] <= shift_R[SHLEN-1:0];
end
end // always
endmodule
RTL视图:

默认是将相同的模块组合的,先左键选择D触发器,然后右键选择Ungroup,可以清晰地看到移位寄存器内部的结构关系。

驱动部分
基础的时间基准电路即可。
顶层设计

将各个模块和输入输出端口连接,配置管脚。
最后上板子。
实现效果
程序会将SW0的状态输入LED0,然后进行移位。更改SW0的状态可以更改输入LED0的数据,从而实现灯的亮灭控制。
添加方向选择功能
移位寄存器模块修改
添加方向选择功能只需要在移位寄存器的Verilog里对移位的部分进行修改即可,即对使能部分添加如下方向选择的功能。
if(EN) begin // 串行移位的使能有效
if(DIR)begin
shift_R[SHLEN-2:0] <= shift_R[SHLEN-1:1];
shift_R[SHLEN-1] <= IN;
end
else begin
shift_R[SHLEN-1:1] <= shift_R[SHLEN-2:0];
shift_R[0] <= IN;
end
end
else begin // 使能无效保持不动
shift_R[SHLEN-1:0] <= shift_R[SHLEN-1:0];
end
完整的移位寄存器模块代码:
module shift_reg_SIPO(
RST , // 异步复位, 高有效
CLK , // 时钟,上升沿有效
EN , // 输入数据串行移位使能
DIR , // direction
IN , // 输入串行数据
OUT ); // 并行输出数据
parameter SHLEN = 10;
input RST, CLK, EN, DIR;
input IN;
output[SHLEN-1:0] OUT;
reg [SHLEN-1:0] shift_R;
assign OUT[SHLEN-1:0] = shift_R[SHLEN-1:0];
// 时序逻辑 根据输入使能进行串行移位
// shift_R 会被编译为D触发器
always @ (posedge CLK or posedge RST) begin
if(RST)
shift_R[SHLEN-1:0] <= 0;
else
if(EN) begin // 串行移位的使能有效
if(DIR)begin
shift_R[SHLEN-2:0] <= shift_R[SHLEN-1:1];
shift_R[SHLEN-1] <= IN;
end
else begin
shift_R[SHLEN-1:1] <= shift_R[SHLEN-2:0];
shift_R[0] <= IN;
end
end
else begin // 使能无效保持不动
shift_R[SHLEN-1:0] <= shift_R[SHLEN-1:0];
end
end // always
endmodule
RTL视图:

可以看到是在每一级D触发器的输入前加入了2选1的mux,以此来控制移位的方向。
实现效果
SW0的效果和功能和修改前一样。
为SW1添加了方向选择的功能。当SW1断开时,移位的效果和修改前一样,从右往左移动。如果把SW1闭合,那么方向发生改变,将会从左往右移动,并将SW0的状态输入LED5。
可以通过在顶层设计中更改shift_reg_SIPO的参数来更改参与移位寄存的LED灯的个数。
该博客详细介绍了如何在FPGA中设计一个多周期移位寄存器,包括基础的SIPO(Serial In Parallel Out)移位寄存器模块,以及如何通过添加方向选择功能实现数据的双向移位。作者通过Verilog代码展示了移位寄存器的实现过程,包括D触发器和2选1MUX的使用,最后展示了设计在硬件上的实际效果,能够根据拨码开关状态控制LED灯的亮灭和移位方向。

被折叠的 条评论
为什么被折叠?



