移位寄存器专题(verilog HDL设计)

移位寄存器专题(verilog HDL设计)目录移位寄存器简介分类4位右移位寄存器工作原理1、16位右移位寄存器2、16位左移寄存器3、串行输入并行输出寄存器4、并行输入串行输出移位寄存器移位寄存器简介移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,它也…

大家好,又见面了,我是你们的朋友全栈君。

目录

移位寄存器简介

分类

4位右移位寄存器工作原理

1、 16位右移位寄存器

2、 16位左移寄存器

 3、 串行输入并行输出寄存器

4、 并行输入串行输出移位寄存器


移位寄存器简介

移位寄存器内的数据可以在移位脉冲(时钟信号)的作用下依次左移或右移。移位寄存器不仅可以存储数据,还可以用来实现数据的串并转换、分频,构成序列码发生器、序列码检测器,进行数值运算以及数据处理等,它也是数字系统中应用非常广泛的时序逻辑部件之一。

分类

移位寄存器按数据移位方向可以分为左移寄存器、右移寄存器、也可以根据数据输入、输出方式分为并行输入/串行输出、串行输入/并行输出、串行输入/串行输出、并行输入/并行输出。

4位右移位寄存器工作原理

下图是一个4位右移位寄存器的逻辑电路图。其工作原理为:串行数据从触发器F_{A}D_{I}端输入,触发器FA的状态方程为:Q^{n+1}_{A}=Q^{n}_{I}。其余触发器的状态方程分别为Q^{n+1}_{B}=Q^{n}_{A}Q^{n+1}_{C}=Q^{n}_{B}Q^{n+1}_{D}=Q^{n}_{C}。可见,右移位寄存器的特点是右边寄存器的次态等于左边触发器的现态。串行输出数据从触发器FD的QD端输出,并行数据从个触发器的QA~QD端输出,两种输出方式都属于同向输出。各触发器都采用同一时钟信号,所以它们工作在同步状态。如果将FD的输出端QD接到FA的输入端DI,则可以构成循环移位的右移位寄存器。

 移位寄存器专题(verilog HDL设计)

                                     4位右移位寄存器逻辑电路

 

1、 16位右移位寄存器

下面描述的是一个位宽为16位的右移位寄存器,实际具有环形移位的功能,是在右移位寄存器的基础上将最低位的输出端接到最高位的输入端构成的。其功能为当时钟上升沿到达时,输入信号的最低位移位到最高位,其余各位依次向右移动一位。

 

其verilog HDL设计代码如下:

 

1. module register_right(clk, din, dout);  

2.     input clk;  

3.     input [15:0] din;  

4.     output [15:0] dout;  

5.     reg [15:0] dout;  

6.   

7.     always @(posedge clk)  

8.         begin  

9.             dout <= {din[0], din[15:1]};  

10.         end  

11. endmodule  

其测试文件为:

1. `timescale 1ns/1ps  

2. module register_right_tb;  

3.     reg clk;  

4.     reg [15:0] din;  

5.     wire [15:0] dout;  

6.     always  

7.         begin  

8.         #10 clk = ~clk;  

9.         end  

10.     initial  

11.         begin  

12.             clk = 1'b0;  

13.             din = 16'b0000_0000_0000_0000;  

14.             #10 din = 16'b0000_0000_0000_1011;  

15.             #20 din = 16'b0000_0000_0111_0000;  

16.             #20 din = 16'b0000_0000_0000_0011;  

17.             #100;  

18.         end  

19.     register_right U1(.clk(clk), .din(din), .dout(dout));  

20.   

21. endmodule  

在Modelsim中仿真得到的波形图如下:

  移位寄存器专题(verilog HDL设计)

2、 16位左移寄存器

同右移位寄存器原理一致,下面直接给出verilog HDL 设计代码:

1. module register_left(clk, din, dout);  

2.     input clk;  

3.     input [15:0] din;  

4.     output [15:0] dout;  

5.     reg [15:0] dout;  

6.       

7.     always @(posedge clk)  

8.         begin  

9.             dout <= {din[14:0], din[15]};  

10.         end  

11. endmodule  

测试文件为:

1. `timescale 1ns/1ps  

2. module register_left_tb;  

3.     reg clk;  

4.     reg [15:0] din;  

5.     wire [15:0] dout;  

6.       

7.     always  

8.         #10 clk = ~clk;  

9.           

10.     initial  

11.         begin  

12.             clk = 1'b0;  

13.             din = 16'b0000_0000_0000_0000;  

14.             #10 din = 16'b0000_0000_0000_0011;  

15.             #20 din = 16'b0000_0000_0011_0000;  

16.             #100;  

17.         end  

18.           

19.     register_left U1(.clk(clk), .din(din), .dout(dout));  

20. endmodule  

在Modelsim中仿真所得波形图如下:

 移位寄存器专题(verilog HDL设计)

 3、 串行输入并行输出寄存器

下面描述一个位宽为8的串行输入并行输出的寄存器,其实现的功能为:1位数据的串行输入,8位数据的并行输出。当时钟上升沿到达时,1位输入数据din进入qtemp的最低位,qtemp的其余各位依次向左移动1位,在assign 赋值语句中,将qtemp连续赋值给dout,实现8位的数据并行输出。

 其verilog HDL设计代码为:

