双向移位寄存器VHDL设计.docx
- 文档编号:10750364
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:13
- 大小:453.63KB
双向移位寄存器VHDL设计.docx
《双向移位寄存器VHDL设计.docx》由会员分享,可在线阅读,更多相关《双向移位寄存器VHDL设计.docx(13页珍藏版)》请在冰点文库上搜索。
双向移位寄存器VHDL设计
双向移位寄存器
1.引言
移位寄存器就是指具有移位功能的触发器组,它是在普通寄存器的基础上添加了移位功能的一种特殊的寄存器。
通常,移位功能就是指在寄存器里面存储的二进制数据能够在时钟信号的控制下依次左移或者右移。
移位寄存器是一种非常有用的时序逻辑电路,它常用于数据的串/并转换、并/串转换、数值运算、数据处理以及乘法移位操作等。
移位寄存器按照移位方向来进行分类,可以分类左移移位寄存器、右移移位寄存器和双向移位寄存器等。
本文将介绍双向移位寄存器。
2.VHDL程序
双向移位寄存器的VHDL程序如下:
LIBRARYieee;--打开需要用到的库
USEieee.std_logic_1164.all;
USEieee.std_logic_arith.all;
USEieee.std_logic_unsigned.all;
ENTITYrom_shiftIS--实体说明
PORT
(
clk:
INSTD_LOGIC;
d:
INSTD_LOGIC;
dir:
INSTD_LOGIC;
q:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDrom_shift;
ARCHITECTUREbehaveOFrom_shiftIS--结构体定义
SIGNALqn:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IFdir='0'THEN
qn(0)<=d;--将输入数据d赋给最低位
FORiIN1TO3LOOP--数据由低位向高位移
qn(i)<=qn(i-1);
ENDLOOP;
ELSE
qn(3)<=d;--若dir=‘1’将输入数据d赋给最高位
FORiIN2DOWNTO0LOOP--数据由高位向低位移
qn(i)<=qn(i+1);
ENDLOOP;
ENDIF;
ENDIF;
ENDPROCESS;
q<=qn;
ENDbehave;
3.仿真结果如下:
实现功能:
由程序可以看出,输入信号有clk,dir,d,其中clk为时钟信号,dir为移位方向控制信号。
当dir=0时,使输入信号由低位向高位移;当dir=1时,输入信号由高位向低位移。
二、从下列各题中任选3个,或任选2个并再自选一个难度相当的通信或电子系统,编写完代码后在计算机上仿真,提交完整的文档(包括:
设计原理、VHDL程序、仿真结果等),并在课堂上进行交流。
1.设计一个按键脉冲宽度处理电路。
假设按键的高电平脉冲宽度可能为10-100个时钟宽度,设计一个电路使每次按键在按键松开(释放)时输出一个时钟周期的高电平脉冲。
根据代码画出电路结构示意图。
设计原理:
此设计是用于按键防抖动。
首先设计一个计数器计算出按键被按下多长时间,然后进行判断。
若按键按下去的时间在10——100个时钟宽度以内,当按键松开时,输出一个时钟周期的高电平脉冲。
VERILOG程序:
modulepushbutton(clk,pushdown,clkout);//定义模块名,端口名称
inputclk,pushdown;//定义输入端口
outputclkout;//定义输出端口
reg[7:
0]cnt;//定义计数器为8位寄存器
regclkout;
always@(posedgeclk)//在时钟上升沿触发
begin
if(!
pushdown)//当按键没按下时,计数值为0
cnt<=0;
else
cnt<=cnt+1;//当按键被按下时,增加计数器的值
end
always@(posedgeclk)
begin
if((pushdown==0)&&(cnt>=10)&&(cnt<=100))//按键松开时判断计数器值是否在10-100之间
clkout<=1;//若是,则输出一个时钟周期的脉冲
elseclkout<=0;
end
endmodule
测试模块:
modulepushbutton_tb;
regclk;
regpushdown;
wireclkout;
pushbuttonm(clk,pushdown,clkout);
initial
begin
clk=0;
pushdown=0;
#30pushdown=1;
#240pushdown=0;
#100pushdown=1;
#210pushdown=0;
#200pushdown=1;
#30pushdown=0;
#200pushdown=1;
#2200pushdown=0;
end
always#10clk=~clk;
endmodule
仿真结果:
电路结构示意图:
2设计帧同步检测电路,输入位宽1位的二进制序列及时钟,输出高电平脉冲的检测结果。
对输入的二进制序列检测帧同步序列“01011”,即当输入的二进制序列中出现帧同步序列时,输出一个高电平脉冲。
设计原理:
帧同步检测电路就是要将一个指定的帧同步序列从数字码流中识别出来。
本设计中,我们将设计一个“01011”的帧同步序列。
采用状态机的设计方法。
当输入有1位符合要求时,进入S0状态,若有2位符合要求,进入S1状态,依次类推。
VERILOG程序:
modulecheckseq(clk,reset,din,dout);
inputclk,din,reset;
outputdout;
regdout;
reg[2:
0]state;//总共有5个状态,因此定义状态为3位二进制数
parameteridle=3'b000,//参数定义,分别代表那5个状态
s0=3'b001,
s1=3'b010,
s2=3'b011,
s3=3'b100,
s4=3'b101;
always@(posedgeclk)
begin
if(reset)
state<=idle;
else
case(state)
idle:
begin
if(din==0)state<=s0;//用状态变量记住第一位(din==0)来过
elsestate<=idle;//输入的是高电平,不符合要求,所以状态保持不变
end
s0:
begin
if(din==1)state<=s1;//用状态变量记住第二位(din==1)来过
elsestate<=s0;//输入低电平,有一位对过
end
s1:
begin
if(din==0)state<=s2;//用状态变量记住第三位(din==0)来过
elsestate<=idle;//输入高电平,没有一位对过
end
s2:
begin
if(din==1)state<=s3;//用状态变量记住第四位(din==1)来过
elsestate<=s0;//输入低电平,有一位对过
end
s3:
begin
if(din==1)state<=s4;//用状态变量记住第五位(din==1)来过
elsestate<=s2;//记住有三位对过010
end
s4:
begin
if(din==0)state<=s0;//用状态变量记住第一位(din==0)来过
elsestate<=idle;//输入高电平,没有一位对过
end
default:
state<=idle;
endcase
end
always@(posedgeclk)
begin
dout<=(state==s3)&&(din==1);//当检测到连续序列为“01011”时,输出高电平
end
endmodule
测试模块:
modulecheckseq_tb;
regclk,reset;
reg[23:
0]data;
wiredin;
wiredout;
assigndin=data[23];
checkseqm1(clk,reset,din,dout);
initial
begin
clk=0;
reset=1;
#30reset=0;
data=24'b0100_1011_0101_0110_0111_0110;
end
always#10clk=~clk;
always@(posedgeclk)
begin
data={data[22:
0],data[23]};
end
endmodule
仿真结果:
3.设计可以对两个运动员赛跑计时的秒表,要求如下:
(1)秒表的输入只有时钟(clk)和一个按键(key),假设key已经经过防抖动和脉冲宽度处理,每按一次key产生持续一个时钟周期的高电平脉冲,可以满足设计的需要,不需要对key再做任何处理。
(2)秒表输出用0-59的整数表示,不需要对十位和个位分别计数,不需要7段译码。
(3)键key的功能如下:
(A)按第一下key,开始计数,并输出计数值;
(B)第一个运动员到终点时按第二下key,秒表记住第一个运动员到终点的时间,但还在继续计数并输出计数值;
(C)第二个运动员到终点时按第三下key,停止计数,这时输出的计数值就是第二个运动员用的时间;
(D)然后按第四下key,秒表输出第一个运动员到终点的时间,即按第二下key时记住的计数值;
(E)按第五下key,秒表清0,开始新的周期。
(4)画出秒表的状态转移图,标明各个状态的转移条件和输出。
(5)用VHDL完成秒表的设计。
秒表的状态转移图:
VERILOG程序:
modulesecondwatch(key,clk,reset,cnt);
inputkey,clk,reset;
output[5:
0]cnt;
reg[5:
0]cnt,cnt1;
reg[2:
0]state;//因为有5种状态,所以定义状态为三位二进制数
parameters0=3'd0,s1=3'd1,s2=3'd2,s3=3'd3,s4=3'd4;//参数定义
always@(posedgeclk)
begin
if(reset)
state<=s0;
else
case(state)
s0:
begin//清零状态
cnt<=0;cnt1<=0;//cnt1表示运动员一的计数值
if(key==1)//key=1时进入状态S1
state<=s1;
elsestate<=s0;
end
s1:
begin
if(key==1)//key=1时进入状态S2
state<=s2;
elsebeginstate<=s1;//key=0时,计数器一直计数,输出计数值cnt
cnt<=cnt+1;
cnt1<=cnt1+1;
end
end
s2:
begin
if(key==1)//key=1时进入状态S3
state<=s3;
elsebegin
state<=s2;
cnt<=cnt+1;
end
end
s3:
begin
if(key==1)//key=1时进入状态S4
state<=s4;
elsestate<=s3;//否则保持状态S3,输出运动员二的计数值
end
s4:
begin
cnt<=cnt1;//输出运动员一的计数值
if(key==1)//key=1时,进入状态S0重新开始计数
state<=s0;
elsestate<=s4;
end
default:
state<=s0;
endcase
end
endmodule
测试模块:
modulesecondwatch_tb;
regclk,reset,key;
wirecnt;
secondwatchm(key,clk,reset,cnt);
initial
begin
reset=1;clk=0;
#30reset=0;
end
always#10clk=~clk;
always@(posedgeclk)
begin
key=0;
#40key=1;
#20key=0;
#200key=1;
#20key=0;
#200key=1;
#20key=0;
#40key=1;
#20key=0;
#50key=1;
#20key=0;
#40key=1;
#20key=0;
end
endmodule
仿真图形:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 双向 移位寄存器 VHDL 设计