前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Verilog数字系统设计——移位寄存器实现

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

作者头像
全栈程序员站长
发布2022-09-13 10:07:26
9520
发布2022-09-13 10:07:26
举报
文章被收录于专栏:全栈程序员必看

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

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、方式不同
代码语言:javascript
复制
循环左移:累加器自身循环向左移位。
带进位循环左移:累加器连同进位位一起左移。
1.3.2、过程不同
代码语言:javascript
复制
循环左移:移出的位不仅要进入CF,而且还要填补空出的位。
带进位循环左移:用原CF的值填补空出的位,移出的位再进入CF。
1.3.3、功能不同
代码语言:javascript
复制
循环左移:把操作数d,的各个二进制位向左移动d位,从d左端移出的每一位再依次移到右端空出的位上,最后移出的位还要送到CF中。
带进位循环左移:把操作数d的各位与CF联合在一起,构成9个或者17个二进制位,向左移动d位,从左端移出的各位再依次移到右端空出的位上。

二、代码实现

2.1、shift module

代码语言:javascript
复制
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

代码语言:javascript
复制
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.cn/160253.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • verilog——移位寄存器实现
    • 一、各种移位寄存器的原理
      • 1.1、自循环移位
      • 1.2、带进位位的循环移位
      • 1.3、区别
    • 二、代码实现
      • 2.1、shift module
    • 2.2、test module
      • 三、仿真截图
        • 3.1、自循环左移
        • 3.2、带进位位的循环左移
        • 3.2、自循环右移
        • 3.3、带进位位的循环右移
      • 3.4、带进位位的循环右移
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档