数电实验报告
- 格式:docx
- 大小:81.73 KB
- 文档页数:13
数字电路与逻辑设计实验报告 1 一. 实验名称数码管扫描显示控制器设计与实现 二. 实验目的 ① 掌握VHDL语言的语法规范,掌握时序电路描述方法。 ② 掌握多个数码管动态扫描现实的原理及设计方法。 三. 实验所用仪器及元器件 ① 计算机:装有Quartus软件,为VHDL语言提供操作场所。 ② 直流稳压电源:通过USB接口实现,为实验开发板提供稳定电源。 ③数字系统与逻辑设计实验开发板:使试验结果下载到开发板上,实现整个实验的最终结果。 四.实验原理与实验任务 多个数码管动态扫描显示,是将所有数码管的相同段并联在一起,通过选通信号分时控制各个数码管的公共端,循环依次点亮多个数码管,利用人眼的视觉暂留现象,只要扫描的频率大于50HZ,将看不到闪烁现象。 当闪烁显示的发光二极管闪烁频率较高时我们将观察到持续点亮的现象。同理,当多个数码管依次显示,当切换速度够快时,我们将观察到所有数码管都是同事在显示。一个数码管要稳定显示要求显示频率>50hz,那么6个数码管则需要50*6=300hz以上才能看到持续稳定点亮的现象。 四. 实验内容 ①用VHDL语言设计并实现六个数码管串行扫描电路,要求同数字电路与逻辑设计实验报告 2 时显示0、1、2、3、4、5这6个不同的数字图形到6个数码管上,仿真并下载验证其功能。 ②用VHDL语言设计并实现六个数码管滚动显示电路。 1) 循环左滚动,始终点亮6个数码管,左出右进。状态为:012345→123450→234501→345012→450123→501234→012345 2) 向左滚动,用全灭的数码管填充右边,直至全部变灭,然后再一次从右边一个一个的点亮。状态为012345→12345X→2345XX→345XXX→45XXXX→5XXXXX→XXXXXX→XXXXX0→XXXX01→XXX012→XX0123→X01234→012345,其中“X”表示数码管不显示。 五. 设计思路及过程 串行显示设计思路:数码管串行扫描显示012345六个数,利用视觉暂留使人感觉6个数稳定显示。利用状态机来实现,定义六个状态分别表示0至5六个数,时钟到来时转到下一个状态,这样就可以依次点亮6个数码管,每次显示不同的数字(状态)。 串行显示VHDL代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY lzf261 IS PORT(clk: IN STD_LOGIC; s:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));--select LED END lzf261;
ARCHITECTURE Moore OF lzf261 IS TYPE state_type IS (s1,s2,s3,s4,s5,s6); 数字电路与逻辑设计实验报告 3 SIGNAL current_state,next_state:state_type; BEGIN P1:PROCESS(current_state) BEGIN CASE current_state IS WHEN s1=>next_state<=s2; WHEN s2=>next_state<=s3; WHEN s3=>next_state<=s4; WHEN s4=>next_state<=s5; WHEN s5=>next_state<=s6; WHEN s6=>next_state<=s1;--transform END CASE; END PROCESS;
P2:PROCESS(clk)--clock BEGIN IF(clk'EVENT AND clk='1') THEN current_state<=next_state; END IF; END PROCESS;
P3:PROCESS(current_state) --Display BEGIN CASE current_state IS WHEN s1 =>s<="1111110";cat<="011111"; WHEN s2 =>s<="0110000";cat<="101111"; WHEN s3 =>s<="1101101";cat<="110111"; WHEN s4 =>s<="1111001";cat<="111011"; WHEN s5 =>s<="0110011";cat<="111101"; WHEN s6 =>s<="1011011";cat<="111110";--output END CASE; END PROCESS; END Moore;
滚动显示设计思路:数码管滚动显示依然采用状态机语言进行设计。
定义了一个状态,使用单进程方式和选择语句将每个可能显示的状态都列出来,再加一个分频器使显示能稳定下来。 滚动显示①VHDL代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; 数字电路与逻辑设计实验报告 4 USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY lzf262 IS PORT(clk: IN STD_LOGIC; s:OUT STD_LOGIC_VECTOR(6 DOWNTO 0); cat:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)); END lzf262;
ARCHITECTURE Moore OF lzf262 IS TYPE state_type IS (s1,s2,s3,s4,s5,s6); SIGNAL state:state_type; SIGNAL x:INTEGER RANGE -1 TO 6:=-1; SIGNAL y:INTEGER RANGE 0 TO 6:=0; SIGNAL clk_out:STD_LOGIC; SIGNAL tmp:INTEGER RANGE 0 TO 599;
BEGIN p1:PROCESS(clk) BEGIN IF (clk'event AND clk='1')THEN IF tmp=599 THEN tmp<=0; ELSE tmp<=tmp+1; END IF; END IF; END PROCESS p1;
p2: PROCESS(tmp) BEGIN IF tmp=599 THEN clk_out<='1'; ELSE clk_out<='0'; END IF; END PROCESS p2; --Frequency Segmentation
p3:PROCESS(clk_out) --Display BEGIN IF(clk'EVENT AND clk='1') THEN IF(y=5) THEN y<=0; END IF; IF x=5 Then 数字电路与逻辑设计实验报告 5 y<=y+1; x<=0; ELSE x<=x+1; END IF;
IF(y=0) THEN CASE state IS WHEN s1 =>s<="1111110";cat<="011111";state<=s2;--0 WHEN s2 =>s<="0110000";cat<="101111";state<=s3; WHEN s3 =>s<="1101101";cat<="110111";state<=s4; WHEN s4 =>s<="1111001";cat<="111011";state<=s5; WHEN s5 =>s<="0110011";cat<="111101";state<=s6; WHEN s6 =>s<="1011011";cat<="111110";state<=s1; END CASE; ELSIF(y=1) THEN CASE state IS WHEN s1 =>s<="0110000";cat<="011111";state<=s2;--1 WHEN s2 =>s<="1101101";cat<="101111";state<=s3; WHEN s3 =>s<="1111001";cat<="110111";state<=s4; WHEN s4 =>s<="0110011";cat<="111011";state<=s5; WHEN s5 =>s<="1011011";cat<="111101";state<=s6; WHEN s6 =>s<="1111110";cat<="111110";state<=s1; END CASE; ELSIF(y=2) THEN CASE state IS WHEN s1 =>s<="1101101";cat<="011111";state<=s2;--2 WHEN s2 =>s<="1111001";cat<="101111";state<=s3; WHEN s3 =>s<="0110011";cat<="110111";state<=s4; WHEN s4 =>s<="1011011";cat<="111011";state<=s5; WHEN s5 =>s<="1111110";cat<="111101";state<=s6; WHEN s6 =>s<="0110000";cat<="111110";state<=s1; END CASE; ELSIF(y=3) THEN CASE state IS WHEN s1 =>s<="1111001";cat<="011111";state<=s2;--3 WHEN s2 =>s<="0110011";cat<="101111";state<=s3; WHEN s3 =>s<="1011011";cat<="110111";state<=s4; WHEN s4 =>s<="1111110";cat<="111011";state<=s5; WHEN s5 =>s<="0110000";cat<="111101";state<=s6; WHEN s6 =>s<="1101101";cat<="111110";state<=s1; END CASE; ELSIF(y=4) THEN CASE state IS