Verilog程序(汉字点阵显示

合集下载

中文版VerilogHDL简明教程

中文版VerilogHDL简明教程

Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。

被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。

数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。

Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。

所有这些都使用同一种建模语言。

此外,Verilog HDL 语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。

Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。

因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。

语言从C编程语言中继承了多种操作符和结构。

Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。

但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。

当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。

历史Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模拟器产品开发的硬件建模语言。

那时它只是一种专用语言。

由于他们的模拟、仿真器产品的广泛使用,Verilog HDL 作为一种便于使用且实用的语言逐渐为众多设计者所接受。

在一次努力增加语言普及性的活动中,Verilog HDL语言于1990年被推向公众领域。

Open Verilog International (OVI)是促进Verilog发展的国际性组织。

1992年,OVI决定致力于推广Verilog OVI标准成为IEEE标准。

这一努力最后获得成功,Verilog 语言于1995年成为IEEE标准,称为IEEE Std 1364-1995。

ultraedit verilog语法

ultraedit verilog语法

UltraEdit Verilog 语法Verilog 是一种硬件描述语言,用于描述数字电路。

UltraEdit 是一种文本编辑器,具有强大的功能和可扩展性,可以方便地编辑 Verilog 代码,并且支持 Verilog 语法的高亮显示和自动补全。

本文将介绍UltraEdit Verilog 语法的相关内容,帮助您更好地使用 UltraEdit 编辑 Verilog 代码。

一、UltraEdit 简介UltraEdit 是一款功能强大的文本编辑器,拥有诸多专业编辑功能和便捷操作,广泛用于软件开发、全球信息站编程等领域。

UltraEdit 具有多窗口编辑、语法高亮、代码折叠、自动补全、宏录制等功能,使得编辑效率大大提升。

二、Verilog 简介Verilog 是硬件描述语言(HDL)之一,用于描述数字电路。

Verilog 可以描述数电路的结构、行为和时序等方面,被广泛应用于数字电路设计和验证领域。

Verilog 代码可以使用文本编辑器进行编写,而UltraEdit 提供了 Verilog 语法高亮显示和自动补全等功能,大大方便了 Verilog 代码的编辑和维护。

三、UltraEdit Verilog 语法高亮UltraEdit 对 Verilog 语法有良好的支持,可以进行语法高亮显示,使得 Verilog 代码更加易读和易于理解。

在 UltraEdit 中编辑 Verilog 代码时,不同的关键字、操作符、注释等都会以不同的颜色进行显示,方便用户区分和识别。

四、UltraEdit Verilog 语法自动补全在编辑 Verilog 代码时,UltraEdit 还提供了 Verilog 语法的自动补全功能,可以快速输入 Verilog 代码,提高编码效率。

当输入关键字或操作符时,UltraEdit 会自动提示可能的补全选项,用户可以通过键盘方向键或鼠标进行选择,从而快速完成代码输入。

五、UltraEdit Verilog 代码折叠UltraEdit 可以对 Verilog 代码进行折叠显示,将代码块进行折叠,使得代码结构更加清晰,方便用户查看和编辑。

Verilog中的一些语法和技巧

Verilog中的一些语法和技巧

Verilog中的⼀些语法和技巧1、.2、.3、Reg型的数据类型默认初始值为X。

reg型数据可以赋正值也可以赋负值,但是当⼀个reg型数据是⼀个表达式的操作数的时候,他的值被当做⽆符号数及正值。

4、在数据类型中?和Z均表⽰⾼阻态。

5、Reg型只表⽰被定义的信号将⽤在“always”模块内,并不是说reg型⼀定是寄存器或触发器的输出。

虽然reg型信号常常是寄存器或触发器的输出但是并不⼀定总是这样。

6、Verilog语⾔中没有多维数组的存在。

Memory型数据类型是通过扩展reg型数据的弟⼦和范围来⽣成的。

其格式如下reg[n-1:0]存储器名[m-1:0];7、在除法和取余的运算中结果的符号和第⼀个操作数的符号位是相同的。

8、不同长度的数据进⾏运算:两个长度不同的数据进⾏位运算时,系统会⾃动地将两者按有端对齐,位数少的操作数会在相应的⾼位⽤0填满以便连个操作数安慰进⾏操作。

9、= = =与!= = =和= =与!= =的区别:后者称为逻辑等是运算符,其结果是2个操作数的值决定的。

由于操作书中某些位可能不定值x和⾼阻态z结果可能是不定值x。

⽽ = = =和!= = =运算符对操作数的⽐较时对某些位的⾼阻态z和不定值x也进⾏⽐较,两个操作数必须完全⼀致,其结果才是1,否则是0.10、⾮阻塞和阻塞赋值⽅式:⾮阻塞赋值⽅式(如a<=b)上⾯语句所赋得变量值不能⽴即被下⾯语句所⽤,(2)快结束后才能完成这次赋值操作 3在编写克综合的时序逻辑模块时这是最常⽤的赋值⽅法。

阻塞赋值(如a=b)赋值语句执⾏完后,块才结束 2 b的值在赋值语句完成后⽴即执⾏ 3在时序逻辑使⽤中,可能产⽣意想不到的结果。

11、模块的描述⽅式:(RTL为寄存器传输级描述)“(1)数据流描述⽅式:数据流⾏描述主要⽤来描述组合功能,具体⽤“assign”连续赋值语句来实现。

分为两种a、显式连续赋值语句;连线型变量类型[连线型变量为快]连线型变量名Assign #(延时量)连线型变量名=赋值表达式;显式连续赋值语句包含了两条语句;第⼀条是对连线型变量的进⾏类型说明的说明语句;第⼆句是对这个已得到声明的连线型变量进⾏连续赋值语句。

verilog-矩阵键盘

verilog-矩阵键盘

二、矩阵键盘显示电路设计(显示键盘值的平方)矩阵键盘显示电路的设计一、实验目的1、了解普通4×4 键盘扫描的原理。

2、进一步加深七段码管显示过程的理解。

3、了解对输入/输出端口的定义方法。

二、实验原理实现键盘有两种方案:一是采用现有的一些芯片实现键盘扫描;再就是用软件实现键盘扫描。

作为一个嵌入系统设计人员,总是会关心产品成本。

目前有很多芯片可以用来实现键盘扫描,但是键盘扫描的软件实现方法有助于缩减一个系统的重复开发成本,且只需要很少的CPU 开销。

嵌入式控制器的功能能强,可能充分利用这一资源,这里就介绍一下软键盘的实现方案。

图10-1 简单键盘电路通常在一个键盘中使用了一个瞬时接触开关,并且用如图10-1 所示的简单电路,微处理器可以容易地检测到闭合。

当开关打开时,通过处理器的 I/O 口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的/IO口的输入将被拉低得到逻辑0。

可遗憾的是,开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的 1或者 0。

尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。

当触点闭合时,其弹起就像一个球。

弹起效果将产生如图10-2所示的好几个脉冲。

弹起的持续时间通常将维持在 5ms∼30ms 之间。

如果需要多个键,则可以将每个开关连接到微处理器上它自己的输入端口。

然而,当开关的数目增加时,这种方法将很快使用完所有的输入端口。

图10-2 按键抖动键盘上阵列这些开关最有效的方法(当需要5个以上的键时)就形成了一个如图10-3 所示的二维矩阵。

当行和列的数目一样多时,也就是方型的矩阵,将产生一个最优化的布列方式(I/O 端被连接的时候),一个瞬时接触开关(按钮)放置在每一行与线一列的交叉点。

矩阵所需的键的数目显然根据应用程序而不同。

每一行由一个输出端口的一位驱动,而每一列由一个电阻器上拉且供给输入端口一位。

图10-3 矩阵键盘键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的 4 行均为高电平,那么肯定没有按键按下,否则,如果读入的4 行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。

vhdl实验报告_16乘16点阵_列选_显示

vhdl实验报告_16乘16点阵_列选_显示

综合实践总结报告综合实践名称: 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”开始扫描。

注意扫描频率必须要足够快,才能保证显示一个数字或字母时所有灯在肉眼看来是同时在闪烁的。

汉字点阵显示VHDL源程序

汉字点阵显示VHDL源程序

汉字点阵显示VHDL源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity hzxs isport(clk1,clk2:in std_logic;rd:out std_logic;we: out std_logic;ledw:out std_logic_vector(2 downto 0); d:out std_logic_vector(0 downto 7));end hzxs;architecture hav of hzxs issignal count:std_logic_vector(0 to 2);signal a: std_logic_vector(3 downto 0);beginprocess(clk2)beginif clk2'event and clk2='1' thencount<=count+1;end if;ledw<=count;a(2 downto 0)<=count;end process;process(clk1)beginif clk1'event and clk1='1' thena(3)<=not a(3);end if;end process;process(a)begincase a iswhen"0000"=>d<="10110100";--数when"0001"=>d<="11111111"; when"0010"=>d<="01001010"; when"0011"=>d<="11011010"; when"0100"=>d<="11110110"; when"0101"=>d<="11100110"; when"0110"=>d<="01110110"; when"0111"=>d<="11011011"; when"1000"=>d<="00010000";--字when"1001"=>d<="11111111";when"1010"=>d<="11111101"; when"1011"=>d<="00001100"; when"1100"=>d<="11111111"; when"1101"=>d<="00010000"; when"1110"=>d<="00010000"; when"1111"=>d<="00001100";when others=>d<="00000000";end case;end process;rd<='1';we<='0';end hav;数字抢答器VHDL源程序1)抢答器QDQlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity qdq isport(clr:in std_logic;a,b,c,d:in std_logic;an,bn,cn,dn:out std_logic);end qdq;architecture hav of qdq issignal ss:std_logic_vector(0 to 3);beginss<=a&b&c&d;process(clr,a,b,c,d)beginif clr='1' thencase ss iswhen "1000"=>an<='1';bn<='0';cn<='0';dn<='0'; when "0100"=>an<='0';bn<='1';cn<='0';dn<='0'; when "0010"=>an<='0';bn<='0';cn<='1';dn<='0'; when "0001"=>an<='0';bn<='0';cn<='0';dn<='1'; when others=>an<='0';bn<='0';cn<='0';dn<='0'; end case;elsif clr='0' thenan<='0';bn<='0';cn<='0';dn<='0';end if;end process;end hav;2)计分器JFQlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity jfq isport(en1:in std_logic;clk3:in std_logic;bs:out std_logic_vector(3 downto 0);ss:out std_logic_vector(3 downto 0);gs:out std_logic_vector(3 downto 0);add:in std_logic;dec:in std_logic);end jfq;architecture hav of jfq isbeginprocess(clk3,en1,add,dec)variable ssw:std_logic_vector(3 downto 0); variable bsw:std_logic_vector(3 downto 0); beginbsw:="0001";if clk3='1' and clk3'event thenif en1='1' thenif add='1' thenif ssw="1001" thenbsw:=bsw+1;ssw:="0000";elsessw:=ssw+1;end if;elsif dec='1' thenif ssw="1111" thenbsw:=bsw-1;ssw:="1001";elsessw:=ssw-1;end if;end if;end if;end if;ss<=ssw;bs<=bsw;gs<="0000";end process;end hav;3) 选择器XZQlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity xzq isport( a1,b1:in std_logic;abw:in std_logic_vector(0 to 3);asw:in std_logic_vector(0 to 3);agw:in std_logic_vector(0 to 3);bbw:in std_logic_vector(0 to 3);bsw:in std_logic_vector(0 to 3);bgw:in std_logic_vector(0 to 3);obw:out std_logic_vector(0 to 3);osw:out std_logic_vector(0 to 3);ogw:out std_logic_vector(0 to 3)); end xzq;architecture hav of xzq isbeginprocess(a1,b1)beginif a1='1' and b1='0' thenobw<=abw;osw<=asw;ogw<=agw;elsif a1='0' and b1='1' thenobw<=bbw;osw<=bsw;ogw<=bgw;end if;end process;end hav;4)译码器YMQlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity ymq isport( clk2:in std_logic;bw:in std_logic_vector(3 downto 0);sw:in std_logic_vector(3 downto 0);gw:in std_logic_vector(3 downto 0);y:out std_logic_vector(7 downto 0);ledw:out std_logic_vector(2 downto 0)); end ymq;architecture hav of ymq issignal knum:std_logic_vector(3 downto 0); signal count:std_logic_vector(2 downto 0); beginprocess(clk2)beginif clk2'event and clk2='1' thenif count<2 thencount<=count+1;elsecount<="000";end if;end if;end process;ledw<=count;knum<=gw when count=0 elsesw when count=1 elsebw when count=2 ;y<="00111111" when knum="0000" else "00000110" when knum="0001" else"01011011" when knum="0010" else"01001111" when knum="0011" else"01100110" when knum="0100" else"01101101" when knum="0101" else"01111101" when knum="0110" else"00000111" when knum="0111" else"01111111" when knum="1000" else"01101111" when knum="1001" else"00000000" ;end hav;。

