北邮数电实验报告_双色点阵

北京邮电大学

数电综合实验报告

实验名称:双色点阵显示控制器

学院:

姓名:

班级:

学号:

班内序号:

一.设计课题的任务要求

用8×8点阵设计双色点阵显示控制器 基本要求: 1、固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn 按钮实现亮度调节,亮度变化视觉效果要尽量明显。

2、用从红到绿8级渐变色显示一个固定汉字或图形。

3、分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字或图形,显示过程中,显示方式用一个btn 按键进行切换。

4、显示的图形或汉字要尽量饱满美观。 提高要求:

滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。 自拟其它功能。

二.

系统设计

1. 设计思路

考虑本程序设计要求模块明确单一但需要变化多种状态,因此采用单模块多状态多进程方式实现。

其中防抖进程用于检测输入,本程序使用BTN 按键进行输入控制,而按键的键入可能由于抖动产生多个上升沿,对程序的控制产生影响。防抖动采用了延时原理来对冒险或长时间按键电平进行处理。

分频使用了多个进程产生程序所需要的多个时钟频率。 包括:clk1(扫描时钟 大于480Hz 但不过高)

clk2(占空比调节1 clk1周期的整数倍,但不过高) clk3(占空比调节2 同clk2,但占空比不同) clk4(占空比调节3 同clk2,但占空比不同) clk5(按键时钟 约100Hz) clk6(滚动变化计时 约1Hz)

状态机变化进程用于管理状态变化,当遇到按键电平信号时根据规则改变对应状态。 显示进程包括主要显示进程和一些辅助进程,辅助进程完成了时钟对应计数器计数,主进程则根据状态变化显示不同显示模式下不同的图案。

2. 总体框图

(1) 总体结构框图:

(2) 逻辑划分框图

Mode

(3)MDS图

3.各进程介绍

⑴分频进程们

分频进程含一个从50M(也可能是25M)分出的扫描频率clk1,这个频率要大于60*8=480Hz(因为人眼分辨频率为60Hz左右,要保证每排扫描时达到60Hz 则需480Hz)。然后以clk1为基准频率,将clk2、clk3、clk4以clk1的8倍数作占空比调整。

具体是,clk2、clk3、clk4均记为clk1的48分频,然后占空比调为32:16,24:24,16:32

做8倍数的原因是为了保证至少每扫完一屏才有一次占空比调整,否则在主频率不足情况下可能有些排暗有些排亮(详见问题分析)

最后再将周期约为100ms的按键时钟clk5和周期为1s的滚动时钟clk6分出就可以了。

⑵状态机进程

没什么可说的,我写的是单进程状态机,防止了多进程状态机可能带来的冒险。敏感量直接写的是防抖动输出的信号,本以为没必要加同步时序,但事实证

明这是有问题的。(详见代码分析)

⑶防抖动进程

防抖动我用的是老师给的代码。先阐述一下原理:

按键输入电平做敏感量,将输入赋值给resetmp1。

resetmp1被赋值后,将这段值有时延的赋值给resetmp2,并利用这段时间去判断是否按键仍为1。则面对下面两种情况下防抖程序可以做出调整A.突然翘起的冒险:

此种情况下若r1得到赋值,则r2在下一个时钟沿得到赋值,但由于此时r1电平为低,不能判断成功

B. 长时间按下:

此种情况下r1得到赋值,在赋值给r2的间歇判断正确,而后r2得到赋值后不再有效,因此输出仅有一个按键时钟高电平

Clk

In_signal

Resetmp1

Resetmp2

Out_signal

但在使用该进程的过程中遇到了问题,具体见问题分析。

(4)显示进程

首先说一下点阵显示的原理:

如下图所示,列高电平有效,行低电平有效,当对应高电平和低电平时中间的灯就亮了。

而不同颜色则是由不同亮度的红色灯和绿色灯光混合而成。

由于都是整排显示,为了达到整屏显示效果,需要每排进行扫描,当扫描频率较高时人眼无法分辨则可达到整屏显示。

数码管原理类似,这里不再赘述。

接着说一下亮度调节:

前面已经说过时钟分频的问题,在显示每排前对占空比时钟进行判断,则有些情况会亮,有些情况会灭,这样就能很好的形成明暗效果。

最后说一下滚动:

滚动我是用最笨的方法实现的,即一屏一屏的画出每屏图案。当时我是觉得可能

循环之类的不太好实现,不过有同学使用了循环减少了代码量,我觉得以后很值得借鉴。

三.仿真波形及分析

1、防抖动波形的测试

这两张张图中,mode为输入,并设置了很多毛刺作为干扰电平,可以从图中看出多个干扰电平出现时仅输出一个周期的高电平。那为什么仅有毛刺时也会有输出呢?因为毛刺刚好位于clk5的下降沿,这样的话也会造成程序误判一次输出(这也是这个防抖动程序的不足之处)。而连续多次下降沿毛刺造成的结果却是r1连续两个周期(其实是一个半)的高电平,同步电路就是这样一个特点。

当仅有冒险且冒险未在clk5边沿时,则不会触发电平。如下图所示

关于同步电路问题的下一步讨论(包含同步时钟选用的问题)放在问题分析部分。

2、显示波形测试

从图中可以看出当Mode改变后red_out开始有波形出现,这说明模式已经从m0转变为m1_p1

改变p后,则有:

Clk2为0时则red输出为0,这时就有了亮度的变化。

其它亮度变化以此类推,这里不再赘述。

以上波形显示了最重要的状态变化过程,状态变化后按该状态显示内容显示,只要状态机能正常工作,仿真的任务就基本完成。

四、源代码解析

(由于源程序后半部分属于机械重复,因此省略)

(这里按50M时钟输入写)

Library IEEE;

USE IEEE.STD_LOGIC_1164.All;

ENTITY sc IS

PORT (

clk,mode,p,reset:IN STD_LOGIC; --reset用于复位到m0

red_out,green_out:OUT std_logic_vector(7 downto 0):= "00000000";

row_out:OUT std_logic_vector(7 downto 0):="11111111";

num_out:OUT std_logic_vector(7 downto 0):="00000000"; --用于数码管输出

num_choose:Out std_logic_vector(5 downto 0):="111110"); --用于选择数码管

END sc;

architecture a of sc is

TYPE state_type IS (m0,m1_p1,m1_p2,m1_p3,m1_p4,m2,m3_p1,m3_p2,m3_p3);

signal mode_mp1,mode_mp2,mode_out:STD_logic; --防抖动临时信号(下同)

signal p_mp1,p_mp2,p_out:STD_logic;

signal clk1,clk2,clk3,clk4,clk5,clk6:STD_logic;

signal tmp1:Integer Range 0 To 1000000:=0;

signal tmp2:Integer Range 0 To 200000:=0;

signal tmp3:Integer Range 0 To 50000000:=0;

signal tmp4:Integer Range 0 To 30:=0;

signal tmp5:Integer Range 0 To 30:=0;

signal count:Integer Range 0 To 8:=0;

signal count_2:Integer Range 0 To 4:=0;

signal count_3:Integer Range 0 To 32:=0;

signal clk_tmp:STD_logic;

signal state:state_type;

signal red,green:std_logic_vector(7 downto 0):="00000000";

