【IC设计】移位寄存器

目录

    • 理论讲解
      • 背景介绍
      • 什么是移位寄存器
      • 按工作模式分类
      • verilog语法注意事项
    • 设计实例
      • 循环移位寄存器
      • 算术双向移位寄存器
      • 5位线性反馈移位寄存器
      • 伪随机码发生器
      • 3位线性反馈移位寄存器
      • 32位线性反馈移位寄存器
      • 串行移位寄存器(打4拍)
      • 双向移位寄存器:二选一+移位寄存器
      • 3 输入查找表 (LUT)
    • 参考链接

在这里插入图片描述

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

理论讲解

背景介绍

 早期的硬盘为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] <= q[4];
            q[2] <= q[3] ^ q[0];
            q[1] <= q[2];
            q[0] <= q[1];
        end
    end
endmodule
  • 验证结果
    在这里插入图片描述

伪随机码发生器

在这里插入图片描述
同样,异名例化,用计数器的方法定义时钟
在这里插入图片描述

3位线性反馈移位寄存器

为这个序列电路编写Verilog代码。假设你要在DE1-SoC板上实现这个电路。将R输入连接到SW开关,将时钟连接到密钥[0],将L连接到密钥[1],将Q输出连接到红灯LEDR上。
在这里插入图片描述

注:该电路是线性反馈移位寄存器(LFSR) 的一个示例。最大周期 LFSR 可用于生成伪随机数,因为它在重复之前循环 2 n -1 个组合。全零组合不会出现在此序列中。

  • 代码实现
//方法1:RTL级描述
module top_module (
	input [2:0] SW,      // R
	input [1:0] KEY,     // L and clk
	output reg [2:0] LEDR);  // Q

    wire D0,D1,D2;
    assign D0 = KEY[1] ? SW[0] : LEDR[2];
    assign D1 = KEY[1] ? SW[1] : LEDR[0];
    assign D2 = KEY[1] ? SW[2] : (LEDR[2]^LEDR[1]);
    always@(posedge KEY[0])begin
        LEDR[0] <= D0;
        LEDR[1] <= D1;
        LEDR[2] <= D2;
    end      
endmodule
//方法2:RTL级描述,例化子模块
module top_module (
	input [2:0] SW,      // R
	input [1:0] KEY,     // L and clk
	output [2:0] LEDR);  // Q
    wire w1,w2,w3;
    assign w1 = KEY[1] ? SW[0] : LEDR[2];
    assign w2 = KEY[1] ? SW[1] : LEDR[0];
    assign w3 = KEY[1] ? SW[2] : LEDR[1]^LEDR[2];
    D_flipflop ins0(w1, KEY[0], LEDR[0]);
    D_flipflop ins1(w2, KEY[0], LEDR[1]);
    D_flipflop ins2(w3, KEY[0], LEDR[2]);
endmodule

//构建D触发器模块
module D_flipflop(input D, input clk, output Q);
    always @(posedge clk)
        begin
            Q <= D;
        end
endmodule
//二路选择器很简单,用三目运算符即可
//方法3:行为级描述,用if-else代替多路选择器
module top_module (
	input [2:0] SW,      // R
	input [1:0] KEY,     // L and clk
	output [2:0] LEDR);  // Q

    always@(posedge KEY[0]) begin
        if(KEY[1]) begin
            LEDR[0] <= SW[0]; 
            LEDR[1] <= SW[1];
            LEDR[2] <= SW[2];
        end
        else begin
            LEDR[0] <= LEDR[2]; 
            LEDR[1] <= LEDR[0];
            LEDR[2] <= LEDR[1] ^ LEDR[2]; 
        end
    end

endmodule

32位线性反馈移位寄存器

构建一个32位的Galois LFSR,其taps位置为32、22、2和1。

当移位寄存器位数较多,需要使用向量,而不是一一写出32个DFF

  • 代码实现
