[FPGA]多周期移位寄存器设计

该博客详细介绍了如何在FPGA中设计一个多周期移位寄存器,包括基础的SIPO(Serial In Parallel Out)移位寄存器模块,以及如何通过添加方向选择功能实现数据的双向移位。作者通过Verilog代码展示了移位寄存器的实现过程,包括D触发器和2选1MUX的使用,最后展示了设计在硬件上的实际效果,能够根据拨码开关状态控制LED灯的亮灭和移位方向。

[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灯的个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值