signal row:std_logic_vector(7 downto 0):="11111110"; Begin

p1_1:Process(clk)

Begin

if (clk'event AND clk = '1') then

if tmp1=50000 then

tmp1 <= 0;

else

tmp1 <= tmp1 + 1;

end if;

if tmp1 < 25000 then

clk1 <= '1';

else

clk1 <= '0';

end if;

end if;

end process p1_1;

p1_2:Process(clk)

Begin

if (clk'event AND clk = '1') then

if tmp2 = 500000 then

tmp2 <= 0;

else

tmp2 <= tmp2 + 1;

end if;

if tmp2 < 250000 then

clk5 <= '1';

clk5 <= '0';

end if;

end if;

end process p1_2;

p1_3:Process(clk)

Begin

if (clk'event AND clk = '1') then if tmp3 = 50000000 then

tmp3 <= 0;

else

tmp3 <= tmp3 + 1;

end if;

if tmp3 < 25000000 then

clk6 <= '1';

else

clk6 <= '0';

end if;

end if;

end process p1_3;

p1_4:Process(clk1)

Begin

if (clk1'event AND clk1 = '1') then if tmp4 = 31 then

tmp4 <= 0;

else

tmp4 <= tmp4 + 1;

end if;

if tmp4 < 24 then

clk2 <= '1';

else

clk2 <= '0';

end if;

if tmp4 < 8 then

clk4 <= '1';

else

clk4 <= '0';

end if;

end process p1_4;

p1_5:Process(clk1)

Begin

if (clk1'event AND clk1 = '1') then

if tmp5 = 15 then

tmp5 <= 0;

else

tmp5 <= tmp5 + 1;

end if;

if tmp5 < 8 then

clk3 <= '1';

else

clk3 <= '0';

end if;

end if;

end process p1_5;

小结:上面几个分频进程分出了程序所需的6个频率

p2:Process(clk5)

Begin

if (clk5'event AND clk5 = '0') then

mode_mp2 <= mode_mp1; --延迟一个周期赋值

mode_mp1 <= mode;

p_mp2 <= p_mp1;

p_mp1 <= p;

end if;

end Process p2;

p2_out:Process(clk1) --这里单独拿出一个进程用于赋值

Begin

if (clk1'event and clk1 = '1') then

mode_out <= clk5 and mode_mp1 and (not mode_mp2);

p_out <= clk5 and p_mp1 and (not p_mp2);

end if;

end Process p2_out;

小结:上述两个进程完成了防抖动功能,和老师给的代码不同的地方

在于单独拿出了一个进程用于与操作,原因在于这里的输出值依旧是signal变量,必须在进程内赋值才能在仿真时显示出来。(否则会被优化掉!)

第二个问题就是为什么赋值进程敏感量使用了clk1?其实这里使用什么时钟作为同步时钟并不重要,重要的在于这个时钟周期必须小于clk5周期的一半。为什么呢?因为防抖动的输出仅为clk5的高电平,必须要在这一时刻得到同步时钟沿。那为什么不就用clk5呢?因为使用clk5则得到的有效电平长度为clk5整个周期,相当于不具备了防止冒险的作用,影响防抖动进程。

p3:Process(p_out,mode_out,reset)

Begin

if (clk5'event and clk5 = '0') then

Case state Is

when m0 => if (mode_out = '1') then state <= m1_p1;

end if;

when m1_p1 => if (p_out = '1') then state <= m1_p2;

elsif (mode_out = '1') then state <= m2;

elsif reset = '1' then state <= m0;

else state <= m1_p1;

end if;

when m1_p2 => if (p_out = '1') then state <= m1_p3;

elsif (mode_out = '1') then state <= m2;

elsif reset = '1' then state <= m0;

else state <= m1_p2;

end if;

when m1_p3 => if (p_out = '1') then state <= m1_p4;

elsif (mode_out = '1') then state <= m2;

elsif reset = '1' then state <= m0;

else state <= m1_p3;

end if;

when m1_p4 => if (p_out = '1') then state <= m1_p1;

elsif (mode_out = '1') then state <= m2;

elsif reset = '1' then state <= m0;

else state <= m1_p4;

end if;

when m2 => if (mode_out = '1') then state <= m3_p1;

elsif reset = '1' then state <= m0;

else state <= m2;

end if;

when m3_p1 => if (p_out = '1') then state <= m3_p2;

elsif(mode_out = '1') then state <= m1_p1;

elsif reset = '1' then state <= m0;

else state <= m3_p1;

end if;

when m3_p2 => if (p_out = '1') then state <= m3_p3;

elsif (mode_out = '1') then state <= m1_p1;

elsif reset = '1' then state <= m0;

else state <= m3_p2;

end if;

when m3_p3 => if (p_out = '1') then state <= m3_p1;

elsif (mode_out = '1') then state <= m1_p1;

elsif reset = '1' then state <= m0;

else state <= m3_p3;

end if;

End Case;

end if;

End Process p3;

小结:这一部分是状态机,值得一提的是状态机的同步时钟。开始本以为没必要加的,结果不行,原因在于这是一个需要反复判断的进程,没有同步时钟系统是无法执行这些的。时钟的选择上依旧采用了clk5。值得一提的是选择时钟沿时一定选择下降沿。因为在防抖动过程中当clk5高电平结束时则完成了防抖动信号的赋值,然而完成赋值是有一定延时的,这一延时过程中触发状态机,然后开始判断

p4_counter1:Process(clk1)

Begin

if (clk1'event and clk1 = '1') then

if (count = 7) then count <= 0 ;

else count <= count + 1;

end if;

end if;

end Process p4_counter1;

p4_counter2:Process(clk6)

Begin

if (clk6'event and clk6 = '1') then

if (count_2 = 3) then count_2 <= 0;

else count_2 <= count_2 + 1;

end if;

if (count_3 = 31) then count_3 <= 0;

else count_3 <= count_3 + 1;

end if;

end if;

end Process p4_counter2;

小结:这里利用时钟计数来完成扫描,滚动等变化

p4: Process(count,count_2,count_3)

Begin

Case state Is

when m0 => row <= "11111111"; red <= "00000000"; green <= "00000000";num_out <= "00000000";

when m1_p1 =>

--if (clk1 = '1') then

Case count Is

when 0 => row <= "11111101";red <= "01111110";green <= "00000000";

when 1 => row <= "11111011";red <= "00001000";green <= "00000000";

when 2 => row <= "11110111";red <= "00001000";green <= "00000000";

when 3 => row <= "11101111";red <= "00101110";green <= "00000000";

when 4 => row <= "11011111";red <= "00101000";green <= "00000000";

when 5 => row <= "10111111";red <= "11111111";green <= "00000000";

when 6 => row <= "01111111";red <= "00000000";green <= "00000000";

when 7 => row <= "11111110";red <= "00000000";green <= "00000000";

when others => row <= "11111110";

End Case;

num_out <= "00000110";

--End if;

when m1_p2 =>

if (clk2 = '1')then

Case count Is

when 0 => row <= "11111101";red <= "01111110";green <= "00000000";

when 1 => row <= "11111011";red <= "00001000";green <= "00000000";

when 2 => row <= "11110111";red <= "00001000";green <= "00000000";

when 3 => row <= "11101111";red <= "00101110";green <= "00000000";

when 4 => row <= "11011111";red <= "00101000";green <= "00000000";

when 5 => row <= "10111111";red <= "11111111";green <= "00000000";

when 6 => row <= "01111111";red <= "00000000";green <= "00000000";

when 7 => row <= "11111110";red <= "00000000";green <= "00000000";

when others => row <= "11111110";

End Case;

else red <= "00000000";

End if;

num_out <= "01011011";

when m1_p3 =>

if (clk3 = '1')then

Case count Is

when 0 => row <= "11111101";red <= "01111110";green <= "00000000";

when 1 => row <= "11111011";red <= "00001000";green <= "00000000";

when 2 => row <= "11110111";red <= "00001000";green <= "00000000";

when 3 => row <= "11101111";red <= "00101110";green <= "00000000";

when 4 => row <= "11011111";red <= "00101000";green <= "00000000";

when 5 => row <= "10111111";red <= "11111111";green <= "00000000";

when 6 => row <= "01111111";red <= "00000000";green <= "00000000";

when 7 => row <= "11111110";red <= "00000000";green <= "00000000";

when others => row <= "11111110";

End Case;

else red <= "00000000";

End if;

num_out <= "01001111";

when m1_p4 =>

if (clk4 = '1') then

Case count Is

when 0 => row <= "11111101";red <= "01111110";green <= "00000000";

when 1 => row <= "11111011";red <= "00001000";green <= "00000000";

when 2 => row <= "11110111";red <= "00001000";green <= "00000000";

when 3 => row <= "11101111";red <= "00101110";green <= "00000000";

when 4 => row <= "11011111";red <= "00101000";green <= "00000000";

when 5 => row <= "10111111";red <= "11111111";green <= "00000000";

when 6=> row <= "01111111";red <= "00000000";green <= "00000000";

when 7 => row <= "11111110";red <= "00000000";green <= "00000000";

when others => row <= "11111110";

End Case;

else red <= "00000000"; --这一句非常关键

End if;

num_out <= "01100110";

小结:需要注意的是每次扫描后都必须置零,变色显示也是一样

when m2=>

Case count Is

when 7 => row <= "11111110";red <= "11111111";green <= "00000000";

when 0 => row <= "11111101";red <= "10011001";if clk4='1' then green <= "10011001"; else green <= "00000000";end if;

when 1 => row <= "11111011";red <= "10100101";if clk3='1' then green <= "10100101";else green <= "00000000";end if;

when 2 => row <= "11110111";red <= "11000011";if clk2='1' then green <= "11000011";else green <= "00000000";end if;

when 3 => row <= "11101111";red <= "10111101";green <= "10111101";

when 4 => row <= "11011111";green <= "10100101";if clk3='1' then red <= "10100101"; else red <= "00000000";end if;

when 5 => row <= "10111111";green <= "10111101";if clk4='1' then red <= "10111101"; else red <= "00000000";end if;

when 6 => row <= "01111111";red <= "00000000";green <= "11111111";

when others => row <= "11111110";

End Case;

num_out <= "00000000";

when m3_p1=>

num_out <= "00000000";

Case count_2 Is

when 0 =>

Case count Is

when 0 => row <= "11111101";red <= "01111110";green <= "00000000";

when 1 => row <= "11111011";red <= "00001000";green <= "00000000";

when 2 => row <= "11110111";red <= "00001000";green <= "00000000";

when 3 => row <= "11101111";red <= "00101110";green <= "00000000";

when 4 => row <= "11011111";red <= "00101000";green <= "00000000";

when 5 => row <= "10111111";red <= "11111111";green <= "00000000";

when 6 => row <= "01111111";red <= "00000000";green <= "00000000";

when 7 => row <= "11111110";red <= "00000000";green <= "00000000";

when others => row <= "11111110";

End Case;

when 1 =>

Case count Is

when 7 => row <= "11111110";green <= "11111111";red <= "00000000";

when 0 => row <= "11111101";green <= "10011001";red <= "00000000";

when 1 => row <= "11111011";green <= "10100101";red <= "00000000";

when 2 => row <= "11110111";green <= "11000011";red <= "00000000";

when 3 => row <= "11101111";green <= "10111101";red <= "00000000";

when 4 => row <= "11011111";green <= "10100101";red <= "00000000";

when 5 => row <= "10111111";green <= "10111101";red <= "00000000";

when 6 => row <= "01111111";green <= "11111111";red <= "00000000";

when others => row <= "11111110";

End Case;

when 2 =>

Case count Is

when 0 => row <= "11111101";red <= "00100100";green <= "00100100";

when 1 => row <= "11111011";red <= "01000010";green <= "01000010";

when 2 => row <= "11110111";red <= "10011001";green <= "10011001";

when 3 => row <= "11101111";red <= "00011000";green <= "00011000";

when 5 => row <= "10111111";red <= "00011000";green <= "00011000";

when 6 => row <= "01111111";red <= "00011000";green <= "00011000";

when 7 => row <= "11111110";red <= "00011000";green <= "00011000";

when others => row <= "11111110";

End Case;

when 3 =>

Case count Is

when 7 => row <= "11111110";if (clk3 = '1') then red <= "00011000"; else red <= "00000000";end if;green <= "00011000";

when 0 => row <= "11111101";if (clk3 = '1') then red <= "00100100"; else red <= "00000000";end if;green <= "00100100";

when 1 => row <= "11111011";if (clk3 = '1') then red <= "00100100"; else red <= "00000000";end if;green <= "00100100";

when 2 => row <= "11110111";if (clk3 = '1') then red <= "01000010"; else red <= "00000000";end if;green <= "01000010";

when 3 => row <= "11101111";if (clk3 = '1') then red <= "01111110"; else red <= "00000000";end if;green <= "01111110";

when 4 => row <= "11011111";if (clk3 = '1') then red <= "10000001"; else red <= "00000000";end if;green <= "10000001";

when 5 => row <= "10111111";if (clk3 = '1') then red <= "10000001"; else red <= "00000000";end if;green <= "10000001";

when 6 => row <= "01111111";if (clk3 = '1') then red <= "10000001"; else red <= "00000000";end if;green <= "10000001";

when others => row <= "11111110";

End Case;

when others => row <= "11111110";

End Case;--Case count_2

when m3_p2=>

num_out <= "00000000";

green <= "00000000";

Case count_3 Is

when 0 =>

Case count Is

when 0 => row <= "11111101";red <= "10011001";green <= "00000000";

when 1 => row <= "11111011";red <= "10100101";green <= "00000000";

when 2 => row <= "11110111";red <= "11000011";green <= "00000000";

when 3 => row <= "11101111";red <= "10111101";green <= "00000000";

when 4 => row <= "11011111";red <= "10100101";green <= "00000000";

when 5 => row <= "10111111";red <= "10111101";green <= "00000000";

when 6 => row <= "01111111";red <= "11111111";green <= "00000000";

when others => row <= "11111110";

End Case;

when 1 =>

Case count Is

when 0 => row <= "11111101";red <= "00110010";green <= "00000000";

when 1 => row <= "11111011";red <= "01001010";green <= "00000000";

when 2 => row <= "11110111";red <= "10000111";green <= "00000000";

when 3 => row <= "11101111";red <= "01111010";green <= "00000000";

when 4 => row <= "11011111";red <= "01001010";green <= "00000000";

when 5 => row <= "10111111";red <= "01111010";green <= "00000000";

when 6 => row <= "01111111";red <= "11111110";green <= "00000000";

when 7 => row <= "11111110";red <= "11111110";green <= "00000000";

when others => row <= "11111110";

End Case;

when 2 =>

Case count Is

when 0 => row <= "11111101";red <= "01100100";green <= "00000000";

when 1 => row <= "11111011";red <= "10010101";green <= "00000000";

when 2 => row <= "11110111";red <= "00001110";green <= "00000000";

when 3 => row <= "11101111";red <= "11110100";green <= "00000000";

when 4 => row <= "11011111";red <= "10010100";green <= "00000000";

when 5 => row <= "10111111";red <= "11110100";green <= "00000000";

when 6 => row <= "01111111";red <= "11111100";green <= "00000000";

when 7 => row <= "11111110";red <= "11111100";green <= "00000000";

when others => row <= "11111110";

End Case;

when 3 =>

。。。。。。(这里省略大量代码)

when others => row <= "11111110";

End Case;--Case count_3

when m3_p3=>

num_out <= "00000000";

Case count_3 Is

when 0 =>

Case count Is

when 7 => row <= "11111110";red <= "00000000";green <= "00000000";

when 0 => row <= "11111101";red <= "01111110";green <= "00000000";

when 1 => row <= "11111011";red <= "00001000";green <= "00000000";

when 2 => row <= "11110111";red <= "00001000";green <= "00000000";

数电实验报告

班级:姓名: 学号: 实验报告(一)TTL集成逻辑门的逻辑功能与参数测试1.测试TTL集成与非门74LS20的逻辑功能,测试结果记录如下表: 输入输出 An Bn Cn Dn Yn 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 2. 74LS20主要参数的测试 I CCL (mA) I CCH (mA) I il (mA) I OL (mA) N O= iL OL I I 3. 电压传输特性测试 V i(V) 0 0.4 0.7 0.9 1.0 1.1 1.2 1.3 1.4 2.0 3.0 4.0 … V O(V) 4.画出实测的电压传输特性曲线,并从中读出各有关参数值。

实验报告(二)CMOS 电路 1.用所给的集成电路(CD4007)实现F=ABC ,将实验结果填入真值表中,并测出高、低电平(真值表自拟,测试步骤自拟)。 2. 用所给的集成电路实现F=C B A ++(真值表自拟,测试步骤自拟)。 3. 用所给的集成电路,构成图2-2反相器。 (a )测最大灌电流I OL (V OL =0.1V ,接通图2-2中的虚线框①)。 (b )测最大拉电流I OH (V OH =4.9V,断开虚线框①,接通虚线框②。 4. 构成如图2-3所示的反相器,测最大灌电流I OL 。

实验报告(三)组合逻辑电路实验分析与设计(1) 写出由与非门组成的半加器电路的逻辑表达式 (2) 根据表达式列出真值表,并画出卡诺图判断能否简化 A B Z1 Z2 Z3 S C 0 0 0 1 1 0 1 1 实验: 1.测试由与非门组成的半加器电路的逻辑功能 A B S C 0 0 0 1 1 0 1 1 2.测试用异或门74LS86和与非门74LS00组成的半加器的逻辑功能 A B S C 0 0 0 1 1 0 1 1

北京邮电大学数电实验报告

北京邮电大学 数字电路与逻辑设计实验 发光二极管走马灯的电路设计与实现实验报告 学院:信息与通信工程学院 班级:27 姓名:付莹 学号: 班内序号:23

【实验目的】 (1)进一步了解时序电路描述方法; (2)熟悉状态机的设计方法。 【实验所用仪器及元器件】 (1)计算机; (2)直流稳压电源; (3)数字系统与逻辑设计实验开发板。 【实验任务要求】 设计并实现一个控制8个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。 (1)单点移动模式:一个点在8个发光二极管上来回的亮 (2)幕布式:从中间两个点,同时向两边依次点亮直到全亮,然后再向中间点灭,依次往复。 【实验设计思路及过程】 (1)设计思路 实验要求有两个,一个是单点移动模式,一个是幕布式。通过CASE-WHEN 语句实现走马灯的变化。分别定义一个8个变量的数据类型 和一个13变量的数据类型,表示一个周期内的灯的变化,并设计一个变 量在两种状态间进行切换。此时,需要把所有状态罗列到case-when中 去。 (2)VHDL代码 LIBRARY IEEE; USE ABC IS PORT( A,CLK,RESET:IN STD_LOGIC; DENG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); END ABC; ARCHITECTURE A OF ABC IS TYPE STATE_TEMP is(s0,s1,s2,s3,s4,s5,s6,s7);

TYPE STATE_TEMP1 is(s0,s1,s2,s3,s4,s5,s6,s7,s00,s01,s02,s03,s04,s05); signal STATE:STATE_TEMP; signal STATE1:STATE_TEMP1; BEGIN PROCESS(CLK,RESET) BEGIN IF RESET='1' THEN DENG<="00000000"; ELSIF(CLK'EVENT AND CLK='0')THEN IF A='0'THEN --KAIMUSHI CASE STATE1 IS WHEN s0 => STATE1<=s1;DENG<=""; WHEN s1 => STATE1<=s2;DENG<="01000000"; WHEN s2 => STATE1<=s3;DENG<="00100000"; WHEN s3 => STATE1<=s4;DENG<="00010000"; WHEN s4 => STATE1<=s5;DENG<="00001000"; WHEN s5 => STATE1<=s6;DENG<="00000100"; WHEN s6 => STATE1<=s7;DENG<="00000010"; WHEN s7 =>STATE1<=s00;DENG<="00000001"; WHEN s00=>STATE1<=s01;DENG<="00000010"; WHEN s01=>STATE1<=s02;DENG<="00000100"; WHEN s02=>STATE1<=s03;DENG<="00001000"; WHEN s03=>STATE1<=s04;DENG<="00010000"; WHEN s04=>STATE1<=s05;DENG<="00100000"; WHEN s05=>STATE1<=s0;DENG <="01000000"; END CASE; ELSE CASE STATE IS WHEN s0 => STATE<=s1;DENG<="00011000"; WHEN s1 => STATE<=s2;DENG<="00111100"; WHEN s2 => STATE<=s3;DENG<="01111110"; WHEN s3 => STATE<=s4;DENG<=""; WHEN s4 => STATE<=s5;DENG<="01111110"; WHEN s5 => STATE<=s6;DENG<="00111100"; WHEN s6 => STATE<=s7;DENG<="00011000"; WHEN s7 => STATE<=s0;DENG<="00000000"; END CASE; END IF; END IF; END PROCESS; END A; 【仿真波形及分析】

北邮数电实验报告

北邮数电实验报告 北邮数电实验报告 一、引言 数电实验是电子信息类专业学生必修的一门实验课程,通过实践操作,帮助学生巩固理论知识,培养实际动手能力。本次实验旨在通过设计和搭建一个简单的数字电路,来理解数字电路的基本原理和工作方式。 二、实验目的 本次实验的目的是设计一个4位二进制加法器,实现两个4位二进制数的相加运算。通过实验,我们可以加深对于数字电路的理解,掌握数字电路的设计和搭建方法。 三、实验原理 1. 二进制加法器 二进制加法器是一种用于计算二进制数相加的数字电路。它由若干个逻辑门和触发器组成,可以实现二进制数的加法运算。在本次实验中,我们将设计一个4位二进制加法器,即可以计算两个4位二进制数的相加结果。 2. 逻辑门 逻辑门是数字电路中常用的基本元件,用于实现逻辑运算。常见的逻辑门有与门、或门、非门、异或门等。在本次实验中,我们将使用与门和异或门来构建4位二进制加法器。 四、实验步骤 1. 设计4位二进制加法器的电路图 根据实验要求,我们需要设计一个能够计算两个4位二进制数相加的电路。首

先,我们可以将两个4位二进制数分别用D0~D3和E0~E3表示,其中D0和 E0分别为最低位。然后,我们需要使用与门和异或门来实现加法器的功能。通 过逻辑运算,我们可以得到每一位的和以及进位。最后,将每一位的和连接起来,即可得到最终的结果。 2. 搭建电路 根据电路图,我们可以开始搭建实验电路。首先,将所需的逻辑门和触发器连 接起来,形成一个完整的电路。然后,将所需的输入信号和电源连接到电路上。最后,使用示波器等工具检查电路的工作状态,确保电路正常运行。 3. 进行实验测试 在搭建好电路后,我们可以进行实验测试。首先,将两个4位二进制数的输入 信号连接到电路上。然后,通过观察输出信号,判断电路是否正确计算了两个 二进制数的相加结果。如果输出信号与预期结果一致,说明电路设计和搭建成功。 五、实验结果与分析 在进行实验测试后,我们可以得到实验结果。通过观察输出信号,我们可以判 断电路是否正确计算了两个二进制数的相加结果。如果输出信号与预期结果一致,说明电路设计和搭建成功。如果输出信号与预期结果不一致,说明电路存 在问题,需要进一步检查和调试。 六、实验总结 通过本次实验,我们深入了解了数字电路的基本原理和工作方式。通过设计和 搭建一个4位二进制加法器,我们掌握了数字电路的设计和搭建方法。通过实 验测试,我们可以验证电路的正确性,并对电路进行进一步优化和改进。

北邮数电实验报告4人表决器北邮电子-数电综合实验报告

北邮数电实验报告4人表决器_北邮电子-数电综合实验报告 数字电路综合实验设计 简易出租车计价器的设计与实现 学院:电子工程学院班级:2011211203学号:2011210876姓名:孙月鹏班内序号:04 摘要 本文介绍了利用QuartusII综合性PLD/FPGA开发软件,在MAXII数字逻辑实验开发板上实现简易出租车计价器功能的设计与实现方法。本方案采用自上而下的设计理念,将整体电路按照功能划分为分频、计数、控制、数码管显示电路、点阵显示电路等若干模块,模块内用VHDL语言完成逻辑设计,模块间用原理图进行连接,使整体可实现计费、计时等功能。 关键字:可编程器件模块化设计出租车计价器VHDL语言 一、设计任务要求 基本要求: 1.行驶公里:用时钟2秒钟表示出租车匀速行驶1公里。在行车5公里以内,按起步价13元收费,超过5公里部分,以每公里2元收费。燃油附加费每运次1元。 2.途中等待:用按键控制中途等待,等待少于(包括)5秒不收费,超过5秒后没等待3秒钟加收1元。 3.用数码管分时显示计费金额、行驶里程和等候时间。字母A表示当前处于显示计费金额状态,字母B表示当前处于显示行驶里程状态,字母C表示当前处于显示等候时间状态。 4.用按键控制出租车空驶、载客状态。 提高要求: 1.用点阵滚动显示收费单据。 2.具有夜间模式,基本单价加收20%的费用。出租车收费以元为单位,元以下四舍五入。

3.出租车行驶速度可调可控。4.多人乘车,分段计价。5.自拟其他功能。 二、设计思路与结构框图 1.设计思路 图1结构框图 由结构框图可以分析得出,该系统的的主体是计数控制器。该系统由外部控制载客控制信号和等待控制信号,以时钟信号的翻转为计数依据,完成对时间、里程和费用的计数,并将结果通过数码管译码电路显示出来。 该系统的控制信号可由拨码或按键输入,时钟由开发板内部时钟分频得出,输出有点阵输出和数码管输出。因此,可将系统分为分频器、计数控制器、数码管译码和显示以及点阵显示四部分。并以此得出系统的逻辑框图如下:图2逻辑框图 2.控制器部分的状态转移图 该控制器一共有三个基本状态:空驶状态、载客状态和等待状态。分别由v、和w来进行控制。 三、分块电路和总体电路设计 (一)总体电路设计 图3状态转移图 整体电路由数码管译码电路、转换电路、点阵译码电路、技术控制电路、分频电路五部分构成。 分频电路将开发板内部的50MHz时钟分为500hz(供给数码管和点阵)、 1Hz(控制器计时)、0.5Hz(行驶路程计费)、0.3Hz(等待时间计费)以及用于提高分频效率的其他若按频率。 计数控制电路由四部分构成,整体完成行驶距离的计数、等待时间的计 数以及费用的计数。输出为三组十位二进制数。 转换电路有转换数据类型和在数码管上分时显示两个功能。首先将输入 的十位二进制数转换为4位十进制数,并且利用除法和取余数的运算提取出个位、十位、百位、千位,并转换为四位二进制BCD码。其次利用0.5hz的时钟,将行驶里程、等待时间、计费金额以2秒为周期依次out1~4,供给数码管以便分时显示。

硬件实验三 双色LED点阵实验 1006052240

硬件实验三双色LED点阵实验 一、实验目的 1学习双色LED点阵显示的原理。 2.学习双色LED点阵显示的编程方法。 二、实验内容 1.基本部分: 固定显示。在点阵上轮流显示数据0~9和字母A~F。 2.扩展部分: 滚动显示。从左到右,从右到左,从上到下,从下到上,轮流显示“1”.和“一”。 四、实验连线 P0和JP1(LED)用8PIN排线或连接起来。 P1和J19(点阵绿色端)用8PIN排线或连接起来。 P2和J20(点阵红色端)用8PIN排线或连接起来。 五、实验说明 首先要把需要显示的数字或字母所对应的二进制码放到数组中,然后轮流将各个列引脚置低,并将对应元素写到点阵的数据引脚。 六、实验代码 1.基本部分 #include unsigned char code tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,}; //列引脚的代码控制unsigned char code digittab[16][8]={ {0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, {0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00}, {0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00}, {0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00}, {0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00}, {0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00}, {0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00}, {0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00}, {0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00}, {0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00}, {0x06,0x18,0x68,0x88,0x68,0x18,0x00,0x06}, {0x00,0xFF,0x91,0x91,0x91,0x6E,0x00,0x00}, {0x00,0x3E,0x41,0x41,0x62,0x00,0x00,0x00}, {0x00,0x7F,0x41,0x41,0x41,0x3E,0x00,0x00}, {0x00,0x7F,0x49,0x49,0x49,0x00,0x00,0x000},

北邮数电实验报告 简易迷宫游戏

数字电路与逻辑设计实验 简易迷宫游戏

设计课题的任务要求 (一)实验目的 1. 熟练掌握 VHDL 语言和QuartusII 软件的使用; 2. 理解状态机的工作原理和设计方法; 3. 掌握利用 EDA 工具进行自顶向下的电子系统设计方法; (二)相关知识 本实验主要利用状态机来设计实现一个简易迷宫系统,本系统分为控制器与受控电路两部分。控制器主要控制整个系统按设定的工作方式实现点阵、计时器、数码管工作的通与断,并使用逻辑判断判决小人是否移动与否和移动的方向。 同时本实验也运用到了包括分频器、计数器、数码管、点阵等相关知识。主要利用六位数码管显示30s计时和小人移动步数,用点阵显示开机画面、迷宫地图、小人移动过程和游戏失败、胜利的相应画面。 (三)实验任务 基本要求: 1、用8×8点阵进行游戏显示。 2、迷宫游戏如图1所示,采用双色点阵显示,其中红色LED为迷宫墙壁,绿色LED 表示人物。通过BTN0~BTN3四个按键控制迷宫中的人物进行上下左右移动,使人 物从起始点出发,走到迷宫的出口,游戏结束 3、普通计时模式:通过按键BTN7启动游戏,必须在30秒内找到出口,否则游戏失败, 用两个数码管进行倒计时显示。游戏胜利或者失败均要在8×8点阵上有相应的画面 出现。 4、迷宫中的人物在行走过程中,如果碰到墙壁,保持原地不动 提高要求: 1. 多种迷宫地图可以选择。 2. 在计时的基础上增加计步的功能,每按一次控制按键步数加1,碰壁不计算步数, 计步结果用数码管显示。 3. 增加了计时显示的精确度,让倒计时精确到0.01s 4.增加了开机画面,当按下START开始键后,点阵上开始显示“GO- 6-5-4-3-2-1”的

北邮数电综合实验报告

北邮数电综合实验报告 北邮数电综合实验报告 一、实验目的与背景 数电综合实验是北邮电子信息工程专业的重要实践环节,旨在通过实际操作, 巩固和应用学生在数字电路、模拟电路、通信原理等相关课程中所学到的理论 知识。本实验报告将对数电综合实验的内容、过程和结果进行详细描述和分析。 二、实验内容 本次数电综合实验的主要内容为设计一个数字电子钟。该电子钟具备显示时间、日期、闹钟功能,并能实现闹钟的设置、开关控制等基本操作。实验中,我们 需要使用数字集成电路、显示模块、按键开关、时钟模块等元件进行电路设计 和搭建。 三、实验过程 1. 硬件设计与连接 根据实验要求,我们首先进行电路设计。根据数字电子钟的功能需求,我们需 要选取适当的集成电路和模块。通过分析电路原理图,我们将各个模块进行连接,保证信号的正确传递和控制。 2. 软件编程与调试 在硬件连接完成后,我们需要进行软件编程。通过使用C语言或者Verilog等 编程语言,我们可以实现数字电子钟的各项功能。在编程过程中,我们需要考 虑到时钟频率、显示模块的控制、按键开关的响应等因素。 3. 实验调试与测试 完成软件编程后,我们需要进行实验调试和测试。通过连接电源,观察电子钟

的各项功能是否正常工作。如果发现问题,我们需要进行调试,找出问题所在,并进行修复。 四、实验结果与分析 经过实验调试和测试,我们成功实现了数字电子钟的设计和搭建。该电子钟能 够准确显示时间和日期,并能根据用户的设置进行闹钟的开关和响铃。通过实 验过程,我们对数字电路的原理和应用有了更深入的理解。 五、实验心得与收获 通过参与数电综合实验,我深刻体会到了理论与实践的结合的重要性。在实验中,我们需要将课堂上所学的知识应用到实际中,通过实际操作来巩固和加深 对知识的理解。同时,实验中也锻炼了我们的动手能力和解决问题的能力。 在实验过程中,我们还学会了团队合作的重要性。在设计和搭建电路的过程中,我们需要相互配合,互相帮助,共同解决问题。通过与同学们的合作,我们不 仅解决了实验中遇到的各种问题,还加深了与同学们的交流和友谊。 最后,数电综合实验为我们提供了一个实践的平台,让我们能够将理论知识与 实际操作相结合,更好地理解和掌握所学的知识。通过实验,我们不仅提高了 自己的专业技能,也培养了自己的创新意识和解决问题的能力。 六、总结 数电综合实验是北邮电子信息工程专业的重要实践环节,通过实际操作,巩固 和应用学生在数字电路、模拟电路、通信原理等相关课程中所学到的理论知识。通过实验,我们不仅提高了自己的专业技能,也培养了自己的创新意识和解决 问题的能力。数电综合实验是我们专业学习的重要一环,对我们未来的学习和 工作都具有重要意义。希望通过这次实验,我们能够更好地理解和掌握所学的

北邮数电实验报告_双色点阵

北京邮电大学 数电综合实验报告 实验名称:双色点阵显示控制器 学院: 姓名: 班级: 学号: 班内序号:

一.设计课题的任务要求 用8×8点阵设计双色点阵显示控制器 基本要求: 1、固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn 按钮实现亮度调节,亮度变化视觉效果要尽量明显。 2、用从红到绿8级渐变色显示一个固定汉字或图形。 3、分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字或图形,显示过程中,显示方式用一个btn 按键进行切换。 4、显示的图形或汉字要尽量饱满美观。 提高要求: 滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。 自拟其它功能。 二. 系统设计 1. 设计思路 考虑本程序设计要求模块明确单一但需要变化多种状态,因此采用单模块多状态多进程方式实现。 其中防抖进程用于检测输入,本程序使用BTN 按键进行输入控制,而按键的键入可能由于抖动产生多个上升沿,对程序的控制产生影响。防抖动采用了延时原理来对冒险或长时间按键电平进行处理。 分频使用了多个进程产生程序所需要的多个时钟频率。 包括:clk1(扫描时钟 大于480Hz 但不过高) clk2(占空比调节1 clk1周期的整数倍,但不过高) clk3(占空比调节2 同clk2,但占空比不同) clk4(占空比调节3 同clk2,但占空比不同) clk5(按键时钟 约100Hz) clk6(滚动变化计时 约1Hz) 状态机变化进程用于管理状态变化,当遇到按键电平信号时根据规则改变对应状态。 显示进程包括主要显示进程和一些辅助进程,辅助进程完成了时钟对应计数器计数,主进程则根据状态变化显示不同显示模式下不同的图案。 2. 总体框图 (1) 总体结构框图:

2021年北邮数电综合实验报告

点阵赛车游戏 学院: 信息与通信工程学院专业: 通信工程 班级: 姓名: 学号: 班内序号:

一、设计课题任务要求 用8×8点阵进行5秒倒计时显示, 当5秒倒计时结束后, 点阵显示赛道和赛车初始位置, 赛车游戏开始, 并开始计时, 用两个数码管显示时间。用红色表示赛道, 黄色表示赛车初始位置, 箭头表示赛车行进方向。用BTN1~BTN3三个按键分别控制赛车左移、前进、右移, 最终使赛车在不碰撞赛道情况下走完全程, 游戏结束, 点阵显示“V”图案, 数码管显示走完全程所花费时间。当游戏时间超出59秒, 或者赛车在行进过程中碰撞赛道, 游戏失败, 点阵显示“X”图案。经过按键BTN0进行复位, 控制点阵返回到初始状态。 二、系统设计 1、设计思绪 这个过程乍一看蛮复杂, 不过当我经过仔细分析后发觉, 我代码能够根据这个游戏运行过程来写。这个游戏分为4个状态, 即倒计时, 运行, 成功和失败。倒计时部分依据不一样数字在点阵上位置很轻易设计出来, 运行部分便是初始化赛道, 赛车位置, 然后用按键来控制赛车运动, 在这个过程中要不停判定赛车是否撞墙和抵达终点, 假如抵达终点便进入第三个状态, 成功, 即显示“V”; 若果撞墙便进入第四个状态, 失败, 即显示“X”。在游戏运行同时数码管还要计时。 2、总体框图 (1)系统结构图

(2)ASM 图 译码显示器 分频器 控制器 计时器 赛道及赛车 CP RESET BTN1 BTN2 BTN3 开启 N Y 是否碰到边界 是否抵达终点 显示“V ” 显示“×” 计时 移动 是否复位是否复位 Y N N Y N Y N

数电实验报告

数电实验报告 引言: 数电实验是电子信息科学与技术专业中一门重要的实验课程。 通过数电实验,我们可以掌握数字电路的基本原理与设计方法, 加深对电子电路原理的理解与应用。本实验报告将对我们进行的 数电实验进行总结与评述,以便更好地理解数电实验的内容和意义。 实验目的: 本次数电实验的主要目的是通过实验的方式,掌握数字电路的 设计与实现原理,以及相应的实验工具和测试设备的使用方法。 通过实际操作,我们将验证数字电路的可靠性和正确性,并培养 我们的实验技能和分析问题的能力。 实验内容: 本次数电实验涵盖了多个实验项目,其中包括:逻辑门的实验、组合逻辑电路的实验以及时序逻辑电路的实验等。 1. 逻辑门的实验

这一部分我们主要学习并实验了与门、或门、非门、异或门等 逻辑门的基本原理与应用。透过实际连接与测试,我们进一步了 解了逻辑门之间的相互转换关系和应用场景。通过使用示波器、 万用表等仪器设备,我们能够验证逻辑门的逻辑功能与实际输出 是否一致。 2. 组合逻辑电路的实验 在组合逻辑电路的实验中,我们学习了多种组合逻辑电路的设 计原理和真值表的绘制方法。通过实际搭建和测试,我们验证了 布尔代数的基本运算规则在实际电路中的应用,并掌握了基本的 编码器、解码器和多路选择器等组合逻辑电路的设计与实现方法。 3. 时序逻辑电路的实验 时序逻辑电路实验是本次数电实验的重点和难点部分。通过实验,我们学习了时钟信号的产生与作用原理,掌握了触发器的工 作原理和应用方法。我们还学习了时序逻辑电路的分析与设计技巧,实践了状态图和状态表的绘制方法,进一步体验了时序逻辑 电路在数字系统中的重要性和应用价值。 实验结果与分析:

双色点阵发光二极管实验报告

双色点阵发光二极管实验报告 一、实验目的: 1.了解发光二极管(LED)及其原理; 2.学习使用双色点阵发光二极管进行实验,并掌握其原理和基本操控方法; 3.实验中通过编程控制点阵显示出各种文字、图案等。 二、实验器材和仪器: 1.双色点阵发光二极管; 2. Arduino开发板; 3.连接线; 4.电阻。 三、实验原理: 发光二极管(LED)是一种能够将电能转化为光能的器件。通过不同的材料和添加不同的杂质,可获得不同颜色的发光效果。双色点阵发光二极管是一种具有两种颜色(通常为红色和绿色)的发光二极管。其内部有两个独立的发光单元,能够独立控制红色和绿色的亮灭。 四、实验步骤: 1. 连接电路:将双色点阵发光二极管连接到Arduino开发板上。将其中一个发光单元的正极连接到数字引脚A0上,另一个发光单元的正极

连接到数字引脚A1上,两个发光单元的负极连接到地(GND)上,并在电路中添加适当的电阻以限制电流。 2. 编写程序:使用Arduino开发板上的编程软件,编写控制双色点阵发光二极管的程序。 3.程序调试:通过调试程序,控制点阵发光二极管显示不同的文字、图案等。 4.实验记录:记录测试过程中发光二极管的亮灭情况,以及显示的文字、图案等。 五、实验结果与分析: 通过编程控制,成功实现了双色点阵发光二极管的各种亮灭模式。通过调节程序中控制亮灭的时间和频率,能够显示不同的图案和文字。在实验过程中,我们编写了一个简单的程序,实现了点阵显示"HELLO"字样,并不断闪烁。通过改变程序中的代码,还可以实现点阵发光二极管的其他模式,如呼吸灯、跑马灯等。 六、实验总结: 本次实验通过控制双色点阵发光二极管的亮灭,成功实现了点阵显示不同的文字、图案等。实验过程中,我们掌握了发光二极管的原理和基本操控方法,了解了如何通过编程控制点阵发光二极管显示出各种模式。通过这个实验,我们对发光二极管及其应用有了更深入的理解,并且培养了动手实验、编程和解决问题的能力。

北邮数电实验双色点阵扫描显示控制器

北京邮电大学 数字电路与逻辑设计实验报告 (实验5) 学院:电子工程学院 专业:电子信息科学与技术

实验5 双色点阵扫描显示控制器 一、实验要求 1. 用8×8 点阵显示字符,每次显示一个字符,每秒切换一次,显示内容为“B”、“U”、“P”、“T”及姓名的第一个字母。如张三显示的内容为“B”、“U”、“P”、“T”、“Z”、“S”。 2.为系统设置一个复位键,复位后重新从“B”开始循环显示。要求使用按键复位。 二、实验设计思路 我们知道点阵的结构,当row轮流出0的时候,二极管阴极为低电平,这时候我们给到一个高电平在红灯或者绿灯的阳极的时候,就能驱使灯点亮。这样我们可以基于“视觉暂留”的现象,快速刷新row灯,使得点阵能够快速点亮,这样就能显示一个完整的字,最后再利用一个模7计数器来实现每个字母之间的转换。 我们引入一个1000hz的时钟,并对其进行一个1000分频变成1hz的时钟。之后再利用这个模7计数器来控制cor_l和cor_g和row来控制灯的颜色、每行灯亮时列的亮灯情况。另外,我们需要一个模8计数器,后面再设计一个3-8线译码器,这样能够控制row的亮灯情况。最后我们需要注意的是,由于row需要快速刷新,故我们需要用1000hz的时钟,而字符之间的转换的计数器要用1hz的时钟,来满足亮灯1s的条件。 我们还需要设计一个复位键,以便能做到按下按钮重新回到第一个字母的功能,这需要reset 按下时,模7计数器的数字回到0。这样把带防抖的复位键加进去即可。 最后顶层将这两个模块连接起来即可。 三、VHDL代码及注释 点阵部分: library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use IEEE.std_logic_arith.all; entity dianzhen is port(clk :in std_logic; col_r :out std_logic_vector(7 downto 0); --红灯的控制显示 col_g :out std_logic_vector(7 downto 0); --绿灯的控制显示 row : out std_logic_vector(7 downto 0);--二极管阴极控制 reset: in std_logic); end dianzhen; architecture a of dianzhen is signal sel7:std_logic_vector(2 downto 0); --模7计数器的信号 signal sel8:std_logic_vector(2 downto 0); --模8计数器的信号 signal clk_add:std_logic:='0'; --分频后的时钟begin p1:process(clk) --1000分频 variable c:integer range 0 to 499:=0; begin if (clk'event and clk='1') then if c=499 then

北邮数电实验点阵赛车

数字电路综合实验报告点阵赛车游戏 学院:信息与通信工程学院班级:2010211117班 姓名: 学号: 班内序号: 辅导老师:袁东明 时间:2012年11月

目录 一、设计任务要求 二、系统设计 三、仿真波形及分析 四、源程序 五、功能说明 六、元器件清单及资源利用情况 七、故障及问题分析 八、总结和结论

一、设计任务要求 1、基本要求: 1。用8×8点阵进行5秒倒计时显示,如下图所示. 2.当5秒倒计时结束后,点阵显示下图所示的赛道和赛车的初始位置,赛车游戏开始,并开始计时,用两个数码管显示时间。图中的红色表示赛道,黄色表示赛车的初始位置,箭头表示赛车行进的方向。 3.用BTN1~BTN3三个按键分别控制赛车的左移、前进、右移,最终使赛车在不碰撞赛道的情况下走完全程(即图2中的绿色位置),游戏结束,点阵显示“V”图案,数码管显示走完全程所耗费的时间。 4。当游戏时间超过59秒,或者赛车在行进过程中碰撞赛道,游戏失败,点阵显示“X”图案. 5。通过按键BTN0进行复位,控制点阵返回到初始状态。 2、提高要求: 1。有多种游戏赛道可选,5秒倒计时显示后赛道随机出现. 2.赛车的初始位置随机出现。 3。在赛车行进过程中,赛道中随机出现障碍物(用8×8点阵中的一个LED 表示),通过BTN1~BTN3三个按键的控制躲避障碍物,走完全程.若赛车碰到障碍物和赛道,则游戏失败. 二、系统设计 1、设计框图 1、系统结构框图 本系统主要由四个模块组成,其中控制器用于控制程序运行、储存当前状态

并控制输出显示,点阵用于显示游戏界面,数码管用于显示当前分数.按钮输入用于输入控制信息。 2、逻辑划分方框图

北邮数电实验下LED点阵风扇的设计与实现

数字电路与逻辑设计实验 实验报告 实验名称:led点阵风扇的设计与实现学院:电子工程学院 专业:电子科学与技术 班级: 班内序号: 学号: 姓名: 北京邮电大学 2015年11月9日

目录 一、任务要求 (3) 1.基本要求: (3) 2.提高要求: (3) 二、系统设计 (3) 1. 设计思路 (3) 2. 总体框图 (4) 3. 分块设计 (7) 三、仿真波形及波形分析 (8) 四、源程序(包括注释) (12) 五、功能说明及资源利用情况 (23) 1. 功能说明 (23) 2. 资源利用情况 (24) 六、故障及问题分析 (25) 七、总结和结论 (27) 1.总结 (27) 2.结论 (27)

一、任务要求 1.基本要求: (1)用8*8点阵模拟风扇转动,并采用双色点阵显示。 (2)风扇转动方式如图1所示,包括四个点阵显示状态并按顺序循环显示。风扇转动速度根据环境温度分为4档,其中1档的四个显示状态之间的切换时间为2秒,2档为1秒,3档为0.5秒,4档为静止不动。 (3)环境温度通过2个BTN按键设置,一个用来增加,一个用来减少,温度可设置范围为10℃~40℃,温度精度为1℃,并用两个数码管进行温度显示。风扇根据不同的温度自动采用不同的转动速度,其中20℃~24℃对应1档,25℃~29℃对应2档,30℃~40℃对应3档,10℃~19℃对应4档,用一个数码管显示档位。 (4)定时模式:在风扇不同转动速度下,可以通过按键切换进入定时模式。定时时间可设置范围为20~59秒,采用两个数码管进行倒计时,当倒计时结束后,风扇状态保持静止不动。 (5)设置开关键。风扇开机初始状态为20℃、1档,并有不小于5秒的开机音乐。关机状态为点阵全灭。 图1 2.提高要求: (1)设计LED风扇的其他工作模式。 (2)利用实验板上的温度传感器代替按键直接获取温度数据,实现对LED 风扇四档转速的自动控制。 (3)用数码管实时显示温度传感器的温度数据,精度为0.1℃。 (4)自拟其他功能。 二、系统设计 1.设计思路 在LED点阵风扇的设计与实现中,首先进行了分频器的设计:由于所使用电路板的时钟频率为50MHz,而需要使用的点阵、数码管扫描频率为1kHz,扇叶切换频率分别为2Hz、1Hz和0.5Hz,故首先将时钟频率进行四次分频。 然后是按键控制温度调节部分的实现,由于题中要求温度在10-40之间的两位数,所以在vhdl的程序设计中将这两位数拆成两个四位的BCD码,并用temerature_h和temperature_l来分别表示,每当需要温度增减时,通过控制这两个信号来实现温度的变化。

北邮数电实验打地鼠游戏的设计与实现实验报告

数字电路与逻辑设计实验(下) 实验报告 课题名称:打地鼠游戏的设计与实现 学院:电子工程学院 班级:2013211202 姓名: 学号:

目录 一.设计课题及任务要求 (4) 1.课题名称:打地鼠游戏的设计及实现 (4) 二.系统设计 (4) 1.设计思路:采用自顶向下的设计原则。 (4) 2.整体分析: (4) 3.整体设计框图: (4) 三.分模块设计 (5) 1.分频模块设计 (5) 1)需求分析: (5) 2)模块代码: (5) 3)模块仿真波形 (5) 2.倒计时模块: (6) 1)功能分析: (6) 2)模块代码: (6) 3)模块仿真 (7) 3.计分模块 (9) 1)功能分析:。 (9) 2)模块代码: (9) 3)模块仿真 (10) 4.数码管控制模块 (12) 1)功能分析: (12) 2)模块代码: (12) 5.控制模块 (13) 1)功能分析: (13) 2)模块代码 (13) 3)模块仿真 (13) 6.随机地鼠生成模块 (14) 1)功能分析: (14) 2)模块代码 (14)

3)模块仿真: (15) 7.点阵显示模块 (16) 1)功能分析: (16) 2)点阵显示原理:原理图: (16) 3)模块代码: (17) 4)模块仿真 (18) 8.键盘模块 (20) 1)功能分析: (20) 2)原理分析 (20) 3)模块代码: (20) 4)模块仿真 (22) 9.总体模块 (24) 1)元件实例连接分析 (24) 2)RTL VIEWS (25) 3)部分代码 (26) 四.功能说明及资源利用情况 (30) 1.功能说明: (30) 2.资源利用情况 (30) 3.总工程 (30) 五.故障及问题分析 (31) 1.问题分析: (31) 2.解决办法 (31) 六.总结和结论 (32)

相关文档
最新文档