module top_module(
    input clk,
    input reset,    // Active-high synchronous reset to 32'h1
    output reg [31:0] q
); 

    integer i;
    always@(posedge clk)begin
        if(reset == 1'b1)begin
            q <= 32'h1;
        end else begin
            for(i=0; i<32; i=i+1)begin
                if(i==21 || i==1 || i==0)begin
                    q[i] <= q[i+1] ^ q[0];
                end else if(i==31)begin
                    q[i] <= 1'b0 ^ q[0];
                end else begin
                    q[i] <= q[i+1];//q[i] <= q[i+1];
                end
            end
        end
    end
endmodule

串行移位寄存器(打4拍)

在这里插入图片描述

  • 代码实现
module top_module (
    input clk,
    input resetn,   // synchronous reset
    input in,
    output out);
	
    reg [2:0] q;
    always@(posedge clk)begin
        if(!resetn)begin
            {q,out} <= 4'd0;
        end else begin
            {q,out} <= {in,q};
        end
    end
  
endmodule

双向移位寄存器:二选一+移位寄存器

在这里插入图片描述

  • 子模块代码设计
module MUXDFF (
    input clk,
    input w, R, E, L,
    output Q
);
    always@(posedge clk)begin
        Q <= L ? R :
             E ? w :
             	 Q ;
    end
endmodule
  • 顶层模块代码设计
module top_module (
    input [3:0] SW,
    input [3:0] KEY,
    output [3:0] LEDR
); 
  //MUXDFF u_n(.clk(KEY[0]), .w(KEY[3]/LEDR[n]), .E(KEY[1]), .R(SW[n]), .L(KEY[2]), .q(LEDR[n]));
    MUXDFF u_3(.clk(KEY[0]), .w(KEY[3] ), .E(KEY[1]), .R(SW[3]), .L(KEY[2]), .q(LEDR[3]));
    MUXDFF u_2(.clk(KEY[0]), .w(LEDR[3]), .E(KEY[1]), .R(SW[2]), .L(KEY[2]), .q(LEDR[2]));
    MUXDFF u_1(.clk(KEY[0]), .w(LEDR[2]), .E(KEY[1]), .R(SW[1]), .L(KEY[2]), .q(LEDR[1]));
    MUXDFF u_0(.clk(KEY[0]), .w(LEDR[1]), .E(KEY[1]), .R(SW[0]), .L(KEY[2]), .q(LEDR[0]));
    
endmodule

3 输入查找表 (LUT)

在这个问题中,你将为一个8x1存储器设计一个电路,在这个电路中,写入到存储器是通过移位来完成的,而读取是“随机访问”,就像在一个典型的RAM中一样。然后您将使用该电路实现一个3输入逻辑功能。

首先,用8个d类型触发器创建一个8位移位寄存器。标记为Q[0]到Q[7]。移位寄存器输入称为S,输入Q[0] (MSB先移位)。使能输入enable控制是否移位,扩展电路使其有3个额外的输入A,B,C和一个输出Z。电路的行为应该如下:当ABC为000时,Z=Q[0],当ABC为001时,Z=Q[1],以此类推。你的电路应该只包含8位移位寄存器和多路选择器。(这个电路称为3输入查找表(LUT))。

module top_module (
    input clk,
    input enable,
    input S,
    input A, B, C,
    output Z ); 
// The final circuit is a shift register attached to a 8-to-1 mux.
    reg [7:0] q;
    
// Create a 8-to-1 mux that chooses one of the bits of q based on the three-bit number {A,B,C}:
    assign Z = q[{A,B,C}];
    
// Edge-triggered always block: This is a standard shift register (named q) with enable.
// When enabled, shift to the left by 1 (discarding q[7] and and shifting in S).
    always@(posedge clk)begin
        if(enable == 1'b1)begin
            q <= {q[6:0], S};
        end else begin
            q <= q;
        end
    end
        
endmodule
  • 验证结果
    在这里插入图片描述

参考链接

  1. HDLBits第十章
  2. 《CMOS模拟集成电路全流程设计》 李金城 机械工业出版社
  3. 移位寄存器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/299087.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java研学-web操作crud

一 思路 1 组件 页面显示&#xff1a;JSP   接受用户请求&#xff1a;Servlet   和数据库交互&#xff1a;MyBatis 2 基础准备 ① 创建 web 项目&#xff0c;导入需要依赖的 jar 包,放入 web/WEB-INF/lib目录中 ② 创建数据库表 CREATE TABLE employee( id bigint(11)…

八大算法排序@归并排序(C语言版本)

目录 归并排序概念算法思想第一步第二步第三步 算法步骤代码实现代码1代码优化 时间复杂度空间复杂度特性总结 归并排序 概念 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治策略的经典排序算法。它的基本思想是将待排序的数组划分成两个子数组&#xff0c;分别对…

响应式布局 Bootstrap

响应式开发 原理&#xff1a;就是根据媒体查询针对不同宽度的设备进行布局和样式的设置&#xff0c;从而适配不同设备的目的。 响应式需要一个父级做为布局容器&#xff0c;来配合子级元素来实现变化效果。 原理&#xff1a;就是在不同屏幕下&#xff0c;通过媒体查询来改变这…

基于Python+Django,开发一款房屋租赁系统

学习文档 学习过程中&#xff0c;遇到问题可以咨询作者 功能介绍 平台采用B/S结构&#xff0c;后端采用主流的PythonDjango进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 前台功能包括&#xff1a;首页、房屋详情页、用户中心模块。…

[java]JAVA中文版API手册 -jdk_api_1.8

有mac和win版本 链接&#xff1a;https://pan.baidu.com/s/14WGXJYBICeSxgg6OxBVGRQ 提取码&#xff1a;c03p

【总线接口】1.以Xilinx开发板为例,直观的认识硬件板卡和接口

初接触硬件&#xff0c;五花八门的总线、接口一定会让你有些疑惑&#xff0c;我尝试用一系列文章来解开你的疑惑 系列文章 【总线接口】1.以Xilinx开发板为例&#xff0c;直观的认识硬件接口 【总线接口】2.学习硬件这些年接触过的硬件接口、总线 大汇总 【总线接口】…

C# Unity将地形(Terrain)导出成obj文件

C# Unity将地形(Terrain)导出成obj文件 从其他地方搬运过来的&#xff0c;只能到出obj模型&#xff0c;不能导出贴图 using System.IO; using System.Text; using UnityEditor; using UnityEngine; using System;enum SaveFormat { Triangles, Quads } enum SaveResolution {…

《计算机科学中的建模技术》复习点

0 考试题型 题型&#xff1a;选择、填空、大题&#xff08;综合题&#xff09; 分值&#xff1a;选择填空30分&#xff0c;综合70分 填空&#xff1a;基本概念题 第 1 章&#xff1a;计算机科学基本问题与数学建模概要 1.1 科学计算的基本概念 科学计算是指利用计算机来完成…

Java二分查找冒泡排序插入排序

二分查找 又叫折半查找&#xff0c;要求待查找的序列有序。每次取中间位置的值与待查关键字比较&#xff0c;如果中间位置的值比待查关键字大&#xff0c;则在前半部分循环这个查找的过程&#xff0c;如果中间位置的值比待查关键字小&#xff0c;则在后半部分循环这个查找的过程…

【占用网络】VoxFormer 基于视觉的3D语义场景方案 CVPR 2023

前言 本文分享“占用网络”方案中&#xff0c;来自CVPR2023的VoxFormer&#xff0c;它基于视觉实现3D语义场景补全。 使用Deformable Attention从图像数据中&#xff0c;预测三维空间中的体素占用情况和类别信息。 VoxFromer是一个两阶段的框架&#xff1a; 第一个阶段&…

TypeScript 从入门到进阶之基础篇(四) symbol类型篇

系列文章目录 TypeScript 从入门到进阶系列 TypeScript 从入门到进阶之基础篇(一) ts基础类型篇TypeScript 从入门到进阶之基础篇(二) ts进阶类型篇TypeScript 从入门到进阶之基础篇(三) 元组类型篇TypeScript 从入门到进阶之基础篇(四) symbol类型篇 持续更新中… 文章目录 …

mysql之视图执行计划

一.视图 1.1视图简介 1.2 创建视图 1.3视图的修改 1.4视图的删除 1.5查看视图 二.连接查询案例 三.思维导图 一.视图 1.1视图简介 虚拟表&#xff0c;和普通表一样使用 MySQL中的视图&#xff08;View&#xff09;是一个虚拟表&#xff0c;其内容由查询定义。与实际表不…

解决 POST http://x.x.x.x:8000/aaa/ net::ERR_CONNECTION_TIMED_OUT

记录一下我遇到的问题和解决办法 我的项目前后端分离&#xff0c;在前端用的vue访问后端时连接不上后端&#xff0c;一切操作都触发不了后端&#xff0c;数据也传不到后端去&#xff1b; 原因&#xff1a;url有问题&#xff0c;url地址写的不是本机&#xff0c;所以导致连接超…

OpenCV的安装和vscode的配置

在图像处理领域&#xff0c;OpenCV的使用是必不可少的&#xff0c;这里介绍一下OpenCV的安装及其在vscode中的配置 1.OpenCV的安装 &#xff08;1&#xff09;安装依赖 sudo apt-get install build-essentialsudo apt-get install cmake git libgtk2.0-dev pkg-config libavc…

vue2中vuex详细使用

1.安装 说明&#xff1a;也就是版本号&#xff0c;一般vue2安装vuex3。 npm i vuex3.6.2 2.搭建架子 执行流程如下&#xff1a; 初始化状态&#xff1a;在state对象中定义了一个名为message的属性&#xff0c;并将其初始值设置为"启动"。 定义变更函数&#xff08…

leetcode 每日一题 2023年12月30日 一周中的第几天

题目 给你一个日期&#xff0c;请你设计一个算法来判断它是对应一周中的哪一天。 输入为三个整数&#xff1a;day、month 和 year&#xff0c;分别表示日、月、年。 您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", &qu…

pytorch集智-2单车预测器

完整代码在个人主页简介链接pytorch路径下可找到 1 单车预测器1.0 1.1 人工神经元 对于sigmoid函数来说&#xff0c;w控制函数曲线的方向&#xff0c;b控制曲线水平方向位移&#xff0c;w控制曲线在y方向的幅度 1.2 多个人工神经元 模型如下 数学上可证&#xff0c;有限神经…

[大厂实践] 无停机迁移大规模关键流量(下)

在系统升级、迁移的过程中&#xff0c;如何验证系统逻辑、性能正确无误&#xff0c;是一个很大的挑战。这一系列介绍了Netflix通过重放流量测试解决这一挑战的实践。原文: Migrating Critical Traffic At Scale with No Downtime — Part 2 想象一下&#xff0c;你被心爱的Netf…

【操作系统xv6】学习记录5--实验1 Lab: Xv6 and Unix utilities

ref:https://pdos.csail.mit.edu/6.828/2020/xv6.html 实验&#xff1a;Lab: Xv6 and Unix utilities 环境搭建 实验环境搭建&#xff1a;https://blog.csdn.net/qq_45512097/article/details/126741793 搭建了1天&#xff0c;大家自求多福吧&#xff0c;哎。~搞环境真是折磨…