基于FPGA的点阵汉字显示

FPGA综合设计实验报告题目 16×16点阵汉字显示作者徐双健专业微电子0902 日期 2013年4月1号第一章前言 (3)1.1本设计的研究背景和研究目的 (3)1.2LED点阵显示特点 (3)1.3FPGA设计的特点 (3)第二章系统设计 (5)2.1设计任务与要求 (5)2.1.2设计要求 (5)2.2设计原理 (5)2.2.1总体设计方案 (5)2.3扫描控制模块2.3.1LED的显示原理 (5)2.4方案一: (6)此法太过麻烦! (18)2.5方案二 (19)2.5.1汉字的存储 (19)2.5.1汉字显示 (21)第三章系统调试与仿真 (24)3.1开发环境介绍 (24)3.2调试与仿真 (24)3.2.1 创建工程 (24)3.2.2 编译前设置 (24)3.2.3 全程编译 (26)3.2.4时序仿真 (27)第四章结束语 (29)答谢辞...............................................................错误!未定义书签。

第一章前言1.1 本设计的研究背景和研究目的鉴于LED的自身优势,主要应用于以下几大方面:∙显示屏、交通讯号显示光源的应用LED灯具有抗震耐冲击、光响应速度快、省电和寿命长等特点,广泛应用于各种室内、户外显示屏,分为全色、双色和单色显示屏,全国共有100多个单位在开发生产。

