北邮·数电综合实验·双色点阵显示控制器的设计与实现
- 格式:doc
- 大小:394.00 KB
- 文档页数:29
数字电路与逻辑设计实验报告
题目:双色点阵显示控制器的设计与实现
班级:
学号:
姓名:
1 实验要求 1.1基本要求: 1) 固定红色显示一个汉字或图形,显示亮度4级可调,用一个btn按钮实现亮度调 2
节,亮度变化视觉效果要尽量明显。 2) 用从红到绿8级渐变色显示一个固定汉字或图形。 3) 分别用单字循环显示、左右滚动显示、上下滚动显示三种显示方式单色显示四个汉字或图形,显示过程中,显示方式用一个btn按键进行切换。 4) 显示的图形或汉字要尽量饱满美观。 1.2提高要求: 1) 滚动显示过程中实现四种显示颜色的自动变换,颜色变化视觉效果要尽量明显。 2) 自拟其它功能。 2系统设计
2.1设计思路 本实验采用自顶向下设计法:从整个系统功能出发,按一定原则将系统划分为若干子系统,再将每个子系统分为若干功能模块,然后实现所要求的的功能。总体是通过分频、按键控制、扫描控制等模块实现上述功能,通过占空比来改变色彩,实现八级渐变色,通过扫描频率的改变和信号的占空比实现亮度的调节,通过行扫描和列扫描的不同实现左右滚动显示和上下滚动显示。由于按键动作的时刻和按下的时间长短是随机的,并且存在由开关簧片反弹导致的电平抖动,所以还要为每个按键开关设置一个消抖和同步电路,这样才能保证按键的准确性。 2.2总体设计框图 1)总体结构框图
2)ASM图 选择汉字或图形
选择显示模式 选择亮度
显示不同的文字或者图案 3
no yes
yes no yes no yes
no
如图所示:开始由按键选择模式,是单个渐变色显示,还是循环显示,还是可改变亮度显示,在执行的同时检查是否按下reset键,如果reset键被按下,那么将对系统进行复位。
选择图形或文字
选择显示方式 case1? case2? csae3 左右滚动显示
上下滚动显示
四种颜色自动变换 循环显示
点阵屏显示
循环显示? 调亮显示? 固定红色 调节亮度 从红到绿八
级变色
开始 4
2.3模块划分 逻辑划分框图 CP
如图所示:系统主要分成3个模块:分频模块针对不同的模式进行分频,扫描控制模块通过行扫描或者列扫描来控制循环显示的方式,点阵显示模块主要是响应不同模式下的点阵显示方式及图形。
分频模块 扫描控制模块 点阵显示模块
分频电路
按键选择显示模式:循环,滚动 按键调节亮度 按键选择所要选择的汉字或图形
按键消抖动同步电路
控制器 行控制扫描电路
列控制扫描电路
点阵显示屏 5
3 仿真波形及其分析 如图所示 当摁下clear键时各信号复位,当模式按键按下并计数时,信号输出对应各个模式,桐乡当亮度模式按下时,信号的占空比改变。 4源程序 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 ,clear,btn1,btn2,btn3: in std_logic; --定义时钟、复位、按键1、2、3 colred ,colgreen ,rowout : out std_logic_vector(7 downto 0); --列信号行信号输出 bout0,bout1,bout2,bout3: out std-logic --防抖动信号 ); end dianzhen;
architecture behave of dianzhen is signal stared ,stagre : std_logic_vector(3 downto 0); signal cred ,row ,cgreen,redtm,gretm : std_logic_vector(7 downto 0); signal smode,sligc,scc : std_logic_vector(1 downto 0); signal zred ,zgreen : std_logic_vector(2 downto 0); signal stm : std_logic_vector(5 downto 0); signal cnt :integer range 0 to 799999; signal xtx :integer range 0 to 99999; signal gun :integer range 0 to 1023999999;
signal cnt0,cnt1,cnt2,cnt3: integer range 0 TO 7; 6
signal data0,data1,data2,data3: std_logic; begin process(clk_in,btn1) --brn1键防抖动 begin if(clk_in'event and clk_in = '0') then if(data0 /= btn1) then cnt0 <= cnt0 + 1; else cnt0 <= 0; end if; if cnt0 >= 5 then data0 <= btn1; cnt0 <= 0; end if; end if; bout0 <= data0; end process;
process(clk_in,btn2) --btn2键防抖动 begin if (clk_in'event and clk_in = '0') then if(data1 /= btn2) THEN cnt1 <= cnt1 + 1; else cnt1 <= 1; end if; if cnt1 >= 5 then data1 <= btn2; cnt1 <= 1; end if ; end if ; bout1 <= data1; end process;
process(clk_in,btn3) --button2 --btn3键防抖动 begin if (clk_in'event and clk_in = '0') then if(data2 /= btn3) then cnt2 <= cnt2 + 1; else cnt2 <= 0; end if; if cnt2 >= 5 then data2 <= btn3; cnt2 <= 0; 7
end if; end if; bout2 <= data2; end process;
p1:process(clk_in,btn1,btn2,btn3,clear,stared,stagre,zred,zgreen,cnt,gun,xtx) --分频 begin if clear='1' then --复位模式 smode<="00"; sligc<="00"; scc<="00"; else if (btn1'event and btn1='1' )then --模式选择、亮度选择、循环选择 smode<=smode+1; end if; if (btn2'event and btn2='1') then sligc<=sligc+1; end if; if (btn3'event and btn3='1') then scc<=scc+1; end if; end if;
if (clk_in'event and clk_in='1') then --模式选择分频器 if cnt=99999 then cnt<=cnt+1; row<="11111110"; elsif cnt=199999 then cnt<=cnt+1; row<="11111101"; elsif cnt=299999 then cnt<=cnt+1; row<="11111011"; elsif cnt=399999 then cnt<=cnt+1; row<="11110111"; elsif cnt=499999 then cnt<=cnt+1; row<="11101111"; elsif cnt=599999 then cnt<=cnt+1; 8
row<="11011111"; elsif cnt=699999 then cnt<=cnt+1; row<="10111111"; elsif cnt=799999 then cnt<=cnt+1; row<="01111111"; else cnt<=cnt+1; end if;
if xtx=12499 then --亮度选择分频器 xtx<=xtx+1; zred<="000"; zgreen<="000"; elsif xtx=24999 then xtx<=xtx+1; zred<="001"; zgreen<="001"; elsif xtx=37499 then xtx<=xtx+1; zred<="010"; zgreen<="010"; elsif xtx=49999 then xtx<=xtx+1; zred<="011"; zgreen<="011"; elsif xtx=62499 then xtx<=xtx+1; zred<="100"; zgreen<="100"; elsif xtx=74999 then xtx<=xtx+1; zred<="101"; zgreen<="101"; elsif xtx=87499 then xtx<=xtx+1; zred<="110"; zgreen<="110"; elsif xtx=99999 then xtx<=xtx+1; zred<="111"; zgreen<="111";