vhdl实验报告_16乘16点阵_字选
- 格式:docx
- 大小:158.14 KB
- 文档页数:12
综合实践总结报告综合实践名称: EDA技术与实践综合实践地点、时间题目功能分析和设计实验的要求有如下三点:1.用16*16点阵的发光二极管显示字符;2.可显示字符为0~9的数字字符与A~F英文字母的大写;3.输入为四位二进制矢量;按照要求可知,LED点阵模块,共由16×16=256个LED发光二极管组成,如何在该点阵模块上显示数字和字母是本实验的关键。
先将要显示的每一幅图像画在一个16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布以数字8为例,点阵分布为:0000000000000000000000000000000000011111111110000001111111111000000110000001100000011000000110000001100000011000000111111111100000011111111110000001100000011000000110000001100000011000000110000001111111111000000111111111100000000000000000000000000000000000考虑到实际物理实验平台上点阵发光二极管的原理,以下为16×16点阵LED外观图,只要其对应的X、Y轴顺向偏压,即可使LED 发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
所以我采用行列扫描的方法,用四位二进制数做列选信号(总共16列),如选中第一列,则扫描第一列之中哪些行是高电平(1),哪些行是低电平(0);为高电平的则点亮,为低电平的不亮。
(列信号都接地)。
如此,列选信号由“0000”变到“1111”时,16列扫描完毕,一个字也就出来了,列选信号重新由“0000”开始扫描。
注意扫描频率必须要足够快,才能保证显示一个数字或字母时所有灯在肉眼看来是同时在闪烁的。
再者,就是字变换的问题。
题目要求可显示字符为0~9的数字字符与A~F英文字母的大写;16个字正好用四位二进制表示,字选信号。
每个字选信号对应一个0到9,A到F中的一个字模(像前面列出的8的字模一样)。
通常情况下是1s变一个字符,但我在实验时考虑到仿真的问题,将字选信号的变化周期缩小很多,以便仿真。
要注意的是,列选信号变化频率一定是比字选信号大得多的。
一.总体模块划分1.字选模块输入为一个时钟信号,输出为4位二进制(用xuan 表示)字选信号,用来顺序输出题目要求的16个字。
因为设计采用字选模块和列选模块使用同一个输入时钟脉冲,但是字选信号的变化频率比列选信号要小得多。
所以该模块中还应该设置一个计数器,计数器满,则Q加1,即变向下一个字,同时计数器重新置零。
2.列选模块输入为一个时钟信号,输出为4位二进制(用sel表示)列选信号,用来选中列,进行扫描。
3.显示模块输入为字选信号和列选信号,输出为16位二进制,用来表示一列,该列中的1的位置就表示亮灯的位置,0的位置表示不亮。
每扫描一列就输出一列,看该列中哪些行是1,哪些行是0。
该模块应该包含0~9,A~F这16个字模。
4.顶层模块该模块采用图形模式(.gdf),将所有的模块按要求合理连接起来后,再添加上顶层的输入输出信号。
附顶层图:二.代码实现1.顶层模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY dianzhen ISPORT(k1,clk,reg,red,RES:IN STD_LOGIC;SEL:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);Q:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));END DIANZHEN;ARCHITECTURE A OF DIANZHEN ISCOMPONENT XUANZIPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT XUANZPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT XUAPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT XUPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT XUSPORT(red,REG:IN STD_LOGIC;ZI,si,MI,NI:in STD_LOGIC_VECTOR(3 DOWNTO 0); Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT LIEXUANPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END COMPONENT;COMPONENT XIANSHIPORT(res:IN STD_LOGIC;XUAN:IN STD_LOGIC_VECTOR(3 DOWNTO 0);SEL:IN STD_LOGIC_VECTOR(3 DOWNTO 0);Q:OUT STD_LOGIC_VECTOR(15 DOWNTO 0));END COMPONENT;SIGNAL ZI_DAOUT,SI_DAOUT,MI_DAOUT,NI_DAOUT,XUAN_DAOUT,SEL_DAOUT:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINSEL<=SEL_DAOUT;U1:XUANZI PORT MAP(CLK=>CLK,Q=>ZI_DAOUT);U2:XUANZ PORT MAP(CLK=>CLK,Q=>SI_DAOUT);U3:XUA PORT MAP(CLK=>CLK,Q=>MI_DAOUT);U4:XU PORT MAP(CLK=>CLK,Q=>NI_DAOUT);U5:XUS PORT MAP(REG=>REG,RED=>RED,ZI=>ZI_DAOUT,SI=>SI_DAOUT,MI=>MI_DAOUT,NI=>NI_DAOUT,Q=>XUAN_DAOUT);U6:LIEXUAN PORT MAP(CLK=>CLK,Q=>SEL_DAOUT);U7:XIANSHI PORT MAP(RES=>RES,SEL=>SEL_DAOUT,XUAN=>XUAN_DAOUT,Q=>Q);END A;2.字选模块:四种环节字选中间选择环节xus:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XUS ISPORT(red,REG:IN STD_LOGIC;ZI,si,MI,NI:in STD_LOGIC_VECTOR(3 DOWNTO 0); Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY XUS;ARCHITECTURE A OF XUS ISBEGINPROCESS(zi,si,red)BEGINCASE red ISWHEN '0'=>CASE reg ISWHEN '0'=>Q<=zi;WHEN '1'=>Q<=si;END CASE;WHEN '1'=>CASE reg ISWHEN '0'=>Q<=mi;WHEN '1'=>Q<=ni;END CASE;END CASE;END PROCESS;END A;(1)情况‘1’:zi +1循环LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XUANZI ISPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY XUANZI;ARCHITECTURE XZ OF XUANZI ISBEGINPROCESS(CLK)VARIABLE COUNT:INTEGER RANGE 1600 DOWNTO 0; VARIABLE ZI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINIF CLK'EVENT AND CLK='1' THENIF COUNT=1600 THENIF zi="1111" THENzi:="0000";ELSEzi:=zi+1;END IF;COUNT:=0;COUNT:=COUNT+1;END IF;END IF;Q<=zi;END PROCESS;END ARCHITECTURE XZ;(2)情况‘2’SI: -1循环LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XUANZ ISPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY XUANZ;ARCHITECTURE XZ OF XUANZ ISBEGINPROCESS(CLK)VARIABLE COUNT:INTEGER RANGE 1600 DOWNTO 0; VARIABLE ZI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINIF CLK'EVENT AND CLK='1' THENIF COUNT=1600 THENIF zi="0000" THENzi:="1111";ELSEzi:=zi-1;END IF;COUNT:=0;ELSECOUNT:=COUNT+1;END IF;Q<=zi;END PROCESS;END ARCHITECTURE XZ;(3)情况‘3’MI: +2循环LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XUA ISPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY XUA;ARCHITECTURE XZ OF XUA ISBEGINPROCESS(CLK)VARIABLE COUNT:INTEGER RANGE 1600 DOWNTO 0; VARIABLE ZI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINIF CLK'EVENT AND CLK='1' THENIF COUNT=1600 THENIF zi="1111" THENzi:="0001";ELSEzi:=zi+2;END IF;COUNT:=0;ELSECOUNT:=COUNT+1;END IF;END IF;Q<=zi;END PROCESS;END ARCHITECTURE XZ;(4)情况‘4’NI: -2循环LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XU ISPORT(CLK:IN STD_LOGIC;Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY XU;ARCHITECTURE XZ OF XU ISBEGINPROCESS(CLK)VARIABLE COUNT:INTEGER RANGE 1600 DOWNTO 0; VARIABLE ZI:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGINIF CLK'EVENT AND CLK='1' THENIF COUNT=1600 THENIF zi="0001" THENzi:="1111";ELSEzi:=zi-2;END IF;COUNT:=0;ELSECOUNT:=COUNT+1;END IF;END IF;Q<=zi;END PROCESS;END ARCHITECTURE XZ;三.仿真结果这里只仿真顶层模块。