VHDL点阵显示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电路课程设计报告
课程:基于FPGA的点阵显示控制器的设计
学院:电气信息工程学院
专业:测控技术与仪器
班级:
姓名:
学号:
合作者姓名:
日期:
一、引言
随着我国经济的高速发展,对公共场合发布信息的需求日益增长,利用LED 点阵滚动显示汉字的出现正好适应了这一市场需求,已经成为信息传播的一种重要手段。
采用传统方法设计的汉字滚动显示器,通常需要使用单片机、存储器和制约逻辑电路来进行PCB板级的系统集成。尽管这种方案有单片机软件的支持较为灵活,但是由于受硬件资源的限制,未来对设计的变更和升级,总是难以避免要付出较多研发经费和较长投放市场周期的代价。随着电子设计自动化(EDA)技术的进展,基于可编程FPGA器件进行系统芯片集成的新设计方法,也正在快速地到代基于PCB板的传统设计方式。因此,基于FPGA和VHDL语言实现在8*8点阵上的汉字静态或一屏显示问题。
二、课题要求
(1)技术要求
1根据电路特点,用层次设计概念。将此设计任务分成若干模块,规定每一模块的功能和各模块之间的借口,透视加深层次化设计概念;
2软件的原件管理深层含义,以及模块元件之间的连接概念,对于不同目录下的同一设计,如何熔合;
3适配划分前后的仿真内容有何不同概念,仿真信号对象有何不同,有更深一步了解。熟悉了FPGA设计的调试过程中手段的多样化;
4按适配划分后的管脚定位,同相关功能块硬件电路接口连线;
(2)功能要求
1在8*8点阵上显示汉字
2可以静态显示或一屏显示
3利用拨码开关来实现静态显示与一屏显示切换
(3)本人的工作
三、设计方案
(1)工作原理
8*8点阵原理:按照要求可知,点阵模块,共由8*8=64个发光二极管组成,如何在该点阵模块上显示汉字是本实验的关键。
先将要显示的每幅图像画在8*8共64个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,五笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形矿上的分布以“正”为例,点阵分布为:
10000000
10000001
11110001
10000001
11111111
10001001
10001001
10000000
(2)原理框图
四、单元电路设计,仿真结果与分析
(1)静态显示“正”
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_Unsigned.all;
use ieee.std_logic_ARITH.all;
ENTITY peng is
port(clk,en:in std_logic;
lie:out std_logic_vector(7 downto 0); --列
com:out std_logic_vector(7 downto 0));--行
End peng;
Architecture a of peng is
signal st1:std_logic_vector(7 downto 0);
signal osc:std_logic;
signal osd:std_logic;
signal d_ff:std_logic_vector(27 downto 0);
signal data:std_logic_vector(7 downto 0);
signal d0,d1,d2,d3,d4,d5,d6,d7:std_logic_vector(7 downto 0);
signal lie0,lie1,lie2,lie3,lie4,lie5,lie6,lie7:std_logic_vector(7 downto 0);
Begin
com<=data;
lie<=st1;
d0<="10000000";
d1<="10000001";
d2<="11110001";
d3<="10000001";
d4<="11111111";
d5<="10001001";
d6<="10001001";
d7<="10000000";--字库正
First:process
begin
wait until clk='1';
if(d_ff(27 downto 0)>=2e8)then
d_ff(27 downto 0)<="0000000000000000000000000000";
else
d_ff(27 downto 0)<=d_ff+1;
end if;
osc<=not d_ff(10);
end process first;
second:process(osc)
begin
if(osc='1' and osc'event and en='0')then
if st1(7 downto 0)="00000000"or st1(7 downto 0)="01111111"then st1(7 downto 0)<="11111110";data<=d0;
elsif st1(7 downto 0)="11111110"then
st1(7 downto 0)<="11111101";data<=d1;
elsif st1(7 downto 0)="11111101"then
st1(7 downto 0)<="11111011";data<=d2;
elsif st1(7 downto 0)="11111011"then
st1(7 downto 0)<="11110111";data<=d3;
elsif st1(7 downto 0)="11110111"then
st1(7 downto 0)<="11101111";data<=d4;
elsif st1(7 downto 0)="11101111"then
st1(7 downto 0)<="11011111";data<=d5;
elsif st1(7 downto 0)="11011111"then
st1(7 downto 0)<="10111111";data<=d6;
elsif st1(7 downto 0)="10111111"then
st1(7 downto 0)<="01111111";data<=d7;
end if;
end if;
end process second;
end a;