交通信号灯主要用超高亮度红、绿、黄色LED,因为采用LED信号灯既节能,可靠性又高,所以在全国范围内,交通信号灯正在逐步更新换代,而且推广速度快,市场需求量很大,是个很好的市场机会。

∙汽车工业上的应用汽车用灯包含汽车内部的仪表板、音响指示灯、开关的背光源、阅读灯和外部的刹车灯、尾灯、侧灯以及头灯等。

汽车用白炽灯不耐震动撞击、易损坏、寿命短,需要经常更换。

1987年,我国开始在汽车上安装LED高位刹车灯。

由于LED响应速度快,可以及早提醒司机刹车,减少汽车追尾事故,在发达国家,使用LED制造的中央后置高位刹车灯已成为汽车的标准件,美国HP公司在1996年推出的LED汽车尾灯模组可以随意组合成各种汽车尾灯。

verilog知识点总结

verilog知识点总结Verilog是一种硬件描述语言(HDL),用于描述数字电路和系统,它广泛应用于数字系统设计和仿真领域。

本文将总结一些Verilog 的重要知识点,以帮助读者更好地理解和应用Verilog。

一、Verilog的基本语法Verilog的基本语法包括模块声明、端口声明、信号声明、数据类型、运算符等。

Verilog中的模块是设计的基本单元,模块声明包括模块名和端口声明。

