FPGA原理与结构(5)——移位寄存器(Shift Registers)

这篇具有很好参考价值的文章主要介绍了FPGA原理与结构(5)——移位寄存器(Shift Registers)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录:FPGA原理与结构(0)——目录与传送门

目录

一、移位寄存器概述

1、基本概念     

2、LUT实现移位寄存器

3、移位寄存器的应用

4、移位寄存器的功能

5、移位寄存器结构

6、移位寄存器级连

二、移位寄存器数据流

1、动态读操作(移位长度不固定)

2、静态读操作(移位长度固定)

三、移位寄存器例化

1、原语例化

2、vivado推断

2.1采用命令

2.2推断

一、移位寄存器概述

1、基本概念     

        在数字电路中,用于存放二进制数据或代码的电路称为寄存器。寄存器是由具有存储功能的触发器组合起来构成的。一个触发器可以存储一位二进制数据,N个触发器构成的寄存器就可以存放N位二进制数据。根据寄存器的功能,可以分成:基本寄存器和移位寄存器。

        移位寄存器中的数据可以在移位脉冲(时钟信号)作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,串行输入、并行输出,十分灵活,用途也很广,通常用于数据存储、数据移动和数据操作等。

2、LUT实现移位寄存器

        FPGA实现逻辑功能的重要元素是CLB,一个CLB中有2个SLICE,SLICE根据功能和结构的不同,可以分成SLICEM和SLICEL,SLICEM因为其可读可写的特性,可以实现DRAM或移位寄存器。

        SLICEM可以在不使用触发器的情况下就实现32位的移位寄存器。在这种情况下,每个LUT可以将串行的数据延时1-32个时钟周期。移位输入D(LUT DI1引脚)和移位输出Q31(LUT MC31引脚)可以进行级联,以形成更大的移位寄存器。一个SLICEM的4个LUT6级联可以实现128个时钟周期的延时。多个SLICEM也可以进行组合。但SLICEM之间没有直接连接来构成更长的移位寄存器,在LUT B/C/D处的MC31输出也没有。由此产生的可编程延迟可用于平衡数据pipeline的时间。

3、移位寄存器的应用

        (1)延迟或延迟补偿

        (2)同步FIFO和内容可寻址内存(CAM)

4、移位寄存器的功能

        (1)写操作:带有写使能(WE)的,与时钟(CLK)同步的同步写

        (2)通过Q31的固定的读操作

        (3)动态读取访问

                通过A[4:0]5位地址总线访问

                通过改变地址,任何32位都可以异步读出(在O6 LUT输出处,对应在原语上的Q)    

                此功能对于创建较小的移位寄存器(小于32位)非常有用。

                可以使用一个存储元件或触发器来实现同步读

        (4)移位寄存器不支持复位/置位

5、移位寄存器结构

        下图是一个由LUT构成的32位移位寄存器的结构

fpga 移位寄存器,FPGA原理与结构,fpga开发,fpga,硬件架构

        其内部结构如下

fpga 移位寄存器,FPGA原理与结构,fpga开发,fpga,硬件架构

        这就是通过LUT实现的移位寄存器的一种形式SRLC32E ,还有一种SRL16E这里不做展开,感兴趣的可以自行查阅《ug953-vivado-7series-libraries》。

        对于SRLC32E这个移位寄存器来说,输入A4、A3、A2、A1和A0决定了移位寄存器的深度,这个深度可以是固定的,也可以是动态可调的。计算公式如下:Depth = (16 x A4) + (8 x A3) + (4 x A2) + (2 x A1) + A0 + 1。主要需要注意最后需要加1。

        端口介绍:

fpga 移位寄存器,FPGA原理与结构,fpga开发,fpga,硬件架构

官方给出的verilog原语描述:

// SRLC32E: 32-bit variable length cascadable shift register LUT (Mapped to a SliceM LUT6)
// with clock enable
// 7 Series
// Xilinx HDL Language Template, version 2019.1
SRLC32E #(
 .INIT(32'h00000000) // Initial Value of Shift Register
) SRLC32E_inst (
 .Q(Q), // SRL data output
 .Q31(Q31), // SRL cascade output pin
 .A(A), // 5-bit shift depth select input
 .CE(CE), // Clock enable input
 .CLK(CLK), // Clock input
 .D(D) // SRL data input
);
// End of SRLC32E_inst instantiation

