移位寄存器

移位寄存器的设计(VHDL)及testbench的编写

*爱你&永不变心* 提交于 2020-01-22 02:33:04
移位寄存器是一种常用的存储元件,此处由D触发器构成,如下图所示。 当时钟边沿到来时,存储在移位寄存器的数据朝一个方向移动一个BIT位。 移位寄存器的功能主要为:串并转换,并串转换和同步延迟。 vhdl代码如下: 1 library ieee; 2 use ieee.std_logic_1164.all; 3 4 entity shiftreg_rb is --实体说明及端口说明 5 port( 6 si,clr_bar,clk:in std_logic; 7 qout:buffer std_logic_vector(3 downto 0)--由于qout端口既是当前D触发器的输入也是上一个D触发器的输出。 8 ); --即qout信号是被驱动源驱动的同时还要驱动下一个端口。 9 end entity shiftreg_rb; --此情况下要使用buffer模式的端口。 10 11 architecture behavior of shiftreg_rb is 12 begin 13 process (clk) ---当时钟发生变化(上升沿或下降沿发生),执行进程 14 begin 15 if clk='1' then --时钟上升沿触发 16 if clr_bar = '0' then --时钟使能 17 qout <= "0000"; 18 else 19 qout(0) <

移位寄存器的原理

不想你离开。 提交于 2020-01-04 00:40:46
移位寄存器的原理 移位寄存器不仅能寄存数据,而且在时钟信号的最用下使它其中的数据依次左移或者右移。 四位移位寄存器的原理:F0、F1、F2、F3是四个边沿触发的触发器D,每一个触发器的输出端Q接到右边一个触发器的输入端D。因为从时钟的信号CP的上升沿加到触发器上开始到输出端新状态稳定地建立起来有一段延迟的时间,所以当时钟信号同时加到四个触发器上的时候,每个触发器接受的都是左边一个触发器中原来的而数据(F0接收的输入数据D1)。寄存器中的数据依次右移一位。 移位寄存器按照不同的分类方法可以分为不同的类型。 如果按照移位寄存器的移位方向来进行分类, 可以分为左移移位寄存器、移位寄存器和双向移位寄存器等;如果按照工作方式来分类,可以分为串入/串出移位寄存器、串入/并出移位寄存器和并入/串出移位寄存器等。 移位寄存器能将所储存的数据逐位向左或向右移动,以达到计算机运行过程中所需的功能,请看图: 启动时,先在清零端加清零脉冲,使触发器输出置0。然后,第一个数据D0加到触发器1的串行输入端,在第一个CLK脉冲的上升沿Q0=Q0,Q1=Q2。Q3=Q0。其后,第二个数据D1加到串行输入端,在第二个CLK脉冲到达时,Q0=Q1,Q1=Q0,Q2=Q3=0。以此类推,当第四个CLK来到之后,各输出端分别是Q0=Q3,Q1=Q2,Q2=Q1,Q3=Q0。输出数据可用串行的形式取出,也可用并行开式取出。

移位寄存器及verilog代码

本秂侑毒 提交于 2019-12-07 15:08:28
通用移位寄存器 作用:后续补全 //通用移位寄存器module Universal_Shift_Reg#(parameter word_size = 8)( output reg[word_size-1:0] Data_out, output MSB_out, LSB_out, input [word_size-1:0] Data_in, input MSB_in, LSB_in, input s0, s1, clk, rst ); assign MSB_out = Data_out[word_size-1]; assign LSB_out = Data_out[0]; always @(posedge clk) begin if(rst==1'b1) Data_out <= 0; else case({s1, s0}) 0: Data_out <= Data_out; //maintain 1: Data_out <= {MSB_in, Data_out[word_size-1:1]}; //MSB shift 2: Data_out <= {Data_out[word_size-2:0], LSB_in}; //LSB shift 3: Data_out <= Data_in; //parallel input endcase end endmodule 移位寄存器 作用

74HC595 8位移位寄存器的使用小结

最后都变了- 提交于 2019-12-06 05:37:05
上一篇文章已经讲到,电灯电路比较复杂,以少控多的方式,只能使用串行的方式,因此移位寄存器就发挥功能了。 学生时代,很少实际用过,只是理论学习,但是在项目中,真正用上了,的确要复习一番。 参考文章: https://blog.csdn.net/k1ang/article/details/80012686 此文有一个错误,数据搬运的地方,但值得参考。 http://www.51hei.com/bbs/dpj-152282-1.html 这个文章也不错 https://www.cnblogs.com/lulipro/p/5067835.html 这个也好 但是最后还是要根据自己的使用情况来分析。我使用的是ti的芯片,也可以参考Nexperia的文档,加深理解。 移位寄存器的基本原理是,串进并出,有锁存功能。 具体以芯片手册来分析。 左侧是ti的芯片封装,引脚排列; 右侧是Nexperia芯片封装,引脚排列的 下图是ti的芯片管脚说明: 0、QA-QH等同于Q1-Q7,8位并行输出端 1、SER数据输入端 2、SRCLK是移位用的时钟管脚,S代表shift,上升沿有效,和Nexperia的SHCP等同 3、RCLK是用的存储寄存器用的时钟管脚,上升沿有效,和Nexperia的STCP等同 4、Qh'(低9脚)用于串级,和下级的ser连接即可。和Nexperia的Q7S等同 5、OE输出是能

