资源描述
短学期 接口实验 VHDL编程
实验任务:
用VHDL编程实现十六进制的计数显示。并通过仿真或观察波形验证设计电路的正确性。最后在SE-5M型EDA实验开发系统上执行验证结果。
实验设备:
SE-5M 型EDA实验开发系统,Maxplus 9.23 。
实验原理:
首先用MAxplus编写程序,然后进行编译,进行管叫设定,最后将程序下再到实验版的下载板上验证程序。
实验用到了以下管角:
时钟信号CP1(CP2): 进行时钟信号设定。总共有12个信号源,根据所需的时钟频率,跳线设置。
键盘扫描相应管角:Se-5M中有一个4X4的矩阵键盘,其连接图如下,键盘矩阵是与89C51和管理芯片(F7128)直接相连,而通过管理芯片键盘阵列实现了与CPLD间接相连,他是通过KEY来实现的。当CZ1的KEY置ON时,CPLD可与89C51的P1口相连或者键盘阵列相连,当CZ1D的KEY置OFF时,89C51的P1口及键盘阵列与CPLD断开。当CPLD和小键盘相连时H1-H4用于发出扫描信号,V1-V4为接收扫描信号,即H1-H4为输出管角,V1-V4为输入管角。
在具体在操作中,一个作为行扫描,一个作为列扫描,从而最终确定用户所按的键。
CPLD
管理芯片
89C51
(p1口)
RAM
键盘阵列
静态显示数码管M1-M2:用来选择最终的显示结果在哪一数码管上进行显示,例,要在最左边的那个数码管上显示结果,相应的值应该是“10000000”,如果要所有的数码管都显示,相应的值就是“11111111”。
动态显示数码管M3-M4: 用来将最终的结果显示在数码管上,由于要把每个数字或字母分成7段来显示,所以采用了动态扫描电路方式,将静态现实中的数码管M3,M4对应的8个I/O口用于动态显示的数码管的8个管,由于此处没用到小数点位dp,故总设它为0。关于7段的分发和具体对应的数字和字符,祥见下图和下表:
A
b
c
d
e
f
g
0
1
1
1
1
1
1
0
1
0
1
1
0
0
0
0
2
1
1
0
1
1
0
1
3
1
1
1
1
0
0
1
4
0
1
1
0
0
1
1
5
1
0
1
1
0
1
1
6
0
0
1
1
1
1
1
7
1
1
1
0
0
0
0
8
1
1
1
1
1
1
1
9
1
1
1
1
0
1
1
A
1
1
1
0
1
1
1
B
0
0
1
1
1
1
1
C
1
0
0
1
1
1
0
D
1
1
1
1
1
0
1
E
1
0
0
1
1
1
1
F
1
0
0
1
1
1
1
编程思想:
首先要对输入输出数据进行定义,有两个4位的数组COL,ROW分别相对应输入的行和输出的列,从而最终可以确定用户所按得键。还有两个8位的数组OUT,SELE,分别对应最终的7段码的显示和那一个数码管负责显示。最后一个需要定义的就是时钟变量clk。
其次就是要进行键盘扫描,在具体在操作中,一个作为行扫描,一个作为列扫描,然后两者前后连接起来,作为一个8位长的数可以唯一确定用户所按得键。
最后就是根据上面这个数来确定7段码。
源程序:
LIBRARY IEEE;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY SCAN IS
PORT (COL: IN std_logic_vector(3 downto 0);
ROW: buffer std_logic_vector(3 downto 0);
P_OUT : OUT std_logic_vector(7 DOWNTO 0);
SELE : OUT std_logic_vector(7 downto 0);
clk : in std_logic);
END SCAN;
ARCHITECTURE PRINT OF SCAN IS
signal BUF: std_logic_VECTOR (7 DOWNTO 0);
BEGIN
P1: PROCESS(clk)
BEGIN
if (clk'event and clk='1') then
case ROW is
when "1110"=> ROW <="1101";
when "1101"=> ROW <="1011";
when "1011"=> ROW <="0111";
when others => ROW <="1110";
end case;
end if;
end process P1;
P2: process(CLK)
variable tmp: std_logic_VECTOR (7 DOWNTO 0);
begin
if (clk'event and clk='0') then
if (COL/="1111") then
tmp := ROW&COL;
case tmp is
WHEN "11101110" => BUF <= "11111100";
WHEN "11011110" => BUF <= "01100000";
WHEN "10111110" => BUF <= "11011010";
WHEN "01111110" => BUF <= "11110010";
WHEN "11101101" => BUF <= "01100110";
WHEN "11011101" => BUF <= "10110110";
WHEN "10111101" => BUF <= "10111110";
WHEN "01111101" => BUF <= "11100000";
WHEN "11101011" => BUF <= "11111110";
WHEN "11011011" => BUF <= "11110110";
WHEN "10111011" => BUF <= "11101110";
WHEN "01111011" => BUF <= "11111110";
WHEN "11100111" => BUF <= "10011100";
WHEN "11010111" => BUF <= "11111100";
WHEN "10110111" => BUF <= "10011110";
WHEN "01110111" => BUF <= "10001110";
when others => BUF <="00000000";
end case;
end if;
end if;
end process P2;
P3: process(clk)
begin
if(clk'event and clk='0') then
if (BUF /= "00000000" ) then
SELE<="11111110";
P_OUT <=BUF;
end if;
end if;
end process P3;
END PRINT;
展开阅读全文