6、移位寄存器级连

        如前所述,MC31输出和移位寄存器之间的专用连接允许将一个移位寄存器的最后一位连接到下一个寄存器的第一位,而不使用LUT O6输出。移位寄存器链和F7AMUX、F7BMUX和F8MUX多路复用器允许一个128位移位寄存器的可寻址访问实现。

        (1)64位移位寄存器实现:

fpga 移位寄存器,FPGA原理与结构,fpga开发,fpga,硬件架构

        (2) 96位移位寄存器实现

fpga 移位寄存器,FPGA原理与结构,fpga开发,fpga,硬件架构

        (3)128位移位寄存器实现:

fpga 移位寄存器,FPGA原理与结构,fpga开发,fpga,硬件架构

         理论上我们当然可以使用多个slice来实现一个大于128深度的移位寄存器,但是在slice之间没有直接的连接来帮助我们实现这样的功能。

二、移位寄存器数据流

1、动态读操作(移位长度不固定)

        (1)输出Q由5位地址决定

        (2)每当一个新地址到达时,在经过访问LUT的时间延迟后,输出Q变化

        (3)读操作是异步的,独立于时钟和时钟使能信号

2、静态读操作(移位长度固定)

        (1)当5位地址固定时(地址固定意味着移位长度固定),输出Q使用相同的比特位

        (2)该模式在一个LUT中实现了从1到32位的任何移位寄存器长度

        (3)移位寄存器长度为(N + 1),其中N为输入地址(0-31)

        (4)输出Q与每一次的移位操作是同步的

        (5)前一位被移到下一个位置,并出现在Q输出上

三、移位寄存器例化

1、原语例化

        之前的内容中已经给出了原语的案例,这里就不进一步展开了,一般在编写HDL代码的时候,除了极个别的特殊情况,我们不推荐使用原语编写。

2、vivado推断

        这里首先要注意的是,移位寄存器是不支持复位和置位的,所以我们的设计中要尽量避免复位和置位,防止vivado推断出现错误。

2.1采用命令

        这里我们可以采用的方式有使用命令 

        (srl_style = “ ”)
        可选择的属性有:
                (1)register:用FF生成SRL
                (2)srl:用LUT生成SRL
                (3)srl_reg:用LUT和FF生成SRL,最后一级深度用FF
                (4)reg_srl:第一级深度用FF,其他用LUT
                (5)reg_srl_reg:第一和最后级深度用FF,其他用LUT
                (6)block:用BRAM生成SRL

        也可以使用命令

        ( shreg_extract = “ ”) 

        可选的属性有:

                (1)yes:使用上述的移位寄存器结构

                (2)no:不使用上述移位寄存器结构

        注意:srl_style命令只能用于静态读取操作!当两者同时出现时,shreg_extract的优先级更高。

//使用寄存器实现移位寄存器
(* srl_style = "register" *) reg [16:0] my_srl;

//使用SRL实现移位寄存器
(* srl_style = "srl" *) reg [16:0] my_srl;

//使用寄存器实现移位寄存器
(* shreg_extract = "no" *) reg [16:0] my_srl;

//使用SRL实现移位寄存器
(* shreg_extract = "yes" *) reg [16:0] my_srl;

2.2推断

        通过设计符合规范的HDL代码,由EDA自行完成推断,综合使用移位寄存器

        这里给出xilinx提供的代码示例:

        (1)32位移位寄存器verilog代码:

// 8-bit Shift Register
// Rising edge clock
// Active high clock enable
// Concatenation-based template
//
// File: HDL_Coding_Techniques/shift_registers/shift_registers-0.v
module v_shift_registers_0 (clk, clken, SI, SO);
    parameter WIDTH = 32; 

    input clk, clken, SI; 

    output SO;

    reg[WIDTH-1:0] shreg;

    always @(posedge clk)begin
        if (clken)
            shreg = {shreg[WIDTH-2:0], SI};
    end
    
    assign SO = shreg[WIDTH-1];
endmodule

        (2)32位动态移位寄存器verilog代码:文章来源地址https://www.toymoban.com/news/detail-714091.html

