Verilog数字系统设计——移位寄存器实现

Verilog数字系统设计——移位寄存器实现verilog实现移位寄存器:分别可实现自循环左移右移、带进位位的循环左移右移

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

verilog——移位寄存器实现

一、各种移位寄存器的原理

1.1、自循环移位

这里用例子说明较为清晰:
假如一个二进制数字是 1111100000
自循环左移 –> 1111000001 1110000011 1100000111 …
自循环右移 –> 0111110000 0011111000 0001111100 …

1.2、带进位位的循环移位

这里用例子说明较为清晰:
带进位的循环左移RCL(Rotate Left Through Carry):
用原CF的值填补空出的位,移出的位再进入CF。
  假设当前,AL=01010011B,CF=1,则
  执行指令 ROL AL,1
  后,AL=10100110B,CF=0
  执行指令 RCL AL,1
  后,AL=10100111B,CF=0
  最后一位的1,是先前CF的1

1.3、区别

区别
具体区别可分为下面三种:

1.3.1、方式不同

循环左移:累加器自身循环向左移位。
带进位循环左移:累加器连同进位位一起左移。

1.3.2、过程不同

循环左移:移出的位不仅要进入CF,而且还要填补空出的位。
带进位循环左移:用原CF的值填补空出的位,移出的位再进入CF。

1.3.3、功能不同

循环左移:把操作数d,的各个二进制位向左移动d位,从d左端移出的每一位再依次移到右端空出的位上,最后移出的位还要送到CF中。
带进位循环左移:把操作数d的各位与CF联合在一起,构成9个或者17个二进制位,向左移动d位,从左端移出的各位再依次移到右端空出的位上。

二、代码实现

2.1、shift module

module shiftreg(out,reset,clk,data,select);
	output reg [7:0] out; //output signal
	input [1:0] select;	//Status selection signal
	input [7:0] data;
	input reset,clk;	//reset signal 
	reg CF,temp;
	


	always @(posedge clk or posedge reset)
		begin
		if(reset)		//reset signal
			begin
			out <= data;	
			CF <= 0;
			end
		else 
			begin
			case(select)
				2'b00:			//ROL:Shift left from cycle
					out <= { 
   out[0],out[7:1]};
				//用原CF的值填补空出的位,移出的位再进入CF
				2'b01:		//RCL:Cyclic left shift with carry
					begin
  					temp = out[0];
                    			out = { 
   CF,out[7:1]}; 
                    			CF = temp;
					end
				
				2'b10:		//ROR:Rotate Right
					out = { 
   out[6:0],out[7]};
				2'b11:			//RCR:Rotate Right Through Carry
					begin
	  				temp =out[7];
                    			out = { 
   out[6:0],CF};
                    			CF = temp;
					end
				default:out <= 8'bx;
			endcase
			end	
		end
endmodule  

2.2、test module

module test_shiftreg;
	reg clk_t,reset_t;
	reg[1:0] select_t;
	wire[7:0] out_t;
	reg[7:0] data_t;
	
	shiftreg myshift(
		.out(out_t),
		.reset(reset_t),
		.clk(clk_t),
		.data(data_t),
		.select(select_t));

	initial
	begin
		data_t = 8'b1011_0101;
		reset_t = 1;
		clk_t = 0;
		select_t = 2'b11;
		#20 reset_t = 0;
	end
	always #20 clk_t = ~clk_t;	//clock signal

endmodule

三、仿真截图

3.1、自循环左移

自循环左移截图

3.2、带进位位的循环左移

带进位位的循环左移

3.2、自循环右移

自循环右移

3.3、带进位位的循环右移

带借位的循环右移

3.4、带进位位的循环右移

带进位位的循环右移

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

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

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


相关推荐

  • 木马产业链 安全新忧患

    木马产业链 安全新忧患

    2022年3月11日
  • docker 启动容器出现 Exited[通俗易懂]

    有时候在启动容器的时候,启动没报错,但是在执行dockerps-a时发现刚启动的容器状态为Exited(1),这个时候查看日志dockerlogs-f-t–tail20容器ID,发现报chown:changingownershipof’.’:Permissiondenied提示没有权限,这个时候将容器删除,在执行容器启动的命令中加入–privi…

    2022年4月17日
  • PLSQLDeveloper14连接Oracle11g

    PLSQLDeveloper14连接Oracle11g提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、环境配置1.安装PLSQLDeveloper142.下载并解压Oracle客户端3.配置window操作系统环境变量二、工具配置1.Oracle客户端配置2.PLSQLDeveloper14配置3.重启PLSQLDeveloper14客户端结尾一、环境配置1.安装PLSQLDeveloper14官网自行下载,不详细阐述2.下载并解压Oracle客户端例如版本:instantclient-basic-nt-19.8.0

    2022年5月22日
  • 数据仓库ods是什么意思_数据仓库ODS全拼

    数据仓库ods是什么意思_数据仓库ODS全拼1.引言本篇主要讲述操作数据存储(ODS)系统产生的背景、定义、特点,以及它与数据仓库的区别。在前两篇,笔者介绍了什么是数据仓库?为什么需要数据仓库?数据仓库系统的体系结构是什么?因此可能在读者心里已经形成了企业数据存储的DB~DW两层体系结构的概念,但在实际应用中,并不总是这样,有时候我们可能需要ODS这一系统来搭建DB~ODS~DW三层数据体系,那么什么是ODS?为什么需要ODS?ODS与D…

    2022年10月6日
  • 161套javaWeb项目源码免费分享[通俗易懂]

    161套javaWeb项目源码免费分享[通俗易懂]最近很多学生在找关于java开发的学生管理系统,学生选课系统,车辆管理系统,商城系统,项目申报系统,教务管理系统,班级管理系统,博客系统。。。。。。。。我找了一些前几年的项目,感觉还行,虽然项目但技术都是一样的,可以用来做课程设计和毕业设计项目参考,但不要完全照搬哦就不再展示了,需要的可以收藏本篇文章,最好可以四连,关注点赞收藏订阅,下载不迷路链接:https://pan.baidu.com/s/1JX3u5v1alDcMpbG8s134AA提取码:wimo…

    2022年7月9日
  • PrCharm激活码【在线破解激活】[通俗易懂]

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

    2022年3月16日

发表回复

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

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