2.用VHDL语言设计模型机的移位模块
① 理解题意,分析题目要求我们实现模型机中的移位模块,即通过fbus,flbus,frbus三个使能信号,分别控制移位模块完成直达、左移一位、右移一位的操作,将移位后的w信号输出,并更新cf的值。
② 打开Quartus II,新建工程,工程命名为move_logic,开始编写源代码。
③ 写好源代码,保存文件。
LIBRARY IEEE;
use ieee.std_logic_1164.all;
entity move_logic is
port(fbus,flbus,frbus:in std_logic;
a:in std_logic_vector(7 downto 0);
cf:out std_logic;
w:out std_logic_vector(7 downto 0));
end move_logic;
architecture achieve of move_logic is
begin
process(fbus,flbus,frbus)
begin
if(fbus='1') then
w<=a;
cf<='0';
elsif(flbus='1') then
w<=a(6 downto 0)&a(7);
cf<=a(7);
elsif(frbus='1') then
w<=a(0)&a(7 downto 1);
cf<=a(0);
else
w<="ZZZZZZZZ";
cf<='0';
end if;
end process;
end achieve;
(如图为源代码)
④ 编译与调试。确保顶层实现的命名和工程名一致。编译成功。
⑤ 查看RTL视图。
⑥ RTL图如上图所示。可以明显看出,这个视图较为复杂,通过视图来判断逻辑是否正确难度较大,所以逻辑的正确性我们将通过后续的波形图来
⑦ 功能仿真的波形及验证。
a.新建波形文件。将选择输入s2-s0输入,并指定被选择的x7-x0。
b.生成网表,功能仿真。生成网表成功。
功能仿真成功。功能仿真波形图如图所示:
c.结果分析及结论
0-20.0ns,fbus=1,flbus=frbus=0,a向量11110000直达通过移位模块,输出w为11110000,此时cf保持原值不变,输出无误。
30.0-50.0ns,flbus=1,fbus=frbus=0,a向量11110000左移一位,输出w为11100001,并将第一位的移位数值1传给cf,输出无误。
60.0-80.0ns,frbus=1,fbus=flbus=0,a向量11110000右移一位,输出w为01111000,并将最后一位的移位数值0传给cf,输出无误。
⑧ 实现时序仿真。
a.时序仿真成功。
b.时序仿真波形图如下:
c.结果分析及结论
0-20.0ns,fbus=1,flbus=frbus=0,a向量11110000直达通过移位模块,输出w为11110000,此时cf保持原值不变,输出无误。
20.0-27.14,此时fbus=flbus=frbus=0,应该输出高阻,但因为存在延时,w=11110000,cf依旧保持原值不变。
30.0-39.55ns,此时flbus=1,fbus=frbus=0,应进行左移,但因为存在延时,输出w仍为高阻。
39.55-50.0ns,flbus=1,fbus=frbus=0,a向量11110000左移一位,输出w为11100001,并将第一位的移位数值1传给cf。
50.0-56.94ns,此时fbus=flbus=frbus=0,应该输出高阻,但因为存在延时,w=11100001,cf依旧保持原值不变。
60.0-67.86ns,此时frbus=1,fbus=flbus=0,应进行右移,但因为存在延时,输出w仍为高阻。
67.86-80.0ns,frbus=1,fbus=flbus=0,a向量11110000右移一位,输出w为01111000,并将最后一位的移位数值0传给cf。
80.0-86.63ns,此时fbus=flbus=frbus=0,应该输出高阻,但因为存在延时,w=01111000,cf依旧保持原值不变。
d.编译【classic timing analysis】-在compilation report中选择【timing analysis】-【tpd】(引脚到引脚的延时)
从a5到w5耗时最长,为8.736ns,从frbus到w2耗时最短,为7.361ns,可结果由耗时最长的那个决定,故整体耗时为8.736ns。