// 32-bit dynamic shift register.
// Download: 
// File: HDL_Coding_Techniques/dynamic_shift_registers/dynamic_shift_registers_1.v
module dynamic_shift_register (CLK, CE, SEL, SI, DO);
    parameter SELWIDTH = 5;

    input CLK, CE, SI;
    input[SELWIDTH-1:0] SEL;

    output DO;

    localparam DATAWIDTH = 2**SELWIDTH;

    reg [DATAWIDTH-1:0] data;

    assign DO = data[SEL];
    
    always @(posedge CLK)begin
        if (CE == 1'b1)
            data <= {data[DATAWIDTH-2:0], SI};
    end 
endmodule

到了这里,关于FPGA原理与结构(5)——移位寄存器(Shift Registers)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • m基于FPGA的桶形移位寄存器verilog实现,包含testbench

    目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1、桶形移位寄存器的基本原理 2.2、桶形移位寄存器的数学模型 2.3、桶形移位寄存器的实现步骤 3.Verilog核心程序 4.完整算法代码文件 本系统进行了两个平台的开发,分别是: Vivado2019.2 Quartusii18.0+ModelSim-Altera 6.6d  Starter Edition 其

    2024年02月04日
    浏览(45)
  • 【Verilog编程】线性反馈移位寄存器(LFSR)原理及Verilog代码实现

    移位寄存器 :指若干个寄存器排成一列,每个寄存器中存放1bit二进制数据(0或1),每个时钟周期向左或向右移动一个bit。下图所示为一个向右移动的移位寄存器。 反馈移位寄存器(Feedback Shift Register,FSR) :每个时钟脉冲,移位寄存器向右移动一位,则移位寄存器的左左侧就

    2024年02月15日
    浏览(45)
  • 【FPGA零基础学习之旅#12】三线制数码管驱动(74HC595)串行移位寄存器驱动

    🎉欢迎来到FPGA专栏~三线制数码管驱动 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 ISSP调试演示: 程序配置完成:

    2024年02月09日
    浏览(40)
  • 【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月10日
    浏览(65)
  • 北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分  二.管脚分配 三.实现过程讲解及效果 shift_register.v d

    2024年02月05日
    浏览(51)
  • verilog——移位寄存器

    在Verilog中,你可以使用移位寄存器来实现数据的移位操作。移位寄存器是一种常用的数字电路,用于将数据向左或向右移动一个或多个位置。这在数字信号处理、通信系统和其他应用中非常有用。以下是一个使用Verilog实现的简单移位寄存器的示例: module ShiftRegister (   inpu

    2024年02月05日
    浏览(38)
  • Verilog实现移位寄存器

    Verilog实现8位环形移位寄存器 左移: 环形就是首尾相连 右移: 普通的移位寄存器用for语句实现: 普通左移: tb测试: 图形分析: 双向shift:就是加个判断

    2024年02月11日
    浏览(47)
  • LABVIEW的移位寄存器

    移位寄存器是数据的容器,可以包含任何数据类型。 添加移位寄存器后,在循环结构左右两侧的平行位置将各增加一个包含三角形的方框。左侧的方框代表上一次循环的运行结果,而右侧的代表本次循环要输入的结果。  最终得到5次循环后的结果。 接下来我们做一个通过移

    2024年02月11日
    浏览(40)
  • 【单周期CPU】LoongArch | 32位寄存器DR | 32位的程序计数器PC | 通用寄存器堆Registers | 32位RAM存储器

    前言: 本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本时序逻辑部件设计。 💻环境:一台内存4GB以上,装有64位Windows操作系统和Vivado 2017.4以上版本软件的PC机。 💎本章所采用的指令为

    2024年02月12日
    浏览(36)
  • 线性反馈移位寄存器(LSFR)

    流密码的流密钥产生器可以通过线性驱动和非线性组合两部分来实现。而线性驱动部分可以由线性反馈移位寄存器(LFSR)来实现。 线性反馈移位寄存器(LFSR):通常由移位寄存器和异或门逻辑组成。其主要应用在:伪随机数,伪噪声序列,计数器,BIST,数据的加密和CRC校验等

    2024年02月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包