【IC设计】移位寄存器

在这里插入图片描述

图片来源:寒武纪魔道电子【移位寄存器是如何工作的,为什么它能把串行信号转成并行】

理论讲解

背景介绍

 早期的硬盘为IDE并行接口,如今的电子设备多以串行接口接收信号,如温度传感器DS18B20为串行总线、采用串行接口AD采样芯片会极大节省CPU的I/O口。那具体的串行数据是如何被读入CPU内部呢?
答案就是通过移位寄存器实现!
在这里插入图片描述

什么是移位寄存器

 移位寄存器是一种时序逻辑电路,能够存储和传输数据。它们由触发器组成,这些触发器的连接方式使得一个触发器的输出可以作为另一个触发器的输入,具体取决于所创建的移位寄存器的类型。移位寄存器基本上是一种能够传输(“移位”)数据的寄存器。寄存器通常是存储设备,它们是通过将特定数量的触发器串联在一起而创建的,并且寄存器可以存储的数据量(位数)始终与触发器的数量成正比,因为每个触发器一次只能存储一个bit。当寄存器中的触发器以这样的方式连接时,一个触发器的输出成为另一个触发器的输入,就会创建一个移位寄存器。
 触发器是具有类似于闩锁操作的设备,被称为双稳态电路,有两个稳定的状态,即0或1,并且能够以bit为单位存储数据。每当D触发器的时钟发生变化时(上升沿或下降沿,取决于触发器的规格)。输出“Q”处的数据与输入“D”处的数据相同。触发器的输出“Q”将保持在该值,直到下一个时钟周期,然后它将再次更改为输入处的值(1或0)。
有关触发器的具体介绍请进入传送门: 【IC设计】时序逻辑的基础—锁存器、触发器

按工作模式分类

移位寄存器主要根据其工作模式(串行或并行)分为几类。下面列出了几种基本移位寄存器,尽管其中一些可以根据数据流的方向进一步划分,右移或者左移。
传送门:[PDF]移位寄存器及其应用 - 中国科学技术大学

  1. 串口输入—串口移位寄存器 (SISO)
  2. 串行输入—并行输出移位寄存器 (SIPO)
  3. 并联输入—并联输出移位寄存器 (PIPO)
  4. 并联输入—串行移位寄存器 (PISO)
  5. 双向移位寄存器
    在这里插入图片描述

verilog语法注意事项

如果在赋值语句中需要左右移位,尽量不要用语法中提供的左移“<<”和右移“>>”符号

因为不同的综合工具对他们的处理方式不同,导致逻辑综合的结果不可控,即使代码通过了功能仿真和FPGA验证,也有可能在ASIC实现时出问题。最稳妥的移位方法要把每位的移动具体写出来.
例如,向右循环移位可写为(a[6:0]<=a[7:1];a[7]<=a[0]),由于这种写法落实到具体的位,所以逻辑综合的结果将不依赖于EDA工具,这样命运就会掌握在自己的手里,不用去关心EDA工具如何处理左右移位。

------ 引用自《CMOS模拟集成电路全流程设计》 李金城 机械工业出版社

设计实例

循环移位寄存器

构建一个100位的左右旋转器,同步load,左右旋转需使能。旋转器从另一端输入移位的位元,不像移位器那样丢弃移位的位元而以零位移位。如果启用,旋转器就会旋转这些位,而不会修改或丢弃它们。

load:加载100位的移位寄存器数据
ena[1:0]:2’b01 右转1bit; 2’b10 左转1bit;其他情况不转
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 == 1'b1)begin
            q <= data;
        end else begin
/*            if(ena == 2'b01)begin
                q <= {
   q[0], q[99:1]};
        	end 
            if(ena == 2'b10)begin
                q <= {
   q[98:0], q[99]};
            end
            if(ena == 2'b00 && ena == 2'b11)begin
                q <= q;                
            end
        end
 */
            case(ena)
            2'b01:   q <= {
   q[0], q[99:1]};
            2'b10:	 q <= {
   q[98:0], q[99]}; 
            default: q <= q;   
            endcase
        end
    end
endmodule

算术双向移位寄存器

  • 4位双向移位寄存器真值表
    在这里插入图片描述

  • 建立一个64位算术移位寄存器,同步加载。移位器可以左右移位,并按数量选择1位或8位的移位。

1、算术右移将移位移位寄存器中数字(在本例中为q[63])的符号位,而不是逻辑右移所做的零。
2、另一种考虑算术右移的方法是它假设被移的数是有符号的并保留符号,所以算术右移可以将一个有符号的数除以2的幂。

load:加载数据
ena:决定是否移位
amount:决定移位方向与数量:2’b00:左移1位;2’b01:左移8位;2’b10:右移1位;2’b11:右移8位
q:寄存器内容(输出)

  • 代码实现
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 == 1'b1)begin
            q <= data;
        end else begin
            if(ena == 1'b1)begin
            	case(amount)
            	2'b00: //shift left by 1 bit
                    q <= {
   q[62:0], 1'b0};
				2'b01: //shift left by 8 bits
                    q <= {
   q[55:0], 8'b0};
				2'b10: //shift right by 1 bit
                	q <= {
   q[63], q[63:1]};                
				2'b11: //shift right by 8 bits
                	q <= {
   {
   8{
   q[63]}}, q[63:8]};                   
            	//default:    
            	endcase
        	end else begin
            	q <= q;
        	end
        end
    end
endmodule
  • 验证结果
    在这里插入图片描述
    在这里插入图片描述

5位线性反馈移位寄存器

线性反馈移位寄存器(LFSR)主要包括:

  • Galois(内部LFSR),又称one-to-many
    在这里插入图片描述
  • 斐波那契(外部LFSR),又称many-to-one
    在这里插入图片描述

1、其中,gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;
2、这里的反馈系数决定了产生随机数的算法的不同。
3、用反馈函数表示成y = a0x^0 + a1x + a2x^2…
4、反馈函数为线性的叫线性移位反馈序列,否则叫非线性反馈移位序列。
5、Q1、Q2、Q3、Qn为LFSR的输出,M(x)是输入的码字多项式,如M(x)=x^4+ x^1+ 1,表示输入端的输入顺序为11001,同样,LFSR的结构也可以表示为多项式G(x),称为生成多项式:G(x) = gn * x^n+ …+g1 * x^1+ g0

练习:
构造线性移位寄存器,reset应当使LFSR归1。
在这里插入图片描述

  • 代码实现
module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 5'h1
    output [4:0] q
); 
    always@(posedge clk)begin
        if(reset == 1'b1)begin
            q <= 5'h1;
        end else begin
            q[4] <= q[0] ^ 1'b0;
            q[3] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值