端口可以是输入、输出或双向的。

信号声明用于定义内部信号,可以是寄存器或线网类型。

Verilog支持多种数据类型,包括整数、浮点数、向量、数组等。

Verilog还提供了丰富的运算符,包括算术运算符、逻辑运算符、位运算符等。

二、组合逻辑电路描述Verilog可以用来描述各种组合逻辑电路,如与门、或门、非门等。

通过使用逻辑运算符和条件语句,可以很方便地描述组合逻辑电路的功能。

Verilog还提供了多种语法结构,如if语句、case语句等,用于描述复杂的逻辑功能。

三、时序逻辑电路描述时序逻辑电路是一种带有状态的电路,Verilog可以用来描述各种时序逻辑电路,如触发器、计数器、状态机等。

通过使用时钟信号和触发器,可以实现电路的时序行为。

Verilog提供了多种触发器类型,如D触发器、JK触发器、T触发器等,可以根据实际需求选择合适的触发器类型。

四、模块实例化和层次化设计Verilog支持模块的实例化和层次化设计,可以将一个模块实例化为另一个模块的一部分。

通过模块实例化,可以方便地实现模块的复用和层次化设计。

层次化设计可以使整个系统更加清晰和模块化,方便调试和维护。

五、仿真和验证Verilog可以用于对设计进行仿真和验证,以确保设计的正确性。

Verilog提供了仿真器,可以对设计进行时序仿真和波形查看。

通过仿真,可以验证设计的功能和时序行为是否符合要求。

Verilog 还支持测试向量的生成和自动验证,可以自动生成测试向量并进行自动验证。

LED16×16点阵汉字显示设计(VHDL版)

毕业设计(论文)开题报告设计(论文)题基于FPGA的LED 16×16点阵汉字显示设计目一、选题的背景和意义:LED点阵显示屏是集微电子技术、计算机技术、信息处理技术于一体的大型显示屏系统。

它以其色彩鲜艳,动态范围广,亮度高,寿命长,工作稳定可靠等优点而成为众多显示媒体以及户外作业显示的理想选择。

受到体育场馆用LED显示屏需求快速增长的带动,近年来,中国 LED显示屏应用逐步增多。

目前,LED已经广泛应用在银行、火车站、广告、体育场馆之中。

而随着奥运会、世博会的临近,LED显示屏将广泛的应用在体育场馆以及道路交通指示中,LED显示屏在体育广场中的应用将出现快速增长。

