verilog语法基础-移位寄存器

概述:

移位寄存器在数字电路设计中广泛被使用,列如SPI通讯中的串行输入并行输出,并行输出串行输出,FIR滤波器中作为数据的延迟链,边沿检测中的数据延迟链等等。本节针对移位寄存器的基本应用场景给出基本的模版,并观测FPGA综合后的结构图。

内容:

1. 一位分立移位寄存器

2. 串行输入,并行输出延迟链

3. 循环移位寄存器

4. 并行输入串行输出延迟链

5. 总线并行延迟链

1. 一位分立移位寄存器

代码

module regtest(
	input clk , // system clock 50Mhz on board
	input rst_n, // system rst, low active 
	input a , 
	output[3:0] y1  // output signal
    );
reg a_dly1 ;
reg a_dly2 ;
reg a_dly3 ;
assign y1={a_dly3,a_dly2,a_dly1,a}; //穿行输入,并行输出
always @ (posedge clk or negedge rst_n ) begin
	if (rst_n == 1'b0) begin 
		a_dly1 <= 1'b0 ;
		a_dly2 <= 1'b0 ;
		a_dly3 <= 1'b0 ;
	end else begin 
		a_dly1 <= a ;
		a_dly2 <= a_dly1 ;
		a_dly3 <= a_dly2 ;
	end
end

endmodule

RTL结构图,移位寄存器的结构通过FDC触发器串联构成。

技术原理图

2. 串行输入并行输出

代码

module regtest(
	input clk , // system clock 50Mhz on board
	input rst_n, // system rst, low active 
	input a , 

	output[3:0] y1  // output signal

 
    );
reg[3:0] abus ;
assign y1=abus; 
always @ (posedge clk or negedge rst_n ) begin
	if (rst_n == 1'b0) begin 
		abus <= 1'b0 ;
	end else begin 
		abus <= {abus[2:0],a} ;
	end
end

endmodule

RTL结构图

技术原理图,总线结构移位寄存器更加简洁,但是实现的电路结构是一样的。

3. 循环移位寄存器

代码

module regtest(
	input clk , // system clock 50Mhz on board
	input rst_n, // system rst, low active 
	input[3:0] a , 

	output[3:0] y1  // output signal

    );
reg[3:0] abus ;
assign y1=abus; 
always @ (posedge clk or negedge rst_n ) begin
	if (rst_n == 1'b0) begin 
		abus <= 1 ;
	end else begin 
		abus <= {abus[2:0],abus[3]} ;
	end
end

endmodule

RTL结构图

技术原理图

4. 并行输入,串行输出

代码

module regtest(
	input clk , // system clock 50Mhz on board
	input rst_n, // system rst, low active 
	input[3:0] a , 
	input load_signal,
	input clock_enable,
	output reg y1  // output signal

    );
reg[3:0] abus ;

always @ (posedge clk or negedge rst_n ) begin
	if (rst_n == 1'b0) begin 
		abus <= 4'b0 ;
	end else if (load_signal) begin 
		abus <= a ;
	end else if (clock_enable) begin 
		abus <= {1'b0,abus[3:1]};
		y1 <=abus[0];
	end
end

endmodule

RTL结构图

技术原理图

5. 总线并行延迟链

代码


module regtest(
	input clk , // system clock 50Mhz on board
	input rst_n, // system rst, low active 
	input[3:0] a , 
	input load_signal,
	input clock_enable,
	output [3:0] y1  // output signal

    );
reg[3:0] abus [5:0];
integer i;
assign y1 = abus[5];
always @ (posedge clk or negedge rst_n ) begin
	if (rst_n == 1'b0) begin 
		for (i=0;i<6;i = i+1)begin 
			abus[i] <= 4'b0;
		end
	end else  begin 
		for (i=1;i<6;i = i+1)begin 
			abus[i] <= abus[i-1];
		end
		abus[0] <= a;
	end
end

endmodule

RTL结构图

技术原理图,总线延迟链中使用了SRL16移位寄存器来实现数据延迟,这是LUT内部的移位寄存器,他可以节省flip_flop的使用。

6. 总结

1. 移位寄存器广泛用于通讯的输入输出端口输出,FIR滤波的延迟,以及随机数生成等场景

2. FPGA内部使用flip_flop触发器来实现移位寄存器

3. 对于大量的移位操作,FPGA可以使用LUT4的SRL16移位寄存器来实现。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA移位寄存器IP核是一种在FPGA开发中常用的IP核,可以方便地实现基于RAM的移位寄存器功能。该IP核具有参数化的抽头,可以在寄存器的特定节点将数据输出。它的接口信号包括移位寄存器数据输入(shiftin)、末端的输出(shiftout)、工作时钟(clock)以及中间固定间隔抽头的输出(taps)。抽头的数据位宽为数据位宽乘以抽头数。 该IP核可以通过Quartus II进行配置和调用,并通过SignalTap II工具进行板级测试和抓取。在SignalTap II中,可以选择创建group来将多个抽头数据组合输出,也可以不创建group直接输出每个抽头的数据。 使用FPGA移位寄存器IP核可以简化移位寄存器的实现,并且可以快速实现较大移位寄存器,同时可以实现不同移位位数的移位寄存器。 另外,根据一些FPGA图像处理的资料,获得3×3图像矩阵的方法也可以使用移位寄存器IP核。除此之外,还可以使用RAM或FIFO实现这一功能。在Vivado开发环境中,移位寄存器只能缓存一行数据,且最多可以缓存1088个数据。因此,在Vivado中推荐使用FIFO或RAM来实现图像数据的缓存。 综上所述,FPGA移位寄存器IP核是一种方便实现移位寄存器功能的IP核,可以通过Quartus II进行配置调用,也可以通过SignalTap II工具进行测试与抓取。它在FPGA开发中具有广泛的应用,并且可以与其他IP核协同工作,实现更复杂的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值