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。