因此,本设计是很有必要的,之所以基于FPGA设计是因为现场可编程门阵列(FPGA)设计周期小,灵活度高,适合用于小批量系统,提高系统的可靠性和集成度。

并且采用编写灵活的VHDL语言编写主程序。

本设计可以方便的应用到各类广告宣传中。

二、课题研究的主要内容:1. 实现16×16点阵的汉字显示;2. 实现有限汉字显示;4. 实现汉字的滚动显示;5. 完成方案论证。

三、主要研究(设计)方法论述:通过去图书馆查阅书籍收集资料,同时在搜索引擎上检索资料,分析借鉴已有类似产品、设计方案与成功经验,选择几种可行方案比对,最后确定最切实可行的方案展开设计。

通过Multisim或Quartus软件对系统进行模拟仿真,对电路功能进行改进与完善。

在EDA试验箱上进行调试。

四、设计(论文)进度安排:时间(迄止日期)工作内容2010.5.17-5.23理解并确认毕业设计任务书,撰写完成毕业设计开题报告(第1周)2010.5.24-5.30完成调研与资料收集、整理(第2周)2010.5.31-6.6设计方案及原理框图确定(第3周)2010.6.7-7.4电路资料收集,单元电路设计(第4、5、6、7周)2010.7.5-7.18电路仿真与改进、完善(第8、9周)2010.19-8.1资料整理(第10、11周)2010..8.2-8.8书写毕业设计报告(第12周)2010.8.9-8.16(第13周)修改毕业设计报告并整理装订五、指导教师意见:指导教师签名:年月日六、系部意见:系主任签名:年月日目录摘要ABSTRACT第一章前言 (1)1.1本设计的研究背景和研究目的 (1)1.2LED点阵显示特点 (2)1.3FPGA设计的特点 (2)第二章系统设计 (4)2.1设计任务与要求 (4)2.1.1设计任务 (4)2.1.2设计要求 (4)2.2设计原理 (4)2.2.1总体设计方案 (4)2.2.2方案的比较 (5)2.3扫描控制模块 (6)2.3.1 LED的显示原理 (6)2.3.2汉字的存储 (7)2.4汉字显示 (7)2.4.1列循环扫描 (8)2.4.2字符样式设计 (10)2.4.3字母循环扫描及期间的延时环节 (14)2.5整个完整的程序 (15)第三章系统调试与仿真 (22)3.1开发环境介绍 (22)3.2调试与仿真 (22)3.2.1 创建工程 (22)3.2.2 编译前设置 (23)3.2.3 全程编译 (25)3.2.4时序仿真 (26)第四章结束语 (29)答谢辞 (29)参考文献 (29)摘要主要研究基于VHDL的 Led点阵汉字滚动显示。

verilog写的LCD1602显示

