硬件描述语言十:中期考核实验题目
1、实验目的:考核学生学习VHDL语言的效果。
2、实验环境:PC个人计算机、Windows操作系统、Quartus II集成开发环境软件。
3、实验要求:Error_Find_clear文件夹中有四个含有错误的VHDL语言源码文件及相应的仿真波形文件,修改源代码并完成实验步骤所要求的设计流程,得到仿真结果并加以分析。
4、实验步骤:①建立工程、②编辑代码、③编译及修改源码文件中的错误、④用已经提供的仿真波形文件进行仿真、⑤根据仿真结果分析模块的功能。
第一个ff_d:
第二个counter12:
第三个counter15we:
第四个encounter__83(尸体名字应该为encounter_83,两个_违反规则):
- 实验数据及结果分析:
第一个ff_d:
第二个counter12:
第三个counter15we:
第四个encounter__83(尸体名字应该为encounter_83,两个_违反规则):
通过对多组实验数据的分析,判断其符合预期结果。如图所示,并且结果修改完成后符合实验预期。
- 实验结论:
这四个实验代码均有错误,并且有很多都是小的错误点如单引号与双引号之间转换出错等,还有是否调用了所用函数包的问题(如第二个实验use ieee.std_logic_arith.all算术集),而且项目名需要和vhdl文件的名字一样,且项目名命名时必须符合规则,不能出现两条_,使用位矢量时必须注明位宽。
- 总结及心得体会:
通过这次实验,我意识到了自己的代码能力仍然不足,仍需努力,关于VHDL语法的运用也不是很熟练,仍需要多加学习和练习。
- 附录(实验源码)
第一个ff_d:
library ieee;
use ieee.std_logic_1164.all;
entity ff_d is
port
(
clk,set,clr,d : in std_logic;
q,nq : buffer std_logic --out改成buffer
);
end entity;
architecture rtl of ff_d is
begin
process (clk,clr)
begin
if (clr='0') then
q <= '0';
else if( clk'event and clk='1') then
if (set = '0' )then
q <= '1';
else
q <= d;
end if;
end if;
end if;
nq <= not q; --nq为q的非,永远为q反
end process;
end rtl;
第二个counter12:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all; --有这个算数包集合才可以使用数据转换函数conv_std_logic_vector,将数据转成要求位数的二进制
entity counter12 is
port
(
clk,clr : in std_logic;
q : out std_logic_vector(3 downto 0);
co : out std_logic
);
end entity;
architecture rtl of counter12 is
signal q_s: integer range 0 to 15:=0; --q-s都要改为q_s,q-s不符合命名规则,-为标识符
begin
process (clk)
begin
if (clk'event) and (clk='1') then
if clr = '0' then
q <= "0000"; co <= '0';
else
if (q_s>=11) then
q_s <=0; co <= '1';
else
q_s <= q_s +1; co <= '0';
end if;
end if;
end if;
q<=conv_std_logic_vector(q_s,4);--数据类型转换,把integer实数转换为几位的二进制数组
end process;
end rtl;
第三个counter15we:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity counter15we is
port
(
clk,we : in std_logic;
q : inout std_logic_vector(3 downto 0);
co : out std_logic
);
end entity counter15we;
architecture rtl of counter15we is
signal q_s : std_logic_vector(3 downto 0);
begin
process (clk)
begin
if we = '1' then
q <= q_s;
else
q <= "ZZZZ";
end if;
if (clk'event and clk='1') then
if(we = '0') then
q_s <= q; co <= '0';
elsif(we/='0')then --当we不为0时
if(q_s="1111") then
q_s <= "0000";--q_s是4位数组,给q_s赋值需要双引号
co <= '1';
else
q_s <= q_s + '1'; co <= '0';
end if;
end if;
end if;
end process;
end rtl;
第四个encounter__83(尸体名字应该为encounter_83,两个_违反规则):
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY encode_83 IS --错误点在名字中有两个__,违反命名规则,所以改成一个_
PORT
(
en,i0,i11,i2,i3,i4,i5,i6,i7 : IN STD_LOGIC;
d : OUT STD_LOGIC_VECTOR(2 DOWNTO 0);
nul,inv : OUT STD_LOGIC
);
END encode_83;
ARCHITECTURE rtl OF encode_83 IS
SIGNAL i : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
i <= i0 & i11 & i2 & i3 & i4 & i5 & i6 & i7;
PROCESS (en, i)
BEGIN
if (en ='0')THEN --en不是int类型,需要输入0或1时要加引号
d<= "ZZZ";
nul<='Z';
inv<= 'Z';
ELSE
case i is
WHEN "01111111" => d <= "000"; nul <= '0'; inv <= '0';
WHEN "10111111" => d <= "001"; nul <= '0'; inv <= '0';
WHEN "11011111" => d <= "010"; nul <= '0'; inv <= '0';
WHEN "11101111" => d <= "011"; nul <= '0'; inv <= '0';
WHEN "11110111" => d <= "100"; nul <= '0'; inv <= '0';
WHEN "11111011" => d <= "101"; nul <= '0'; inv <= '0';
WHEN "11111101" => d <= "110"; nul <= '0'; inv <= '0';
WHEN "11111110" => d <= "111"; nul <= '0'; inv <= '0';
WHEN "11111111" => d <= "111"; nul <= '1'; inv <= '0';
when others =>d<="000";nul<='0';inv<='0';--要写上这个,说明其他情况的时候输出会是怎么样
END CASE;
END IF;
END PROCESS;
END rtl;