1. module left_shifter_reg(clk, din, dout);  

2.     input clk;  

3.     input din;  

4.     output [7:0] dout;  

5.     wire [7:0] dout;  

6.     reg [7:0] qtemp;  

7.     always @ (posedge clk)  

8.         begin  

9.             qtemp <= {qtemp[6:0], din}; //每次输入一位  

10.         end  

11.     assign dout = qtemp; //并行输出  

12.   

13. endmodule  

测试文件为:

1. module left_shifter_reg_tb;  

2.     reg din;  

3.     reg clk;  

4.     wire [7:0] dout;  

5.       

6.     always   

7.         #10 clk = ~clk;  

8.       

9.     initial  

10.         begin  

11.             clk = 1'b0;  

12.             #100 din = 1'b1;  

13.             #100 din = 1'b1;  

14.             #100 din = 1'b0;  

15.         end  

16.           

17.     left_shifter_reg U1(.din(din), .clk(clk), .dout(dout));  

18. endmodule  

 在Modelsim中仿真所得波形图:

  移位寄存器专题(verilog HDL设计)

移位寄存器专题(verilog HDL设计)

4、 并行输入串行输出移位寄存器

 

下面描述一个位宽为8的并行输入串行输出的寄存器,其实现的功能为:当使能端 en = 1时,将输入数据din存入一个8位的中间变量,然后在每个时钟上升沿到来时,将qtemp的最低端输出,然后再将qtemp右移一位,从而实现将din输入数据从最低位到最高位依次串行输出。

 

其verilog HDL设计代码为:

1. module right_shifter_reg(clk, en, din, dout);  

2.     input [7:0] din;  

3.     input en,clk;  

4.     output dout;  

5.     reg dout;  

6.     reg [7:0] qtemp;  

7.     always @(posedge clk)  

8.         begin  

9.             if(en == 1)  

10.                 qtemp <= din;  

11.             else  

12.                 begin  

13.                     dout <= qtemp[0];  

14.                     qtemp <= {qtemp[0], qtemp[7:1]};  

15.                 end  

16.         end  

17.   

18. endmodule 

测试文件为:

1. `timescale 1ns/1ps  

2. module right_shifter_reg_tb;  

3.     reg [7:0] din;  

4.     reg clk;  

5.     reg en;  

6.     wire dout;  

7.       

8.     always  

9.         #10 clk = ~clk;  

10.       

11.     initial  

12.         begin  

13.             clk = 0;  

14.             en = 1'b0;  

15.             #10 en = 1'b1;  

16.             din = 8'b1110_0010;  

17.             #20 en = 1'b0;  

18.             #100;  

19.         end  

20.     right_shifter_reg U1(.clk(clk), .en(en), .din(din), .dout(dout));  

21.   

22. endmodule  

在Modelsim中仿真所得波形图如下:

 移位寄存器专题(verilog HDL设计)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160221.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat15 激活码(破解版激活)

    navicat15 激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    48
  • Ngixn动静分离详细配置方法

    Ngixn动静分离详细配置方法目录前言:准备工作一.静态主机配置二.动态主机配置三.动静分离配置四.配置文件目录结构五.测试前言:  为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。在动静分离的tomcat的时候比较明显,因为tomcat解析静态很慢,其实这些原理的话都很好理解,简单来说,使用正则表达式匹配过滤,然后交给不同的服务器。  静态页面一般直接由Nginx来处理,动态页面则是通过反向代理,代理到后端的Tomcat,然后在做负载均衡,是选择本地静态页面,还是后

    2022年6月2日
    40
  • Java集合详解8:Java集合类细节精讲

    Java集合详解8:Java集合类细节精讲今天我们来探索一下Java集合类中的一些技术细节。主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充。可能不全面,还请谅解。本文参考:http://cmsblogs.com/?cat=5具体代码在我的GitHub中可以找到https://github.com/h2pl/MyTech文章首发于我的个人博客:https://h2pl.github.io/2018/05/13/…

    2022年5月5日
    36
  • int与long long之间的转换

    int与long long之间的转换今天看了下c++primer,才知道假如a为longlong或者double类型,b为int类型,假如有表达式a>=b,则编译器会将b先转化为longlong或者double类型,也就是说会将窄类型自动转化为宽类型,这一步是自动转化的,没有必要在代码中再强制转化。但是有个特例,假如a=INT32_MIN,则-a会越界,其数值在我的平台上为-2147483648,如果要得到

    2022年5月3日
    164
  • springboot实现ajax跨域请求

    springboot实现ajax跨域请求有段时间没写文章了。看到有人提问ajax跨域请求的问题。博主要再次强调,跨域,就是从不同的的IP端口获取数据,比如说,从www.baidu.com获取数据,就叫跨域!那么localhost:8080与localhost:8081之间呢?也叫跨域。如果处理的不好,就会报错,不仅前端报错,后端也会报错。那么如何解决呢?着急的人,请直接往下看,不急的请听我细细道来,一定能解决您的问题。我再此保证

    2022年6月17日
    39
  • 一个完整的、全面k8s化的集群稳定架构(值得借鉴)

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:紫色飞猪 cnblogs.com/zisefeizhu/p/13692782.html 前言 我司的集群时刻处…

    2021年6月28日
    127

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号