【Verilog】移位寄存器总结:移位寄存器、算数移位寄存器、线性反馈移位寄存器(LFSR)

一、移位寄存器

在这里插入图片描述

module top_module(
	input clk,
	input resetn,
	input in,
	output out 
	);
    reg [3:0] q;
	always @(posedge clk) begin
        if (resetn  == 1'b0) begin
			q <= 4'd0;	
		end
		else begin
            q <= {in,q[3:1]};//右移
		end
	end
    assign out = q[0];
endmodule

二、算数移位寄存器

  • 算数左移:和逻辑左移一样。空出来的位用0补;
  • 算数右移:算术移位,也就是包含符号位的移位,对于正数来说,最高位为0,对于负数来说,最高位为1,所以进行算术移位时,如果是左移,那不用管符号位的问题,如果是右移,就要将符号位补在高位。比如:5位数字11000算术右移1为11100,而逻辑右移将产生01100;5位数字01000算术右移1等于00100,而逻辑右移将产生相同的结果,因为原始数字是非负的。
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) begin
		q <= data;
	end
	else if (ena) begin
		case(amount)
			2'b00:q <= q<<1;  //左移一位
			2'b01:q <= q<<8;  //左移八位
			2'b10:begin       //右移一位
				if(q[63] == 0)begin
					q <= q>>1;
				end
				else begin
					q <= {1'b1,q[63:1]};
				end
			end
			2'b11:begin      //右移八位
				if(q[63] == 0)begin
					q <= q >> 8;
				end
				else begin
					q <= {8'b1111_1111,q[63:8]};
				end
			end
		endcase
	end
end
endmodule

三、 线性反馈移位寄存器LFSR(linear feedback shift register )

相关参考文章

LFSR用于产生可重复的伪随机序列PRBS,。如图所示。其中gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;这里的反馈系数决定了产生随机数的算法的不同。

在这里插入图片描述

  • 组成:n级触发器和一些异或门组成。
  • LFSR初始值: 伪随机序列的种子。
  • 抽头: 影响下一个状态的比特位。
  • 含有N个触发器的LFSR电路最多可以产生2的n次方减1个序列。

1、伽罗瓦LFSR(Galois LFSR)

伽罗瓦LFSR是一到多型的LFSR,即最后一个触发器的输出抽头序列对应位置触发器前一级触发器的输出异或逻辑来驱动多个抽头序列对应位置触发器的输入,如下图所示。
在这里插入图片描述

Galois LFSR:其中抽头的位置与输出位异或,以产生其下一个值。如果仔细选择抽头位置,则LFSR可以设置为“最大长度”。n位的最大长度LFSR有2^(n-1)个状态(永远不会达到全零状态)。

  • 例子:构建一个32位Galois LFSR,在32、22、2和1位的位置处使用抽头。
module top_module(
	input clk,
	input reset,
	output reg [31:0]q
	);
	reg [31:0] q_next;
	integer i;
always @(*) begin
	for(i = 0;i<32;i++)begin
		if(i == 0 ||i == 1||i == 21)begin
			q_next[i] <= q[i+1] ^ q[0];
		end
		else if (i == 31) begin
            q_next[i] <= 1'b0 ^ q[0];
		end
		else  begin
			q_next[i] <= q[i+1];
		end
	end
end

always @(posedge clk) begin
	if (reset) begin
		q <= 32'h1;
		
	end
	else begin
		q <= q_next;
	end
end

endmodule

2、斐波那契LFSR

斐波那契LFSR也可以称为多到一型LFSR,即抽头序列对应bit位置的多个触发器的输出通过异或逻辑来驱动一个触发器的输入。如下图所示。
    在这里插入图片描述

Verilog中的移位寄存器是一种常用的数字电路元件,用于在时钟的控制下将数据按照一定的规则进行移位操作。根据需求的不同,移位寄存器可以有多种类型。其中包括左移位寄存器、右移位寄存器、串行输入并行输出移位寄存器和并行输入串行输出移位寄存器等\[2\]。 在Verilog代码中,移位寄存器的设计可以通过参数化来实现。通过定义一个参数MSB来表示移位寄存器的宽度,可以根据不同的参数值来创建不同位数的移位寄存器。例如,如果MSB为4,则创建的是4位移位寄存器;如果MSB为8,则创建的是8位移位寄存器\[3\]。 移位寄存器具有一些关键功能。可以通过驱动设计的en信号来启用或禁用驱动dir时可左右移动。当将rstn信号拉低时,移位寄存器会被重置,输出将变为0。移位寄存器的输入数据值可以通过d引脚进行控制,实现数据的输入和移位操作\[3\]。 因此,Verilog中的移位寄存器是一种非常有用的数字电路元件,可以根据需要进行参数化设计,实现不同位数和功能的移位操作。 #### 引用[.reference_title] - *1* [Verilog时序逻辑硬件建模设计(四)移位寄存器](https://blog.csdn.net/Pieces_thinking/article/details/123220303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Verilog设计实例(6)基于Verilog的各种移位寄存器实现](https://blog.csdn.net/Reborn_Lee/article/details/106596497)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值