hnu 数字电路 实验4.3 寄存器组

3.用VHDL语言设计3个8位寄存器组成的寄存器组,实现读写操作
① 理解要求,需要完成一个由3个8位寄存器组成的通用寄存器组。当处于时钟下降沿时,若使能信号WE=0,则根据WA将数据对应写入到相应寄存器中(WA=00->A寄存器,WA=01->B寄存器,WA=10->C寄存器),RA信号是什么无所谓;当RA有效时控制相应寄存器的值从S口输出(RA=00->A寄存器,RA=01->B寄存器,RA=10->C寄存器),WA控制相应寄存器的值从D口输出(WA=00->A寄存器,WA=01->B寄存器,WA=10->C寄存器)。
② 打开QuartusII,新建工程,工程命名为tyjcqz,开始编写源代码。
③ 写好源代码,保存文件。

 library ieee;
use ieee.std_logic_1164.all;

entity tyjcqz is
	port(WE,clk:in std_logic;
		 RA,WA:in std_logic_vector(1 downto 0);
		 i:in std_logic_vector(7 downto 0);
		 S,D:out std_logic_vector(7 downto 0));
end tyjcqz;

architecture achieve of tyjcqz is
signal A:std_logic_vector(7 downto 0):="00000000";
signal B:std_logic_vector(7 downto 0):="00000000";
signal C:std_logic_vector(7 downto 0):="11111111";
begin
	process(clk,A,B,C)
	begin
			if (clk'event and clk='0' and (WE='0')) then
				if WA="00" then
					A<=i;
				elsif WA="01" then
					B<=i;
				elsif WA="10" then
					C<=i;
				end if;
			else
	            A<=A;
	            B<=B;
	            C<=C;
	        end if;
	end process;
	S<=A when RA="00"  else  
	   B when RA="01"  else
	   C when (RA="10" or RA="11")   else  A;
	D<=A when WA="00"  else  
	   B when WA="01"  else
	   C when (WA="10" or WA="11")   else  A;
	   
end achieve;

(如图为源代码)
在这里插入图片描述
④ 编译与调试。确保顶层实现的命名和工程名一致。编译成功。
在这里插入图片描述
⑤ 查看RTL视图。
在这里插入图片描述
⑥ 结果分析及结论。
该RTL图较为复杂,实现的正误我们可通过后续的波形图仿真来判断。
⑦ 功能仿真的波形及验证。
a.新建波形文件。
b.生成网表。
在这里插入图片描述
c.进行功能仿真。
在这里插入图片描述
波形图如下图:
在这里插入图片描述
d.结果分析及结论
20.0,40.0ns时,处于时钟下降沿,WE=0,WA=00,将输入读入到A寄存器,此时A寄存器存储值为00000001,仿真无误;
60.0,80.0ns时,处于时钟下降沿,WE=0,WA=01,将输入读入到B寄存器,此时B寄存器存储值为00000010,仿真无误;
100.0,120.0ns时,处于时钟下降沿,WE=0,WA=10,将输入读入到C寄存器,此时C寄存器存储值为00000011,仿真无误;
120.0ns后,WE!=0,进行读操作:
120.0-160.0ns,WE!=0,RA=00,通用寄存器中A寄存器值从S口输出,S=00000001;WA=00,通用寄存器中A寄存器值从D口输出,D=00000001,仿真无误;
160.0-200.0ns,WE!=0,RA=01,通用寄存器中B寄存器值从S口输出,S=00000010;WA=00,通用寄存器中A寄存器值从S口输出,D=00000001,仿真无误;
200.0-240.0ns,WE!=0,RA=10,通用寄存器中C寄存器值从S口输出,S=00000010;WA=00,通用寄存器中A寄存器值从D口输出,D=00000001,仿真无误;
240.0-280.0ns,WE!=0,RA=00,通用寄存器中A寄存器值从S口输出S=00000001;WA=01,通用寄存器中B寄存器值从D口输出,D=00000010,仿真无误;
280.0-320.0ns,WE!=0,RA=00,通用寄存器中A寄存器值从S口输出S=00000001;WA=10,通用寄存器中C寄存器值从D口输出,D=00000011,仿真无误;
⑧ 实现时序仿真。
a.仿真成功。
在这里插入图片描述
b.时序仿真波形图如下:
在这里插入图片描述
c.结果分析及结论
20.0,40.0ns时,处于时钟下降沿,WE=0,WA=00,将输入读入到A寄存器,此时A寄存器存储值为00000001,因为存在延时,一段时间后才出现变化,仿真无误;
60.0,80.0ns时,处于时钟下降沿,WE=0,WA=01,将输入读入到B寄存器,此时B寄存器存储值为00000010,因为存在延时,一段时间后才出现变化,仿真无误;
100.0,120.0ns时,处于时钟下降沿,WE=0,WA=10,将输入读入到C寄存器,此时C寄存器存储值为00000011,因为存在延时,一段时间后才出现变化,仿真无误;
120.0ns后,WE!=0,进行读操作:
120.0-160.0ns,WE!=0,RA=00,通用寄存器中A寄存器值从S口输出,S=00000001;WA=00,通用寄存器中A寄存器值从D口输出,D=00000001,因为存在延时,一段时间后才出现变化,仿真无误;
160.0-200.0ns,WE!=0,RA=01,通用寄存器中B寄存器值从S口输出,S=00000010;WA=00,通用寄存器中A寄存器值从S口输出,D=00000001,因为存在延时,一段时间后才出现变化,仿真无误;
200.0-240.0ns,WE!=0,RA=10,通用寄存器中C寄存器值从S口输出,S=00000010;WA=00,通用寄存器中A寄存器值从D口输出,D=00000001,因为存在延时,一段时间后才出现变化,仿真无误;
240.0-280.0ns,WE!=0,RA=00,通用寄存器中A寄存器值从S口输出S=00000001;WA=01,通用寄存器中B寄存器值从D口输出,D=00000010,因为存在延时,一段时间后才出现变化,仿真无误;
280.0-320.0ns,WE!=0,RA=00,通用寄存器中A寄存器值从S口输出S=00000001;WA=10,通用寄存器中C寄存器值从D口输出,D=00000011,因为存在延时,一段时间后才出现变化,仿真无误;

d.编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)
在这里插入图片描述
从S1到S1耗时最长,为8.527ns,从D1到D1耗时最短,为6.167ns,可结果由耗时最长的那个决定,故整体耗时为8.527ns。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值