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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么叫侧面指纹识别_屏下指纹和侧面指纹触控有什么区别

    什么叫侧面指纹识别_屏下指纹和侧面指纹触控有什么区别指纹识别作为一种生物识别方案,在手机上的应用为用户日常使用带来了极大的便利,从解锁手机到应用加密再到支付等场景,原本需要输密码的繁琐场景如今按一下手指就行。随着手机的发展,指纹解锁也出现了不同的解决方案,比如OPPOK3所采用的目前主流的屏下指纹解锁,以及荣耀9X所采用侧面指纹解锁。那么在实际应用场景中,哪种指纹识别更实用呢?采用了屏幕指纹的OPPOK3与侧面指纹的荣耀9X都有着真全面屏的设计…

    2022年6月30日
    44
  • Nginx搭建视频点播和视频直播服务器

    Nginx搭建视频点播和视频直播服务器Nginx搭建视频点播和视频直播服务器一·、环境:Centos7,(推荐,Ubuntu不是很好用,经常会有一些莫名其妙的报错)Nginx1.10.1二、系统环境搭建首先,我是不建议自己一个个去安装这些软件的,耗时耗力,而且,容易出错,所以,最好使用yuminstall***命令安装,出错的概率小。资源链接:链接:https://pan.baidu.com/s/1WmJYpQ_b…

    2022年6月14日
    32
  • 6.5——ADRC学习

    6.5——ADRC学习深刻理解PID1.    典型的传递函数——一阶惯性环节一个储能元件(如电感,电容)与一个耗能元件(如电阻)的组合,就能构成一阶惯性环节。如一个RC电路特点:当输入量发生突变时,输出量不能突变,只能按照指数规律逐渐变换,这就反应了该环节具有惯性。(也就是说,惯性环节的输出一开始并不与输入同步按比例变化,直到过渡过程结束,y(t)才能与x(t)保持比例。)而惯性环节的时间常数就是惯性的量度。 我们的…

    2022年5月19日
    37
  • 优化算法——粒子群算法(PSO)

    优化算法——粒子群算法(PSO)一、粒子群算法的概述二、粒子群算法的流程

    2022年6月10日
    29
  • 常见的7种排序算法

    常见的7种排序算法1、冒泡排序最简单的一种排序算法。假设长度为n的数组arr,要按照从小到大排序。则冒泡排序的具体过程可以描述为:首先从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置,此时数组最右端的元素即为该数组中所有元素的最大值。接着对该数组剩下的n-1个元素进行冒泡排序,直到整个数组有序排列。算法的时间复…

    2022年7月26日
    6
  • softmax函数导数「建议收藏」

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

    2022年4月14日
    44

发表回复

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

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