实验六8位数码管扫描显示
实验六 8位数码管扫描显示
一、实验目的:1、了解7段数码管的工作原理; 2、学会用于VHDL语言进行程序设计。 二、实验原理:在本实验中,按一下key0,完成复位功能, clk5选择1Hz,clk3选择的频率越高越好。LED的显示模块原理:LED有段码和位码之分,所谓段码就是让LED显示出8.的八位数据,一般情况下要通过一个译码电路,将输入的4位2进制数转换为与LED显示对应的8位段码。位码也就是LED的显示使能端,对于共阴级的LED而言,低电平使能(在本实验箱中所有的LED均位共阴级的),在本实验中设计了一个3位的循环计数器,将计数结果输入到3,8译码器74ls138,译码结果输出即可依次使能每个LED。例如:要让8个LED同时工作,显示数据,就是要不停的循环扫描每一个LED,并在使能每一个LED的同时,输入所需显示的数据对应的8位段码。虽然8个LED是依次显示,但是受视觉分辨率的影响,看到的现象是8个LED同时工作。
三、实验连线:
1、将EP2C5适配板左下角的JTAG用十芯排线和万用下载区左下角的SOPC JTAG 口连接起来,万用下载区右下角的电源开关拨到 SOPC下载的一边
2、实验板右下方频率源 CLK1接任意频率作为扫描频率。
3、将实验板左端的JP103全部用短路帽接上(共八个)。
四、实验
与步骤:(程序:EP2C5\scan_seg8\scan_seg8.sof)
1、打开Quartus II 6.0软件,点击“File?OpenProject”出现如下的对话框(图6.1),选中scan_seg8,点打开即可;
图6.1
2、点击“Tools-Programmer”后出现如下图下载对话窗口,
3、点”Edit?Add File„„„”出现如下对话框(图6.2),在图6.3对话框中,选中EP2C5/scan_seg8/scan_seg8.sof项目后点击打开,回到Programmer对话框, 在下载对话窗口中“选中Program/ Configure”,点击Start”即进行下载。
图6.2
图6.3
现将scan_seg8.vhd原程序作如下说明:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
ENTITY SCAN_SEG8 IS
PORT(CLK3,CLK5 :IN STD_LOGIC;
RST :IN STD_LOGIC;
SEG_DA:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
SEG_SEL:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)
);
END SCAN_SEG8;
ARCHITECTURE ADO OF SCAN_SEG8 IS
SIGNAL SEG_BUF1,SEG_BUF2,SEG_BUF3,SEG_BUF4,SEG_BUF0:STD_LOGIC_VECTOR(3
DOWNTO 0);
SIGNAL SEG_BUF5,SEG_BUF6,SEG_BUF7,SEG_BUF8 :STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL SEG_CNT :STD_LOGIC_VECTOR(2 DOWNTO 0);
SIGNAL SEG_TEMP:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL CLK:STD_LOGIC;
BEGIN
PROCESS (CLK5)
BEGIN
IF CLK5'EVENT AND CLK5='1' THEN
CLK<=NOT CLK;
END IF;
END PROCESS;
PROCESS(CLK5,RST)
BEGIN
IF CLK5'EVENT AND CLK5='1' THEN
IF CLK='1' THEN
SEG_BUF1<= "0001";
SEG_BUF2<= "0010";
SEG_BUF3<= "0011";
SEG_BUF4<= "0100";
SEG_BUF5<= "0101";
SEG_BUF6<= "0110";
SEG_BUF7<= "0111";
SEG_BUF8<= "1000";
ELSE
SEG_BUF0<=SEG_BUF8;SEG_BUF8<=SEG_BUF7;SEG_BUF7<=SEG_BUF6;SEG_BUF6<=SEG_BUF5
;
SEG_BUF5<=SEG_BUF4;SEG_BUF4<=SEG_BUF3;SEG_BUF3<=SEG_BUF2;SEG_BUF2<=SEG_BUF1
;SEG_BUF1<=SEG_BUF0;
END IF;
END IF;
END PROCESS;
PROCESS (CLK3,RST)
BEGIN
IF CLK3'EVENT AND CLK3='1' THEN
IF RST='1' THEN
SEG_CNT<="000";
ELSE
SEG_CNT<=SEG_CNT+1;
END IF;
END IF;
END PROCESS;
SEG_SEL<=SEG_CNT;
PROCESS (SEG_CNT,
SEG_BUF1,SEG_BUF2,SEG_BUF3,SEG_BUF4,SEG_BUF5,SEG_BUF6,SEG_BUF7,SEG_BUF8)
BEGIN
CASE SEG_CNT IS
WHEN O"0" => SEG_TEMP<=SEG_BUF1;
WHEN O"1" => SEG_TEMP<=SEG_BUF2;
WHEN O"2" => SEG_TEMP<=SEG_BUF3;
WHEN O"3" => SEG_TEMP<=SEG_BUF4;
WHEN O"4" => SEG_TEMP<=SEG_BUF5;
WHEN O"5" => SEG_TEMP<=SEG_BUF6;
WHEN O"6" => SEG_TEMP<=SEG_BUF7;
WHEN O"7" => SEG_TEMP<=SEG_BUF8;
WHEN OTHERS=> SEG_TEMP<="XXXX";
END CASE;
END PROCESS;
PROCESS(SEG_TEMP)
BEGIN
CASE SEG_TEMP IS
WHEN "0000" => SEG_DA<="00111111";
WHEN "0001" => SEG_DA<="00000110";
WHEN "0010" => SEG_DA<="01011011";
WHEN "0011" => SEG_DA<="01001111";
WHEN "0100" => SEG_DA<="01100110";
WHEN "0101" => SEG_DA<="01101101";
WHEN "0110" => SEG_DA<="01111101";
WHEN "0111" => SEG_DA<="00000111";
WHEN "1000" => SEG_DA<="01111111";
WHEN "1001" => SEG_DA<="01101111";
WHEN "1010" => SEG_DA<="01110111";
WHEN "1011" => SEG_DA<="01111100";
WHEN "1100" => SEG_DA<="00111001";
WHEN "1101" => SEG_DA<="01011110";
WHEN "1110" => SEG_DA<="01111001";
WHEN "1111" => SEG_DA<="01110001";
WHEN OTHERS => NULL;
END CASE;
END PROCESS;
END ADO;
引脚分配(Cyclone EP2C5Q208C8):
seg_d0-P3、seg_d1-P5、seg_d2-P6、seg_d3-P8、seg_d4-P10、seg_d5-P11、seg_d6-P12,sel0-P141、sel1-P142、sel2-P143,clk-P130, rst-43.
管脚标号seg_d 0到seg_d 6分别接到LED的8位段码中的7位上(由于实验中不需要在LED上显示“.”,因此8位段码中显示“.”的数据没有接入,其默认为低电平,有兴趣的同学可以自己修改一下程序,其管脚分配如附录三所示);sel0到sel2接到实验箱中74ls138的输入端;clk为LED显示时钟输入,接到频率源clk1。100脚接key0用来复位。管脚标号对应的I/O如下图所示:
User
Assignments Node Name set_location_assignment PIN_3 -to seg_da[0] set_location_assignment PIN_5 -to seg_da[1] set_location_assignment PIN_6 -to seg_da[2] set_location_assignment PIN_8 -to seg_da[3] set_location_assignment PIN_10 -to seg_da[4] set_location_assignment PIN_11 -to seg_da[5] set_location_assignment PIN_12 -to seg_da[6] set_location_assignment PIN_141 -to seg_sel[0] set_location_assignment PIN_142 -to seg_sel[1] set_location_assignment PIN_143 -to seg_sel[2] set_location_assignment PIN_145 -to clk5 set_location_assignment PIN_43 -to rst
set_location_assignment PIN_130 -to clk3 五、实验现象:会发现,在8个数码管显示"8,7,6,5,4,3,2,1"的数据隔一秒中,数据向左移动,显示"7,6,5,4,3,2,1,8"