verilog写的LCD1602显示**-------------------------------------------文件信息----------------------------------------------------------** 文件名称:LCD_Top.v** 创建者:** 创建日期:2008** 版本号:V3.0** 功能描述:按键检测****--------------------------------------修改文件的相关信息--------------------------------------------------** 修改人:** 修改日期:** 版本号:** 修改内容:*********************************************************************************/// LCD_Top.v//连接Clock_Gen模块和LCD_Driver模块module LCD_Top(clk_48M,rst,LCD_EN,RS,RW,DB8);input clk_48M,rst;output LCD_EN,RS,RW;output [7:0] DB8;wire clk_LCD; //用于将Clock_Gen模块clk_LCD输出连接至LCD_Driver模块的clk_LCD输入Clock_Gen U1(.clk_48M(clk_48M),.rst(rst),.clk_LCD(clk_LCD));LCD_Driver U2(.clk_LCD(clk_LCD),.rst(rst),.LCD_EN(LCD_EN),.RS(RS),.RW(RW),.DB8(DB8));endmodule// Clock_Gen.v/****************为LCD_Drvier模块产生500Hz的时钟信号**************/module Clock_Gen(clk_48M,rst,clk_LCD);input clk_48M,rst; //rst为全局复位信号(高电平有效)output clk_LCD;wire clk_counter;reg [11:0] cnt; //对时钟进行计数分频wire clk_equ;reg [9:0] count;reg clk_BUF;parameter counter= 50; //多少分频/******************************************************************************** ** 模块名称:分频器** 功能描述:通过计数器实现分频功能.********************************************************************************/ always@(posedge clk_48M)beginif(!rst) //低电平复位cnt <= 12'd0;elseif(clk_equ)cnt <= 12'd0;elsecnt <= cnt+1'b1;endassign clk_equ = (cnt==counter);assign clk_counter = clk_equ;always @(posedge clk_counter or negedge rst)begin //利用计数器分频产生500Hz时钟if(!rst)beginclk_BUF <= 1'b0;count <= 10'b0;endelsebeginif(count == 10'd1000)beginclk_BUF <= ~clk_BUF;count <= 10'b0;endelsebeginclk_BUF <= clk_BUF; //clk_BUF为500Hz的时钟信号count <= count + 1'b1;endendendassign clk_LCD = clk_BUF;//clk_LCD为LCD_Drvier模块所需要的500Hz的时钟信号endmodule// LCD_Driver.v//功能简述:在1602液晶模块上显示字符串,其中第一行显示“Welcom to hx"// 在第二行显示“"//液晶模块为TC1602A,相关特性请参考其数据手册module LCD_Driver(clk_LCD,rst,LCD_EN,RS,RW,DB8);input clk_LCD,rst; //rst为全局复位信号(高电平有效)output LCD_EN,RS,RW;//LCD_EN为LCD模块的使能信号(下降沿触发)//RS=0时为写指令;RS=1时为写数据//RW=0时对LCD模块执行写操作;RW=1时对LCD模块执行读操作output [7:0] DB8; //8位指令或数据总线reg [7:0] DB8;reg [111:0] Data_First_Buf,Data_Second_Buf; //液晶显示的数据缓存reg RS,LCD_EN_Sel;reg [3:0] disp_count;reg [3:0] state;parameter Clear_Lcd = 4'b0000, //清屏并光标复位Set_Disp_Mode = 4'b0001, //设置显示模式:8位2行5x7点阵Disp_On = 4'b0010, //显示器开、光标不显示、光标不允许闪烁Shift_Down = 4'b0011, //文字不动,光标自动右移Write_Addr = 4'b0100, //写入显示起始地址Write_Data_First = 4'b0101, //写入第一行显示的数据Write_Data_Second = 4'b0110, //写入第二行显示的数据Idel = 4'b0111; //空闲状态parameter Data_First = "welcome to hx", //液晶显示的第一行的数据Data_Second = ""; //液晶显示的第二行的数据assign RW = 1'b0; //RW=0时对LCD模块执行写操作assign LCD_EN = LCD_EN_Sel ? clk_LCD : 1'b0;//通过LCD_EN_Sel信号来控制LCD_EN的开启与关闭always @(posedge clk_LCD or negedge rst)beginif(!rst)beginstate <= Clear_Lcd; //复位:清屏并光标复位RS <= 1'b0; //复位:RS=0时为写指令;DB8 <= 8'b0; //复位:使DB8总线输出全0LCD_EN_Sel <= 1'b1; //复位:开启夜晶使能信号//Data_First_Buf <= Data_First;//Data_Second_Buf <= Data_Second;disp_count <= 4'b0;endelsecase(state) //初始化LCD模块Clear_Lcd:beginstate <= Set_Disp_Mode;DB8 <= 8'b00000001; //清屏并光标复位endSet_Disp_Mode:beginstate <= Disp_On;DB8 <= 8'b00111000; //设置显示模式:8位2行5x8点阵endDisp_On:beginstate <= Shift_Down;DB8 <= 8'b00001100; //显示器开、光标不显示、光标不允许闪烁endShift_Down:beginstate <= Write_Addr;DB8 <= 8'b00000110; //文字不动,光标自动右移endWrite_Addr:beginstate <= Write_Data_First;DB8 <= 8'b10000001; //写入第一行显示起始地址:第一行第二个位置Data_First_Buf <= Data_First; //将第一行显示的数据赋给Data_First_Buf?endWrite_Data_First: //写第一行数据beginif(disp_count == 14) //disp_count等于14时表示第一行数据已写完beginDB8 <= 8'b11000001; //送入写第二行的指令RS <= 1'b0;disp_count <= 4'b0;Data_Second_Buf <= Data_Second;state <= Write_Data_Second; //写完第一行进入写第二行状态endelsebeginDB8 <= Data_First_Buf[111:104];Data_First_Buf <= (Data_First_Buf << 8);RS <= 1'b1; //RS=1表示写数据disp_count <= disp_count + 1'b1;state <= Write_Data_First;endendWrite_Data_Second: //写第二行数据beginif(disp_count == 14)beginLCD_EN_Sel <= 1'b0;RS <= 1'b0;disp_count <= 4'b0;state <= Idel; //写完进入空闲状态endelsebeginDB8 <= Data_Second_Buf[111:104];Data_Second_Buf <= (Data_Second_Buf << 8);RS <= 1'b1;disp_count <= disp_count + 1'b1;state <= Write_Data_Second;endendIdel:beginstate <= Idel; //在Idel状态循环enddefault: state <= Clear_Lcd; //若state为其他值,则将state置为Clear_Lcd endcaseendendmodule。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国石油大学数电课程设计报告题目:学院:班级:姓名:学号:日期: 2012 年 12月摘要设计要求:利用EDA/SOPC 实验开发平台提供的16*16点阵LED以及EPC235核心板,实现循环显示“中国石油大学”这6个汉字(左移或者右移均可)。