线性反馈移位寄存器(LFSR)

一个人想着一个人 提交于 2019-12-05 23:14:25
   LFSR用于产生可重复的伪随机序列PRBS,该电路有n级触发器和一些异或门组成,如下图所示。 其中,gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;这里的反馈系数决定了产生随机数的算法的不同。用反馈函数表示成y=a0x^0+a1x+a2x^2.......反馈函数为线性的叫线性移位反馈序列,否则叫非线性反馈移位序列。 LFSR的初始值被称为伪随机序列的种子,影响下一个状态的比特位叫做抽头。LFSR的触发器编号一般从1开始,抽头取值范围是1到 2 n -1 。抽头序列可以用来描述该LFSR的反馈多项式。由n个触发器构成的LFSR电路可以产生一个周期为2 n -1的序列。 理论表明,要使 LFSR 得到最长的周期, 这个抽头序列构成的多 项式加 1 就是其反馈多项式 , 必须是一个 本原多项式 ,也就是说这个多项式不可约,比方下图的抽头序列为(4,1),其对应的反馈多项式为 ,其对应的线性反馈移位寄存器电路如下所示。 假设 的初始值各自是 1 0 0 0 ,反馈函数选取 ,那么得到例如以下序列 能够看出周期为 15 。在这一个周期里面涵盖了开区间 内的全部整数,而且都是没有固定顺序出现的,有非常好 的随机性。   目前常用的LFSR电路可分为斐波那契LFSR和伽罗瓦LFSR。 斐波那契LFSR      

多周期移位寄存器

匿名 (未验证) 提交于 2019-12-03 00:19:01
前一段时间因为比较烦躁,对这个的理解不够,导致盲目瞎做,出了很多问题,就一直没有接着往下做,今天仔细想来一下发现其实很简单 代码如下 module sysclk( input CLK; output OV; parameter MAX_VAL = 25_000_000; reg [32-1:0] CNTVAL; reg OV; always @ (posedge CLK) begin end always @ (CNTVAL) begin end endmodule input IN,CLK ,EN,DIR; output [long-1:0] OUT ; parameter long = 8; reg [long-1:0] shift; //reg [long-1:0] OUT; always @(posedge CLK) begin if(EN) begin if(DIR) begin shift[long-1:1] = shift[long-2:0]; shift[0]=IN; end else begin shift[long-2:0] = shift[long-1:1]; shift[7]=IN; end end shift[long-1:0] = shift[long-1:0]; end 文章来源: 多周期移位寄存器

Xilinx-BlockRAM-高效移位寄存器

匆匆过客 提交于 2019-12-02 06:19:39
1. 在任何情况下,深度较深的以为寄存都强烈建议使用 block ram 。 思路如上图所示,但实现不推荐用这么多D触发器,也不推荐使用SRL16 之类的slice级别移位寄存器。 2. 对于(例如图像处理)分多通道时,不用拘泥于单通道对应单 block ram 。 Block ram 是9bit 1920深度。输入格式为R10 G10 B10 ,如上图最大化利用位宽。 3. 对于 SDP 以及 TDP 模式 blockram 应用的启发。 对于每一个port 在读写都是全双工的。当使用TDP模式时,相当于一个Block RAM可以实现2路同时读,2路同时写的quad port memory。 设定为read_first 模式时,(同时,EN=WE=1)可以产生如下时序: 如此可知,控制每个port的地址位进行递增,便可以实现一个tap(引用altera的概念) 此时的硬件结构如上图 此时的时序如上图 这边需要注意的是,假定一行16个像素,1 与 17 对应。每列的像素需要对齐。 如果地址为16进制,那么1与17会差一个时钟周期,所以地址必须是15进制。 结论,地址位 (行像素数-1)进制。 4. 使用 EN 引脚来过渡图像 fly-back (个人觉得可以理解为行消隐 blanking )而非 WE 。 在遇到fly-back时 我们所需要的时序如下: 当使用WE引脚来做使能时

移位寄存器的 IP核调取及应用

六眼飞鱼酱① 提交于 2019-11-29 13:20:25
写在前面的话 做很多图像算法的时候 , 我们经常需要用到模板运算 (如 sobel 图像边缘检测、中值滤波、均值滤波等等),处理这些问题的时候,我们可以借助 altera 提供的移位寄存器 IP 核来简化我们的设计,从而提高设计效率。本节,梦翼师兄和大家一起学习这个适合用于模板运算的移位寄存器 IP 核的用法。 功能要求 假设数据在一个ROM中以如下图所示的方式存放,列加行的值作为该数的地址(如e的地址就是8+1=9)。 address 0 1 2 3 4 5 6 7 0 a d g j m p aa bb 8 b e h k n q dd cc 16 c f i l o r ee ff 24 s t u v w rr gg hh …… y z uu vv ww qq ii jj 在图像处理领域,要实现Sobel或者均值滤波等算法,则需要按照3*3矩阵的格式提取数据,如下图所示:(现在想要每次取出3列数据为一组,如第一列数据:a、b、c 第二列数据:d、e、f 第三列数据:g、h、i) 解决方案:在这儿我想给大家介绍一个叫做Shift_register的 IP 核来实现这种功能,而且还有很重要的一点就是我们可以利用这种方法来实现流水线操作,我们暂且就将其看做是移位寄存的 “FIFO”吧。 如果我们将该IP 核配置成如下图所示的两个 “FIFO”