资源描述
本科实验报告
实验名称: 可编程逻辑器件实验报告
课程名称:
可编程逻辑器件
实验时间:
任课教师:
实验地点:
实验教师:
实验类型:
□ 原理验证
■ 综合设计
□ 自主创新
学生姓名:
学号/班级:
组 号:
学 院:
同组搭档:
专 业:
成 绩:
9999计数器
一、实验目的
编程实现一个含清零功能9999计数器,并用7段数码管显示。
二、实验器材
EPM7128STC100-15,计算机
三、实验过程
(1)原理分析
a、分频
要实现一个0-9999计数器,并且肉眼可观,但是EPM7128STC100-15系统只有一个6M的时钟,频率太高,肉眼不可见,因此得用一个分频器将系统时钟降下来。本实验用了6个74LS190 BCD计数器级联,可实现1000000分频,从而将系统时钟变为6HZ。
b、计数
系统分频之后,接下来实现计数,仍然用74LS190 BCD计数器4个级联实现0~9999的计数功能,将每个计数器的管脚输出。
c、扫描
实验要求用4个7段数码管输出,计数输出是4个二进制数,因此本步骤的功能是将每个二进制数对应于一个7段数码管,再把单片机系统的时钟(6M Hz)作为扫描的时钟,从而实现4个7段数码管同步显示。
d、译码
计数输出的是0000~1001二进制形式的数,而7段数码管是a~b~c~d~e~f~g七段数码管,要实现这两个的连接,需要一个译码器,来将这四个数同步的显示在七段数码管上。
(2)程序及图形设计
a、分频和计数
图形设计如下:
画好上面的图以后编译后再将上面的设计为一整个芯片,如下图所示:
b、扫描
代码:
--********************************************
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--********************************************
ENTITY Scaner is
PORT(
rst : in std_logic; -- System RST
clk : in std_logic; -- System Clock
a,b,c,d : in std_logic_vector(3 downto 0);
o_data : out std_logic_vector(3 downto 0);
o_comm : out std_logic_vector(3 downto 0) -- disp bit ctrl
);
END Scaner;
--*********************************************
architecture action of Scaner is
type s_type is (LED0,LED1,LED2,LED3);
signal s_LED : s_type; -- State Signal Declare
begin
process(clk,rst)
begin
if rst = '0' then
o_comm <= "1111";
o_data <= "1111";
s_LED <= LED0;
elsif clk'Event and clk = '1' then
case s_LED is -- enter the state of LED when it begin
when LED0 =>
o_comm <= "1110";
o_data <= d;
s_LED <= LED1;
when LED1 =>
o_comm <= "1101";
o_data <= c;
s_LED <= LED2;
when LED2 =>
o_comm <= "1011";
o_data <= b;
s_LED <= LED3;
when LED3 =>
o_comm <= "0111";
o_data <= a;
s_LED <= LED0;
when others =>
s_LED <= LED0;
o_comm <= "1111";
end case;
end if;
end process;
--/////////////////////////////////////////////
end action;
同理,画好上面的图以后编译后再将上面的设计为一整个芯片,如下图所示:
c、译码
源代码:
--********************************************
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--********************************************
ENTITY encoder is
PORT(
i_data : in std_logic_vector(3 downto 0); -- System Data Bus(in)
i_rst : in std_logic; -- System RST
o_code : out std_logic_vector(7 downto 0) -- LED SEGCODE
);
END encoder;
--*********************************************
architecture behavior of encoder is
begin
process (i_rst,i_data)
begin
if i_rst = '0' then --Reset State
o_code <= "11111111";
else
case i_data is
when "0000" => o_code <= "00111111";
when "0001" => o_code <= "00000110";
when "0010" => o_code <= "01011011";
when "0011" => o_code <= "01001111";
when "0100" => o_code <= "01100110";
when "0101" => o_code <= "01101101";
when "0110" => o_code <= "01111101";
when "0111" => o_code <= "00000111";
when "1000" => o_code <= "01111111";
when "1001" => o_code <= "01101111";
when others => o_code <= "01111011";
end case;
end if;
end process;
end behavior;
同理,画好上面的图以后编译后再将上面的设计为一整个芯片,如下图所示:
(3)模块的连接
打开一个新的图形编辑窗口,用刚刚设计的芯片设计电路,如下图:
(4)管脚的分配
将设计好的电路分配到单片机的管脚上,具体分配如下:
名称 管脚号
rst 89
clk 87
o_coad[0] 75
o_coad[1] 72
o_coad[2] 71
o_coad[3] 70
o_coad[4] 69
o_coad[5] 68
o_coad[6] 67
o_coad[7] 65
o_comm[0] 61
o_comm[1] 63
o_comm[2] 64
o_comm[3] 77
(5)烧程序
打开Quartus II Programmer ,选择pof文件打开,烧入单片机,具体界面如下图:
观察结果。
四、实验结果及问题分析
a、实验结果:
烧好板子之后,可以看到板子上的7段数码管从0开始计数。
b、问题分析:
第一次烧进之后板子开始计数,但是显示的数不是0~9依次计数,而是比较乱,并且现实的数不是0~9之间的某一个数,像是乱码,查看译码器之后确定译码器没有问题,各个对应的数都正确。
最后检查到计数器和扫描器之间的时候,发现计数器后面括号中是从小到大,也就是说MSB是最右边的一位,而扫描器括号中是从大到小,也就是说MSB是最左边的一位。意识到把计数的大小顺序弄错之后,再修改了之后,计数器正常运行。
五、心得体会
这学期本来就学VHDL语言,虽然软件用的不一样,但是语法结构是一样的。经过了系统的VHDL语言的学习,这门课的VHDL语言没有什么问题,而我从这门课学到最多的是怎么将软件语言和硬件联系到一起,将计算机语言烧录到单片机中的步骤和方法。学会了一门单片机的编程,烧录等一系列的步骤,学习其他的单片机就会容易的很多。
最后,感谢老师和师哥的教诲及帮助。
展开阅读全文