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


相关推荐

  • 启动activity的两种方式_开机启动项怎么添加

    启动activity的两种方式_开机启动项怎么添加转自:https://blog.csdn.net/dct8888/article/details/52064160 问题描述:我们通过广播来启动Activity的时候如果不设置intent的FLAG_ACTIVITY_NEW_TASK属性,就会报这个异常:android.util.AndroidRuntimeException:CallingstartActivity()from…

    2022年10月5日
    2
  • 原 在windows上创建文件名以“.”开头的文件

    原 在windows上创建文件名以“.”开头的文件

    2021年10月20日
    83
  • BAT机器学习面试1000题系列(详细版)

    BAT机器学习面试1000题系列(详细版)BAT机器学习面试1000题系列置顶2017年12月14日15:19:15阅读数:20913几点声明:1、本文的内容全部来源于七月在线发布的BAT机器学习面试1000题系列;2、文章中带斜体的文字代表是本人自己增加的内容,如有错误还请批评指正;3、原文中有部分链接已经失效,故而本人重新加上了新的链接,如有不当,还请指正。(也已用斜体标出)4、部分答案由于完全是摘抄自其它的博客,所以本人就只贴出答…

    2022年5月23日
    41
  • Mac查看隐藏文件夹_不压缩文件夹设置密码

    Mac查看隐藏文件夹_不压缩文件夹设置密码一、查看隐藏文件夹:可以直接在终端执行open~/文件夹名称如:open~/.ssh二、查看隐藏文件:在Finder下进入你想要操作的文件夹,按快捷键Command+F调出搜索窗

    2022年8月1日
    7
  • idea创建java web项目_ideajava创建项目

    idea创建java web项目_ideajava创建项目JavaWeb专栏之(二):Idea创建JavaWeb项目前言:关注:《遇见小Du说》微信公众号,分享更多Java知识,不负每一次相遇。更多内容请访问:www.dushunchang.top在上一篇博客中传送门,小Du带大家了解了什么JavaWeb,B/C与C/S结构,以及Java开发中最常见的MVC三层架构模式。本文章将带大家使用Idea创建JavaWeb项目的教程。在企业开发中,我们经常使用maven构建框架来创建项目,但很多初学者没有接触过Maven构建工具,所以本期教程使用Idea自带的W

    2022年9月20日
    2
  • cpu用户态和内核态区别_内核拷贝数据到用户态

    cpu用户态和内核态区别_内核拷贝数据到用户态这里写目录标题内核态与用户态的区别用户态到内核态的切换操作系统需要两种CPU状态:内核态(KernelMode):运行操作系统程序,操作硬件用户态(UserMode):运行用户程序操作系统有三个特权级别:R0、R1、R2和R3。R0相当于内核态,R3相当于用户态,不同级别能够运行不同的指令集合。内核态与用户态的区别用户态的程序运行在3级特权级上,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态。内核态的程序运行在0级特权级上。处于用户态执行时

    2022年9月18日
    1

发表回复

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

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