(1)手动生成“中国石油大学”这6个汉字在16*16点阵LED 上的6个字模(即控制某些LED亮,某些LED灭)。

(2)实现循环显示“中国石油大学”这6个汉字(左移或者右移均可)。

(3)拓展要求:自主设计(如控制循环速度,方向)。

关键词:扫描分频,控制速度,点阵,点阵汉字显示,设计原理及方案:1、16*16点阵LED内部结构如下图所示。

2、总体设计框图:3、各子模块的设计:(1)、分频,扫描:module fenpin (clk_50Mhz,clk_4hz,k2,k3);input clk_50Mhz,k2,k3; // 输入端口声明output clk_4hz; // 输出端口声明reg[24:0] count,ccount;reg clk_4hz;always @(posedge clk_50Mhz)beginif ((k2==0) && (k3==0))ccount<=500000000;if ((k2==0) && (k3==1))ccount<=100000000;if ((k2==1) && (k3==0))ccount<=50000000;if ((k2==1) && (k3==1))ccount<=10000000;if(count<ccount)begincount<=count+1'b1;clk_4hz<=0;endelsebegincount<=0;clk_4hz<=1;endendendmodule生成模块:(2)扫描,控制速度:module sudu(clk,cnt);input clk;output cnt;reg cnt;reg[15:0] p;always@(posedge clk)beginif(p==16'b1111111111111111)begincnt<=1'b1;p<=16'b0000000000000000;endelsebeginp<=p+16'b1;cnt<=1'b0;endendendmodule生成模块:(3)显示汉字模块:module xianshi(clk2,clk3,row,con,k); input clk2,clk3,k;output[15:0] row;output[15:0] con;reg[15:0] row;reg[15:0] con;integer cnt,b;reg[15:0] r[111:0];initialbegin// 中r[0]<=16'b 1111111111111111;r[1]<=16'b 1111111111111111;r[2]<=16'b 1111100000011111;r[3]<=16'b 1111101111011111;r[4]<=16'b 1111101111011111;r[5]<=16'b 1111101111011111;r[6]<=16'b 1111101111011111;r[7]<=16'b 1000000000000001;r[8]<=16'b 1111101111011111;r[9]<=16'b 1111101111011111;r[10] <=16'b 1111101111011111; r[11] <=16'b 1111101111011111; r[12] <=16'b 1111100000011111; r[13] <=16'b 1111111111111111; r[14] <=16'b 1111111111111111; r[15] <=16'b 1111111111111111;// 国r[16] <=16'b 1111111111111111;r[18] <=16'b 1100000000000111; r[19] <=16'b 1101111111110111; r[20] <=16'b 1101011011010111; r[21] <=16'b 1101011011010111; r[22] <=16'b 1101011011010111; r[23] <=16'b 1101000000010111; r[24] <=16'b 1101011011010111; r[25] <=16'b 1101011011010111; r[26] <=16'b 1101001011010111; r[27] <=16'b 1101011011010111; r[28] <=16'b 1101111111110111; r[29] <=16'b 1100000000000111; r[30] <=16'b 1111111111111111; r[31] <=16'b 1111111111111111;// 石r[32] <=16'b 1111111111111111; r[33] <=16'b 1111111111111111; r[34] <=16'b 1110111111110111; r[35] <=16'b 1111011111110111;r[37] <=16'b 1111110111110111; r[38] <=16'b 1110100001110111; r[39] <=16'b 1110111100110111; r[40] <=16'b 1110111101010111; r[41] <=16'b 1110111101100111; r[42] <=16'b 1110111101100111; r[43] <=16'b 1110000001110111; r[44] <=16'b 1111111111110111; r[45] <=16'b 1111111111110111; r[46] <=16'b 1111111111111111; r[47] <=16'b 1111111111111111;// 油r[48] <=16'b 1111111111111111; r[49] <=16'b 1111111111111111; r[50] <=16'b 1111111011101111; r[51] <=16'b 1000000111011111; r[52] <=16'b 1111101110111111; r[53] <=16'b 1111111111111111; r[54] <=16'b 1100000001111111;r[56] <=16'b 1101101101111111; r[57] <=16'b 1100000000000111; r[58] <=16'b 1101101101111111; r[59] <=16'b 1101101101111111; r[60] <=16'b 1100000001111111; r[61] <=16'b 1111111111111111; r[62] <=16'b 1111111111111111; r[63] <=16'b 1111111111111111;// 大r[64] <=16'b 1111111111111111; r[65] <=16'b 1101111111111111; r[66] <=16'b 1110111111111111; r[67] <=16'b 1110111110111111; r[68] <=16'b 1111011110111111; r[69] <=16'b 1111101110111111; r[70] <=16'b 1111110010111111; r[71] <=16'b 1111111100001111; r[72] <=16'b 1111110010111111; r[73] <=16'b 1111101110111111;r[75] <=16'b 1110111110111111; r[76] <=16'b 1110111111111111; r[77] <=16'b 1101111111111111; r[78] <=16'b 1111111111111111; r[79] <=16'b 1111111111111111;// 学r[80] <=16'b 1111111111111111; r[81] <=16'b 1111111111111111; r[82] <=16'b 1111111101111111; r[83] <=16'b 1111011110111111; r[84] <=16'b 1111011111011101; r[85] <=16'b 1111011011010011; r[86] <=16'b 1011011011011101; r[87] <=16'b 1000001011010011; r[88] <=16'b 1111010011011111; r[89] <=16'b 1111011011000111; r[90] <=16'b 1111011111011001; r[91] <=16'b 1111011101011111; r[92] <=16'b 1111111110011111;r[94] <=16'b 1111111111111111; r[95] <=16'b 1111111111111111;// 中r[96] <=16'b 1111111111111111; r[97] <=16'b 1111111111111111; r[98] <=16'b 1111100000011111; r[99] <=16'b 1111101111011111; r[100] <=16'b 1111101111011111; r[101] <=16'b 1111101111011111; r[102] <=16'b 1111101111011111; r[103] <=16'b 1000000000000001; r[104] <=16'b 1111101111011111; r[105] <=16'b 1111101111011111; r[106] <=16'b 1111101111011111; r[107] <=16'b 1111101111011111; r[108] <=16'b 1111100000011111; r[109] <=16'b 1111111111111111; r[110] <=16'b 1111111111111111; r[111] <=16'b 1111111111111111;endalways@(posedge clk3) beginif (k==0)beginif (b==95)b<=0;elseb<=b+1;endelsebeginif (b==0)b<=95;elseb<=b-1;endendalways@(posedge clk2) beginif(cnt==15)begincnt<=0;endelsecnt<=cnt+1;case(cnt)0: con<=16'b0000_0000_0000_0001; 1: con<=16'b0000_0000_0000_0010; 2: con<=16'b0000_0000_0000_0100; 3: con<=16'b0000_0000_0000_1000; 4: con<=16'b0000_0000_0001_0000; 5: con<=16'b0000_0000_0010_0000; 6: con<=16'b0000_0000_0100_0000; 7: con<=16'b0000_0000_1000_0000; 8: con<=16'b0000_0001_0000_0000; 9: con<=16'b0000_0010_0000_0000; 10: con<=16'b0000_0100_0000_0000; 11: con<=16'b0000_1000_0000_0000;12: con<=16'b0001_0000_0000_0000; 13: con<=16'b0010_0000_0000_0000; 14: con<=16'b0100_0000_0000_0000; 15: con<=16'b1000_0000_0000_0000;endcase//行使能if (k==0)begincase(cnt)0: row<=r[b+0];1: row<=r[b+1];2: row<=r[b+2];3: row<=r[b+3];4: row<=r[b+4];5: row<=r[b+5];6: row<=r[b+6];7: row<=r[b+7];8: row<=r[b+8];9: row<=r[b+9];11: row<=r[b+11]; 12: row<=r[b+12]; 13: row<=r[b+13]; 14: row<=r[b+14]; 15: row<=r[b+15];endcaseendelse begincase(cnt)0: row<=r[b-0]; 1: row<=r[b-1]; 2: row<=r[b-2]; 3: row<=r[b-3]; 4: row<=r[b-4]; 5: row<=r[b-5]; 6: row<=r[b-6]; 7: row<=r[b-7]; 8: row<=r[b-8]; 9: row<=r[b-9]; 10: row<=r[b-10]; 11: row<=r[b-11];13: row<=r[b-13];14: row<=r[b-14];15: row<=r[b-15];endcaseendendendmodule生成模块:电路的仿真:分析与总结:这次数点实习我去测试了俩次,第一次测试时,什么现象都没有,我回去后反复检查,程序都没有问题,后来我觉得可能是我生成模块时,全都放在一个文件夹里,混乱了。

相关文档
最新文档