基于VHDL点阵LED控制电路设计
LED点阵动画显示控制的VHDL程序实现

VHDL特点 特点
1.功能强大 功能强大 2.可移植性 可移植性 3.独立性 独立性 4.可操作性 可操作性 5.灵活性 灵活性
设计思路
1.数据文档读取 2.实现对数据文档的读取控制 3.数据在LED点阵板显示
LED板送数 板送数
LED点阵板电路图
数字“ 数字“0”
MIF文件格式 文件格式
WIDTH=8; DEPTH=8; ADDRESS_RADIX=BIN; DATA_RADIX=BIN; ADDRESS_RADIX:DATA_RADIX end
设计模块流程
各种信号的输入 CLK CLR GO
主模块:接收控制信号进行数据处理, 并且输出存储器输出数据行数控制以 及LED点阵板对应行号(ROW)
汉字显示
在LED点阵板上显示的“点”字
LED点阵动画显示控制 点阵动画显示控制 的VHDL程序实现 程序实现
学生:胡云龙 指导老师:张家波
VHDL语言 语言
VHDL的英文全称为very-high-speed integrated circuit hardware description language。1978年底,VHDL被美国电气和电 子工程师协会Institute of Electrical and Electronics Engineers (IEEE) 和美国国防部 确认为标准硬件描述语言。
设计程序
P1:process(go) begin if(go'event and go='1')then ----高电频“1”为触发态 if(cntdata<9)then cntdata<=cntdata+1; ----cntdata参数小于9,最大值为cntdata+1 else cntdata<=0; ----其他情况,输出显示“0”的数据 end if; end if; end process P1;
基于VHDL语言的8×8点阵模块控制器设计

基于VHDL语言的8×8点阵模块控制器设计
杨斌;李亚峻;乔广欣;李松;李毅
【期刊名称】《数字技术与应用》
【年(卷),期】2018(036)005
【摘要】介绍了LED点阵显示模块的硬件连接、MAX7219的初始化与工作时序,用VHDL语言编程实现了时钟分频、数据的存储与调用、MAX7219控制器的设计.将Basys2开发板与点阵模块相连,将程序下载到FPGA上,实现了8×8点阵的显示,验证了设计的正确性,该设计具有实际应用价值.
【总页数】3页(P6-8)
【作者】杨斌;李亚峻;乔广欣;李松;李毅
【作者单位】天津科技大学电子信息与自动化学院,天津 300222;天津科技大学电子信息与自动化学院,天津 300222;天津科技大学电子信息与自动化学院,天津300222;天津科技大学电子信息与自动化学院,天津 300222;天津科技大学电子信息与自动化学院,天津 300222
【正文语种】中文
【中图分类】TP273
【相关文献】
1.VXI总线从模块时序控制器的VHDL语言设计 [J], 王军伟;王建林;张亮
2.基于FPGA的16×16点阵模块控制器设计 [J], 乔广欣;李亚峻;李松;杨斌;于宝堃
3.基于VHDL语言的作息时间控制器设计 [J], 林振宇;梁耀升
4.基于VHDL语言的16路彩灯控制器的设计 [J], 刘茵杰; 梁耀升
5.基于VHDL语言的8×8点阵模块控制器设计 [J], 杨斌;李亚峻;乔广欣;李松;李毅因版权原因,仅展示原文概要,查看原文内容请购买。
彩灯控制电路设计与实现(VHDL编程)

实验名称:彩灯控制电路设计与实现实验任务要求:用VHDL 语言设计并实现一个彩灯控制电路,仿真并下载验证其功能。
彩灯有两种工作模式 ,可通过拨码开关或按键进行切换。
(1)单点移动模式:一个点在8个发光二极管上来回的亮(2)幕布式:从中间两个点,同时向两边依次点亮直至全亮,然后再向中间点灭,依次往复设计思路和过程:可以将两种模式分开设计,再用一个控制钮进行切换。
两种模式本质一样,都是循环点亮灯。
可以用状态机设计。
首先明确设计对象的外部特征,输入信号只有时钟信号cp 和切换按钮此处取a;输出为检测的八个彩灯亮暗。
根据设计对象的操作控制步来确定有限状态机的状态。
取初始状态为s0,第一种模式共有14种状态循环,因而可取状态s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13;第二种模式有八种状态,可共用第一种模式中的前八种状态,即为s0,s1,s2,s3,s4,s5,s6,s7。
根据题目要求的循环可以写出各个状态的下一状态,写完整个循环为止。
切换按钮可以用一个If 来总领。
单点移动模式:S0 S5S13 S7S8 S9 S10 S11 S1 S2 S3 S4S12 S6幕布式:流程图:彩灯电路设计语言:library ieee;use ieee.std_logic_1164.all;entity pmd isport(a,cp:in std_logic; %输入信号deng: out std_logic_vector(7 downto 0) %输出灯信号);end pmd;architecture arch of pmd istype all_state is (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13);%枚举状态机状态 S0 S7 S6 S1 S5 S4S2 S3signal state:all_state; %状态转换符号begin %开始程序process(cp)beginif (cp'event and cp='1')then %时钟信号开始计数if(a='1')then %单点循环模式case state iswhen s0=> state<=s1;deng<="00000001"; %状态循环when s1=> state<=s2;deng<="00000010";when s2=> state<=s3;deng<="00000100";when s3=> state<=s4;deng<="00001000";when s4=> state<=s5;deng<="00010000";when s5=> state<=s6;deng<="00100000";when s6=> state<=s7;deng<="01000000";when s7=> state<=s8;deng<="10000000";when s8=> state<=s9;deng<="01000000";when s9=> state<=s10;deng<="00100000";when s10=> state<=s11;deng<="00010000";when s11=> state<=s12;deng<="00001000";when s12=> state<=s13;deng<="00000100";when s13=> state<=s0;deng<="00000010";when others =>state<=s0;deng<="00000000";end case;Else %切换为幕布式case state iswhen s0=> state<=s1;deng<="00011000";when s1=> state<=s2;deng<="00111100";when s2=> state<=s3;deng<="01111110";when s3=> state<=s4;deng<="11111111";when s4=> state<=s5;deng<="01111110";when s5=> state<=s6;deng<="00111100";when s6=> state<=s7;deng<="00011000";when s7=> state<=s0;deng<="00000000";when others =>state<=s0;deng<="00000000";end case;end if;end if;end process; end arch;输入波形:添加五十分频后的仿真程序:library ieee;use ieee.std_logic_1164.all;entity cd isport(a,clk:in std_logic;q: out std_logic_vector(7 downto 0));end cd;architecture a of cd istype all_state is (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13);signal state:all_state;signal cnt : integer range 0 to 24999999; %50分频状态signal clk_tmp : std_logic;beginprocess(clk)Begin %开始运行分频信号if (clk'event and clk='1') thenif cnt=24999999 thencnt<=0;clk_tmp<= not clk_tmp;elsecnt<=cnt+1;end if;end if;if (clk_tmp'event and clk_tmp='1')then %分频后运行彩灯程序if(a='1')thencase state iswhen s1=> state<=s2;q<="00000010";when s2=> state<=s3;q<="00000100";when s3=> state<=s4;q<="00001000";when s4=> state<=s5;q<="00010000";when s5=> state<=s6;q<="00100000";when s6=> state<=s7;q<="01000000";when s7=> state<=s8;q<="10000000";when s8=> state<=s9;q<="01000000";when s9=> state<=s10;q<="00100000";when s10=> state<=s11;q<="00010000";when s11=> state<=s12;q<="00001000";when s12=> state<=s13;q<="00000100";when s13=> state<=s0;q<="00000010";when others =>state<=s0;q<="00000000";end case;elsecase state iswhen s0=> state<=s1;q<="00011000";when s1=> state<=s2;q<="00111100";when s2=> state<=s3;q<="01111110";when s3=> state<=s4;q<="11111111";when s5=> state<=s6;q<="00111100";when s6=> state<=s7;q<="00011000";when s7=> state<=s0;q<="00000000";when others =>state<=s0;q<="00000000";end case;end if;end if;end process;end a;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity cd isport(a,clk:in std_logic;q: out std_logic_vector(7 downto 0));end cd;architecture a of cd istype all_state is (s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13); signal state:all_state;beginprocess(clk)beginif (clk'event and clk='1') thenif(a='1') thencase state iswhen s0=> state<=s1;q<="00000001";when s1=> state<=s2;q<="00000010";when s2=> state<=s3;q<="00000100";when s3=> state<=s4;q<="00001000";when s4=> state<=s5;q<="00010000";when s5=> state<=s6;q<="00100000";when s6=> state<=s7;q<="01000000";when s7=> state<=s8;q<="10000000";when s8=> state<=s9;q<="01000000";when s9=> state<=s10;q<="00100000";when s10=> state<=s11;q<="00010000";when s11=> state<=s12;q<="00001000";when s12=> state<=s13;q<="00000100";when s13=> state<=s0;q<="00000010";when others =>state<=s0;q<="00000000";end case;elsecase state iswhen s0=> state<=s1;q<="00011000";when s1=> state<=s2;q<="00111100";when s2=> state<=s3;q<="01111110";when s3=> state<=s4;q<="11111111";when s4=> state<=s5;q<="01111110";when s5=> state<=s6;q<="00111100";when s6=> state<=s7;q<="00011000";when s7=> state<=s0;q<="00000000";when others =>state<=s0;q<="00000000";end case;end if;end if;end process;end a;故障及问题分析:1.编写这个程序时,很自然地想到用一个输入信号控制两种模式的切换,但把这个输入放在哪里,如何放,开始出现了几种想法。
利用可编程器件实现点阵式LED显示

© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.
专题技术与工程应用
VHDL 主要用于描述数字系统的结构 、行为 、功 能和接口 。除了含有许多具有硬件特征语句外 ,语 言形式和描述风格与句法十分类似于一般的计算机 高级语言 。VHDL 的程序结构特点是将一项工程设 计 ,或者设计实体 (可以是一个元件 ,一个电路模块 或一个系统) 分成外部 (或称端口) 和内部 ,即实体的 内部功能和算法完成部分 。在对一个设计实体定义 了外部界面后 ,一旦其内部开发完成后 ,其他的设计 就可以直接调用这个实体 。
图 2 CPLD 内部设置方案
对于 CPLD 的设计分为 4 个模块 :分频器模块 、 扫描驱动控制模块 、读取存储器和移位寄存器模块 。
3 详细设计描述
(1) 读取存储器模块 读取存储器模块的主要功能是发出存储器的地 址码 ,给存储器地址并从相应存储器地址中取数据 。 这个模块主要由地址输出线 ,读取完毕信号端口 ,控 制输入和时钟输入端口组成 ,存储器中的数据是由 单片机来控制不断更新的 ,它的地址是一个连续的 空间 。因此 ,只需要把地址循环相加给出地址就可 以了 ,然后从相应的地址空间里读取数据 。当有的 地址访问过后数据就要更新 ,这时候读取完毕信号 端口给单片机一个回馈的信号 ,来让单片机控制存 储器更新数据 。另外还需要按照在读取数据的时候 要特别注意所选用存储器的时序 ,这样才能稳定可 靠地读出数据 。 (2) 分频器模块 分频器模块的主要的作用是给不同的内部逻辑 和外部电路提供不同频率的时钟信号 。比如给读取 存储器模块合适的频率时钟来满足存储器的时序 , 给移位寄存器模块提供不同的频率做数据的移位 等 。分频器的设计实际上就是一个计数器 ,在这个 模块中一共有 2 个输入端口 (中心时钟输入口和使 能口) 和多个输出的端口 (计数器的各个数组的端 口) ,采用二进制相加 ,2 个中心时钟后计数器的十 位变化 ,这样就达到了二分频的作用 ,4 个时钟过 后 ,计数器的百位开始变化 ,如此起到了四分频的作 用 ,依此类推 ,在条件允许的情况下可以多倍分频达 到分频的效果 。 (3) 移位寄存器模块 由于 595 是一个串入并出的器件 ,而从存储器 中读到的数据是 8 位的数据 ,而控制点阵式 LED 的 寄存器是串入并出的 ,如何把从存储器中读到的 8 位数据并行打入到点阵式 LED 的列上呢 ? 因此 ,在 CPLD 中设置了一个并串转换的移位寄存器 ,把八位 的数据一次打入到这个并串转换的寄存器上 ,然后 每过一个时钟送出一位的数据线串入到那个串入并 出的寄存器上 。并且要在下一个从存储器中读到的 数据打入之前把原来的数据串行串送完毕 ,此时串 出送给 595 的速度应当是从存储器中并行打入数据 的速度的 8 倍 。要满足这样的速度就需要不同的频 率的时钟 ,所以用一个上述的分频器来提供不同的 频率时钟信号 。
基于FPGA及VHDL的LED点阵汉字滚动显示设计方案【VIP专享】

基于FPGA及VHDL的LED点阵汉字滚动显示设计方案发布: 2011-8-31 | 作者: —— | 来源:wangliuguo| 查看: 555次| 用户关注:汉字滚动显示器的传统设计方法是用单片机来控制的,虽然单片机方案具有价格低廉,程序编程灵活等特点,但由于单片机硬件资源的限制,未来对设计的变更和升级,总是要付出较多研发经费和较长投放市场周期的代价,甚至有可能需要重新设计。
况且,在以显示为主的系统中,单片机的运算和控制等主要功能的利用率很低,单片机的优势得不到发挥,相当于很大的资源浪费。
采用EDA技术的自顶向下的模块化设计方法,借助相关开发软件,例如Qua汉字滚动显示器的传统设计方法是用单片机来控制的,虽然单片机方案具有价格低廉,程序编程灵活等特点,但由于单片机硬件资源的限制,未来对设计的变更和升级,总是要付出较多研发经费和较长投放市场周期的代价,甚至有可能需要重新设计。
况且,在以显示为主的系统中,单片机的运算和控制等主要功能的利用率很低,单片机的优势得不到发挥,相当于很大的资源浪费。
采用EDA技术的自顶向下的模块化设计方法,借助相关开发软件,例如QualtusⅡ软件,将硬件描述语言——VHDL程序固化于具有丰富I/O口、内部逻辑和连线资源的FPGA(现场可编程门阵列)中。
该技术具有系统设计效率高、集成度好、保密性强、易于修改、易于实现等优点,成为当今数字系统设计主流技术。
此方式所制作的LED点阵控制器,由于是纯硬件行为,具有速度快、可靠性高、抗干扰能力强、开发周期短等显著优点。
1 EDA点阵显示汉字原理以8×8的LED点阵为例,8×8的LED点阵是由64个发光二极管按矩阵形式排列而成,每一行上的发光管有一个公共的阳极(或阴极),每一列上的发光管有一个公共的阴极(或阳极),一般按动态扫描方式显示汉字或图形。
扫描分为点扫描、行扫描和列扫描三种方式。
行扫描需要按行抽取字型码,列扫描则需要按列抽取字型码。
基于VHDL语言的8×8点阵模块控制器设计

6收稿日期:2018-04-16*基金项目:天津科技大学大学生实验室创新基金(1702A203),全国高校实验室工作研究会学术研究计划(SY2015Z059)。
作者简介:杨斌(1995—),男,天津人,本科在读,天津科技大学大学生实验室创新基金(No.1702A203)项目组成员。
通讯作者:李亚峻(1973—),女,内蒙包头人,博士,讲师,研究方向:FPGA 应用设计、信号与信息处理。
LED点阵显示系统不仅能够静态显示字符和图像,而且能够动态显示文字、动画、视频等信息,在广告、信息发布、体育比赛、工业等各个领域都有广泛应用。
LED点阵显示控制器的种类不少,包括单片机[1]、ARM [2, 3]、FPGA [4],等等。
本文采用DIGILENT公司的Basys2便携式开发板,它是完整的即用型硬件系统,适于从基本逻辑器件到复杂控制器的电路设计,其上嵌有Xilinx Spartan-3E系列FPGA器件[5]。
8×8点阵有16个引脚,如果直接与微处理器相连占用引脚资源太多,实际多用译码器、串并转换芯片控制点阵。
本文采用的8×8点阵模块由一片MAX7219驱动。
1 基于MAX7219的8×8点阵模块1.1 8×8点阵模块的硬件连接图1所示为MAX7219芯片的主要引脚。
它只有三个输入端DIN、CS、CLK,可以与所有通用的微处理器相连,所以由MAX7219驱动的8×8点阵模块克服了点阵引脚过多的问题。
MAX7219芯片的输出端DIG0~DIG7连到8×8点阵H1~H8行,SEG DP、SEG A~G连到8×8点阵L1~L8列,DOUT作为串行输出可用于级联扩展。
MAX7219中含有BCD编码器(本文未用到)、多路扫描回路(对DIG0~DIG7以不低于800Hz的频率自动轮询扫描)、段驱动器(驱动SEG DP、SEG A~G8段)和8×8 SRAM静态随机存储器(用于存储数据)。
VHDL模块电路原理图画法

一、创建VHDL模块,生成一个原理图符号1、在项目导航器(Projec t Naviga tor)菜单中,点击Projec t——>Add Source添加一个VH DL模块——counte r.vhd2、在Sourc e in Projec t窗口中,选中计数器模块coun ter.vhd3、在Proce ss 窗口中,点击Desi gn Utilities之前的“+”符号,然后双击Cr eate Schema tic Symbol经过以上步骤,名称为“counte r”的图形化元件被放入到工程项库中。
二、创建一个新的顶层原理图1、在项目导航器(Projec t Naviga tor)菜单中,点击Projec t——>Create New Source2、选择源类型为S chem atic3、输入原理图名为counte r64、先点击“Next”,再点击“Finish”此时,原理图编辑器自动启动并打开一个空白原理图。
三、放置元件符号1、在原理图编辑器菜单中,选择Add——> Symbol2、在Categ ories栏(在屏幕左上侧)中选中项目所在路径(把proce ss窗口下拉一点即可看到),然后从元件符号列表Sy m bols中选择co unte r,该元件符号便附着在光标上。
3、移动光标至目标位置,单击左键,完成元件放置。
4、如需放置多个相同元件,只需多次单击左键其它操作提示:a 移动器件:光标移动至器件,按住鼠标左键并移动鼠标至目标位置,松开左键。
b 放大或缩小:单击菜单栏中的c 删除器件:光标移动至器件,单击鼠标右键,然后选择De l ete.四、添加连线1、首先激活画线功能,在菜单中选择A dd——>Wire2、移动光标至画线起始位置,单击鼠标左键,然后移动光标至目标位置,单击鼠标左键,完成画线。
EDA实验报告:基于VHDL语言的交通灯控制系统设计与实现

图为k1=0时的输出状态s1,输出恒为011110。即亮灯为R1,y2。保持时间1S。
(k2=0)
上图为k2=0时的输出状态s2,输出恒为101011。即亮灯为G1,R2。保持时间2S。
(k3=0)
上图为k3=0时的输出状态s3,输出恒为110011。即亮灯为R1,G2。保持时间1S。
四、小结及心得体会
else
if counter<5 then
next_state<=s3;
else
next_state<=s0;
end if;
end if;
end if;
end if;
end if;
end case;
end process;
ouput:process(current_state)
begin ——显示程序
begin
u1: jiaotongdeng port map(
clk=>clki,
k0=>k0,
k1=>k1,
k2=>k2,
k3=>k3,
r1=>r1,r2=>r2,g1=>g1,g2=>g2,y1=>y1,y2=>y2
);
u2: div port map(clk=>clk1,clk_out=>clki);
end if;
end if;
end if;
when s3=>
if k0='0' then
next_state<=s0;
else
if k1='0' then
next_state<=s1;