Verilog程序(汉字点阵显示
中文版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 语法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中的⼀些语法和技巧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-矩阵键盘
二、矩阵键盘显示电路设计(显示键盘值的平方)矩阵键盘显示电路的设计一、实验目的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点阵_列选_显示
综合实践总结报告综合实践名称: 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源程序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. 学生能理解点阵显示的基本原理,掌握点阵与汉字的对应关系。
2. 学生能够运用所学的编程知识,实现点阵显示汉字的基本操作。
3. 学生了解汉字编码的基本方法,能够运用点阵编码显示简单的汉字。
技能目标:1. 学生通过动手实践,培养编程思维和解决问题的能力。
2. 学生能够运用所学知识,独立完成点阵显示汉字的编程任务。
3. 学生能够运用团队协作,共同完成更为复杂的点阵显示汉字项目。
情感态度价值观目标:1. 学生通过学习点阵显示汉字,培养对电子信息技术和中华传统文化的兴趣。
2. 学生在实践过程中,培养勇于尝试、不断探索的精神,增强自信心。
3. 学生通过团队协作,培养沟通与协作能力,提高集体荣誉感。
课程性质:本课程为信息技术与电子技术的跨学科课程,结合了编程、汉字文化和电子显示技术。
学生特点:六年级学生具备一定的编程基础和汉字知识,对电子技术有一定的好奇心,喜欢动手实践。
教学要求:本课程要求教师以学生为主体,注重启发式教学,引导学生主动探究,培养创新精神和实践能力。
同时,关注学生的个体差异,提供有针对性的指导。
通过课程目标的分解,使学生在知识、技能和情感态度价值观方面均取得具体的学习成果,为后续教学设计和评估提供依据。
二、教学内容1. 点阵显示原理:介绍点阵显示的基本原理,包括LED点阵的构造、工作原理及显示方式。
- 教材章节:第三章“电子显示技术”2. 汉字编码:讲解汉字编码的基本方法,如区位码、国标码等,以及与点阵的对应关系。
- 教材章节:第五章“汉字编码与处理”3. 点阵编程:教授如何运用编程语言(如Arduino)控制点阵显示汉字。
- 教材章节:第七章“编程控制硬件”4. 汉字点阵制作:介绍汉字点阵的制作方法,包括查找表格、使用软件转换等。
- 教材章节:第八章“汉字点阵显示技术”5. 实践操作:设计实践项目,让学生动手操作,实现点阵显示汉字。
- 教材章节:第九章“实践项目”6. 点阵显示汉字案例分析:分析典型案例,让学生了解点阵显示汉字在实际应用中的效果。
[数字系统设计与Verilog HDL(第7版 (9)[24页]
LCD12864B的初始化指令
初始化过程 1 2 3 4
行地址/XY
字符显示
图形显示
8 ' h38
8 ' h30
8 ' h0C
8 ' h3E
8 ' h01
8 ' h36
8 ' h06
8 ' h01
1: ' h80 2: ' h903: ' h88 4: ' h98
Y: ' h80~ ' h9FX: ' h80/ ' h88
LCD1602B的初始化指令
初始化过程 1 2
初始化指令 8 ' h38 8 ' h01
功能
设置显示模式:16×2显示,5×7点 阵,8位数据接口
清屏,将以前的显示内容清除
3 4 行地址
8 ' h06
光标设置:光标右移,字符不移
8 ' h0c
开显示,光标不显示(如要显示光标 可改为8 ' h0e)
1行:' h802行:' hc0
第1行地址第2行地址
LCD1602图形点阵液晶显示模块广泛应用于智能仪器仪表、工业控 制领域、通信和家用电器中。本节用FPGA控制 LCD12864B汉字图形点阵液晶实现字符和图形的显示。 LCD12864B可显示汉字及图形,内置8192个中文汉字 (16×16点阵)、128个字符(8×16点阵)及64×256点 阵显示RAM(GDRAM)。
15
F0 15
8
3E
F0 3E
R
2D
F0 2D
9
46
F0 46
verilog %用法
verilog %用法摘要:1.Verilog 简介2.Verilog 的基本语法3.Verilog 模块的实例化4.Verilog 的用途正文:1.Verilog 简介Verilog 是一种硬件描述语言(HDL),主要用于数字系统硬件的描述、模拟和验证。
它最初由Phil Moorby 在1983 年开发,后来由Cadence 公司进一步完善。
Verilog HDL 被广泛应用于集成电路设计、FPGA 设计和ASIC 设计等领域。
2.Verilog 的基本语法Verilog 的基本语法包括以下几个部分:(1)模块:模块是Verilog 中最基本的结构,它包含输入端口和输出端口。
模块可以用来描述一个特定的功能,例如:数据选择器、寄存器、计数器等。
(2)数据类型:Verilog 中有几种基本的数据类型,如:布尔型(boolean)、整型(integer)、实型(real)等。
(3)变量:变量用于存储数据,可以是寄存器类型或wire 类型。
寄存器类型在时钟上升沿时更新,而wire 类型则在赋值语句执行时更新。
(4)运算符和表达式:Verilog 中包含各种运算符,如算术运算符、关系运算符、逻辑运算符等。
表达式是由运算符和操作数组成的,可以用于计算值或描述逻辑关系。
(5)控制结构:Verilog 中的控制结构包括if-else 语句、while 循环、for 循环等,用于实现复杂的逻辑控制。
3.Verilog 模块的实例化在Verilog 中,模块可以通过实例化进行复用。
实例化一个模块时,需要指定模块的名称以及所需的输入和输出端口。
实例化可以提高代码的可读性和可维护性。
4.Verilog 的用途Verilog 主要用于以下方面:(1)数字系统设计:Verilog 可以用于设计复杂的数字系统,如处理器、存储器、网络设备等。
(2)FPGA 设计:Verilog 可以用于设计和验证FPGA(现场可编程门阵列)中的数字电路。
点阵汉字的原理及应用
点阵汉字原理与应用一.汉字的编码由于在电脑中,所有的数据都是以0和1保存的。
因此,想要用计算机来显示汉字前提就是要将汉字以二进制,即0和1形式进行编码。
GBK内码在英文的显示操作中,一个字母、数字及字符均由1个ASCII码表示,并且由于英文字符种类相对较少,故其ASCII码是小于等于127的。
而汉字由于种类繁多,每个汉字有2个ASCII码构成,这两个ASCII码称为汉字的GBK内码,通常用十六进制表示。
例如,“啊”的GBK内码=B0 A1。
汉字的GBK内码一定大于A0H,即160,目的是为了防止与英文的ASCII码产生冲突。
区位码为了使每一个汉字有一个全国统一的代码,1980年,我国颁布了第一个汉字编码的国家标准:GB2312-80《信息交换用汉字编码字符集》基本集,这个字符集是我国中文信息处理技术的发展基础,也是目前国内所有汉字系统的统一标准。
由于国标码是四位十六进制,如汉字的GBK内码,为了便于交流,大家常用的是四位十进制的区位码。
所有的国标汉字与符号组成一个94×94的矩阵(见图1所示)。
在此方阵中,每一行称为一个"区",每一列称为一个"位",因此,这个方阵实际上组成了一个有94个区(区号分别为0 1到94)、每个区内有94个位(位号分别为01到94)的汉字字符集。
一个汉字所在的区号和位号简单地组合在一起就构成了该汉字的"区位码"。
区位码和GBK内码之间可以相互转换,区位码=GBK内码-A0H。
例如:“啊”的GBK内码=B0 A1,则其区码=B0-A0=10H=16,而其位码=A1-A0=01,所以“啊”的区位码=16 01,为4位十进制码。
在区位码中,01-09区为682个特殊字符,16~87区为汉字区,包含6763个汉字。
其中16-55区为一级汉字(3755个最常用的汉字,按拼音字母的次序排列),56-87区为二级汉字(3008个汉字,按部首次序排列)。
基于proteus的单片机汉字点阵显示电路设计
基于proteus的单片机汉字点阵显示电路设计在现代电子技术中,单片机汉字点阵显示电路设计已经成为很多领域广泛使用的技术。
通过它,我们可以方便地在屏幕上显示出各种汉字图案,为用户提供简便的操作体验。
本文将介绍如何基于proteus 设计出一个高效稳定、准确显示汉字的单片机汉字点阵显示电路。
第一步,我们首先需要明确所需材料。
材料包括一个单片机、一个电容、若干个二极管、若干个电阻、一个晶体振荡器和一个点阵显示屏等。
这些材料的选取关系到电路的性能和稳定性,务必认真选择品质较好的材料。
第二步,为单片机编写汉字点阵的显示程序。
我们可以使用C语言编写,并结合各芯片自带的编译器来编写出相应的代码。
在编写程序时,需要注意灵活性和可读性,方便后期对代码的修改和维护。
第三步,设计电路原理图。
通过proteus软件,我们可以用原理图来设计电路。
在电路中,需要通过各种元件相互配合,为单片机提供稳定的电源和信号输入输出等必要支持,同时点阵显示屏也需要接受来自单片机的控制信号,才能显示出汉字图案。
需要特别注意的是,各个元件的连接方式和节点的名称必须按照标准进行设置,遵循规范化的电路原理图设计。
第四步,验证电路实现。
通过连接好硬件和编写代码,可以利用烧录工具将程序烧录到单片机上,并将单片机和显示屏连接好,最终实现汉字的点阵显示。
通过实际测试和观察,可以验证电路原理图的正确性和可靠性,同时寻找到可能存在的问题并加以修改。
通过以上步骤,我们可以基于proteus设计出一个高效稳定、准确显示汉字的单片机汉字点阵显示电路。
当然,这只是一个简单的示范,若想在实际应用领域中发挥更大的作用,需要不断学习和探究,经过不断实践和改进,完善自己的技术和能力。
单片机课程设计---16×16点阵式汉字显示
目录摘要 (1)Abstract (2)1设计原理 (3)1.1 MCS-51单片机的结构及编程方法 (3)1.2 16*16点阵LED原理 (5)1.3 3-8译码器原理 (6)2.设计方案介绍 (7)2.1 设计总体思路 (7)2.2 与题目相关的具体设计 (7)2.3程序设计流程图 (8)3.源程序,原理图和仿真图 (9)3.1程序清单(见附录) (9)3.2电路图 (9)3.2.1电路原理图 (9)3.2.2电路图分析 (9)3.3仿真图 (10)4性能分析 (11)5.总结和心得 (12)6.参考文献 (13)附录:程序代码 (14)摘要LED点阵显示屏作为一种新兴的显示器件,是由多个独立的LED发光二极管封装而成. LED点阵显示屏可以显示数字或符号, 通常用来显示时间、速度、系统状态等。
文章给出了一种基于MCS-51单片机的16×16 点阵LED显示屏的设计方案。
包括系统具体的硬件设计方案,软件流程图和部分汇编语言程序等方面。
在负载范围内, 只需通过简单的级联就可以对显示屏进行扩展,是一种成本低廉的图文显示方案。
关键词:MCS-51;LED;单片机AbstractAs a popular display device component, LED dot-matrix display board consists of several independent LED (Light Emitting Diode). The LED dot-matrix display board can display the number or sign, and it is usually used to show time, speed, the state of system etc. This paper introduces a kind of simple 16x16 LED display screen design process based on MCS-51 single chip minicomputer . The detail hardware scheme, software flow and assemble language programmer design and so on is followed. The display part can be cascaded to meet the need. The practice proves the design is low-cost and effective.Key words: MCS-51;LED;MCU1设计原理1.1 MCS-51单片机的结构及编程方法MCS-51单片机的组成: CPU(进行运算、控制)、RAM(数据存储器)、ROM(程序存储器)、I/O口(串口、并口)、内部总线和中断系统等。
verilog教程
verilog教程Verilog是一种硬件描述语言(HDL),用于设计和描述数字电路。
它是一种事件驱动的语言,可以用来描述时序逻辑和组合逻辑。
Verilog可以用于设计和验证各种数字电路,从简单的门电路到复杂的处理器和系统。
Verilog的语法和结构与C语言相似,它由模块、端口、信号和行为描述组成。
Verilog中的模块是模块化设计的基本单元,可以将模块集成到更大的设计中。
模块可以具有输入端口、输出端口和内部信号。
输入和输出端口用于与其他模块进行通信,而内部信号用于在模块内部传递和保存数据。
Verilog的行为描述方式包括并行块和顺序块。
并行块表示同时执行的代码,而顺序块表示按顺序执行的代码。
Verilog中的并行块使用关键字"always @(posedge clock)"来表示,其中的代码只在时钟上升沿触发时执行。
顺序块使用关键字"always @(*)"来表示,其中的代码在输入信号变化时立即执行。
在Verilog中,可以使用各种逻辑运算符,如AND、OR、NOT和XOR,来实现组合逻辑。
此外,还可以使用各种触发器和寄存器类型,如D触发器和JK触发器,来实现时序逻辑。
通过将组合逻辑和时序逻辑结合起来,可以实现复杂的数字电路。
Verilog的仿真可以使用各种工具,如ModelSim和Vivado,来验证设计的正确性。
仿真可以通过将输入信号施加到设计中,然后观察输出信号的变化来进行。
如果输出信号与预期的结果一致,那么设计就是正确的。
在Verilog中,还可以使用分层设计的概念来实现模块的结构化和组织。
通过使用层次化模块,可以将设计划分为更小的模块,并将它们组合在一起以实现更大的系统。
尽管Verilog的学习曲线可能有点陡峭,但它是数字电路设计中最常用和最强大的工具之一。
通过掌握Verilog,您可以实现自己的数字电路设计,并进行验证和测试。
总之,Verilog是一种用于设计和描述数字电路的硬件描述语言。
verilog语法详解
verilog语法详解Verilog语法是一种硬件描述语言,用于设计数字电路。
它可以实现逻辑功能和控制硬件。
以下是Verilog语法的详细解释:1. 模块(Module):模块是Verilog语言中最基本的单元。
模块定义了模块内部的数据类型和信号。
模块可以实现任何逻辑功能,并且可以同其他模块组合使用。
2. 输入(Input)和输出(Output):Verilog模块通过输入和输出端口与其他模块进行通信。
输入是模块接收的数据,而输出是模块输出的数据。
使用“input”和“output”关键字来定义输入和输出。
3. 线路(Wire):线路是Verilog模块中的一种数据类型。
它可以是单个位或多个位。
用“wire”关键字定义线路。
4. 寄存器(Register):寄存器是一种Verilog模块中的数据类型,用于存储数据。
寄存器可以是单个位或多个位。
使用“reg”关键字定义寄存器。
5. 运算符(Operator):Verilog支持各种运算符,包括算术、逻辑和比较运算符。
它们用于执行各种操作,如加、减、乘、除、与、或、非、异或等。
6. 语句(Statement):Verilog中的语句用于控制程序流程。
语句可以是条件语句、循环语句、分支语句等。
常用的语句包括“if”、“else”、“while”、“for”等。
7. 实例(Instance):实例是一个模块的具体实现。
使用“module name instancename()”语句来实例化一个模块。
8. 多模块组合:Verilog允许多个模块组合在一起实现更复杂的功能。
这些模块可以通过实例化彼此来连接。
以上是Verilog语法的详细解释,掌握这些基本概念是学习Verilog的关键。
几个常用的Verilog小程序
几个常用的Verilog小程序几个常用的Verilog小程序(1) 8位串并转换module haidaoqi(clk,rst,din,dout);input clk,rst,din;output [7:0] dout;reg[7:0] data,dout;reg[2:0] cnt;always@(posedge clk or posedge rst)if(rst) //复位高有效data <=8'b0;elsedata<= {data[7:0],din};//din是输入串行数据,假设输入数据高位在前//这是一个移位寄存器always@(posedge clk or posedge rst)if(rst)cnt <= 3'b0;elseif(cnt == 3'b111)cnt <= 3'b0;elsecnt <= cnt +1;//计数器,用来计算移位次数,移位8次在以后产生一个有效数据always@(posedge clk or posedge rst)if(rst)dout <= 8'b0;elseif(cnt == 3'b111)dout <= data;//如果计数器记到7,那么输出一个有效的8位数据elsedout <= 0;endmodule(2) 8 位数据寄存器module reg8(out_data,in_data,clk,clr);output[7:0] out_data;input[7:0] in_data;input clk,clr;reg[7:0] out_data;always @(posedge clk or posedge clr)beginif(clr) out_data <=0;else out_data <=in_data;endendmodule(3) 8位数据锁存器module haidaoqi(data_out,data_in,clk,rst); output[7:0] data_out;input[7:0] data_in;input clk,rst;reg[7:0] data_out;always @(rst or clk or data_in)beginif (rst) data_out<=8'b0;else if (clk) data_out<=data_in;else data_out<=8'b0;endendmodule(4) 8位并串转换module haidaoqi(rst,clk,tem,D1);input rst,clk;input [7:0] tem;output D1;reg D1;wire [7:0] tem;reg [2:0] counter;always @(posedge clk or posedge rst) begin if (rst)begincounter<=3'b0;D1<=0;endelse if(counter==7)begincounter<=3'b0;D1<=0;endelsebegincounter<=counter+1;D1=tem[counter];endendendmodule(5) clk一分四/八频module haidaoqi(clk1,clk2,clk,rst);output clk1,clk2;input clk,rst;reg clk1,clk2;reg[7:0] state;parameter S0=8'b00000000, S1=8'b00000001,S2=8'b00000010,S3=8'b00000100,S4=8'b00001000,S5=8'b00010000,S6=8'b00100000,S7=8'b01000000,S8=8'b10000000;always@(posedge clk)if(rst)beginclk1<=0;clk2<=0;state<=S0;endelsebegincase(state)S0:state<=S1;S1:state<=S2;S2:beginclk1<=~clk1;state<=S3;endS3:state<=S4;S4:clk1<=~clk1;clk2=~clk2;state<=S5;endS5:state<=S6;S6:beginclk1<=~clk1;state<=S7;endS7:state<=S8;S8:beginclk1<=~clk1;clk2=~clk2;state<=S0;enddefault:state<=S0; endcaseendendmodule(6) 8位比较器module haidaoqi(a,b,en,y); input[width-1:0] a,b; input en;output y;reg y;parameter width=8; always@(a or b)beginif(a==b)y<=1;elsey<=0;endelsey<=0;endmodule(7)带使能端的rammodule haidaoqi(dataout,datain,ena,read,write); output[7:0] dataout;input[7:0] datain;input ena,read,write;reg[7:0] ram[1:0];parameter addr=1'b0;assign dataout=(read && ena)?ram[addr]:8'hzz;always@(posedge write)beginram[addr]<=datain;endendmodule(8) 译码器module haidaoqi(ma,a,b,c,d,e);input[2:0] ma;output a,b,c,d,e;reg a,b,c,d,e;always@(ma)case(ma)3'b001:{a,b,c,d,e}<=5'b10000;3'b010:{a,b,c,d,e}<=5'b01000;3'b011:{a,b,c,d,e}<=5'b00100;3'b100:{a,b,c,d,e}<=5'b00010;3'b101:{a,b,c,d,e}<=5'b00001;default:{a,b,c,d,e}<=5'bzzzzz;endcaseendmodule(9) 带清0/置1端的T触发器module T-trigger(clk,T,R,S,Q,Q1);input clk,T,R,S;output Q,Q1;reg Q,Q1;always @(posedge clk or negedge R or negedge S) begin if(!R)beginQ <= 1'b0;Q1<=1'b1;endelse if(!S)beginQ <=1'b1;Q1<=1'b0;endelse if(T)beginQ<=~Q;Q1<=~Q1;endendendmodule(10)带起始位识别的串并转换(存8位有效数据)module SIM(din,clk,rst,dout,ok);input din,clk,rst;output ok;output[7:0] dout;reg[7:0] indata_buf,dout;reg[3:0] counter;reg[2:0] state;reg[1:0] cnt;reg tag,ok;integer bitpos=7;parameter s0=0,s1=1,s2=2,s3=3,s4=4;always@(posedge clk or posedge rst)if(rst)beginstate<=0;counter<=0;tag<=0;indata_buf<=8'bz;cnt<=0;bitpos=7;endelse case(state)s0:begintag=0;ok<=tag;if(din)begincnt<=cnt+1;state<=s0;if(cnt==3)beginstate<=s1;cnt<=0;endendelse begincounter<=0;state<=s0;endends1:beginif(counter==7) beginstate<=s2;counter<=0;endelsebegincounter<=counter+1; state<=s0;endends2:if(!din)state<=s3;elsestate<=s0;s3:beginif(bitpos==-1)beginbitpos=7;state<=s4;endelsebeginindata_buf[bitpos]<=din;bitpos<=bitpos-1;state<=s3;endends4:begintag=1'b1;ok<=tag;dout<=indata_buf;state<=s0;endendcaseendmodul(11)移位寄存器(9位有效数据输出)module ywjc(din,clk,rst,dout,ok);input din,clk,rst;output ok;output[8:0] dout;reg[8:0] indata_buf,dout;reg[3:0] counter;reg[2:0] state;reg[1:0] cnt;reg tag,ok;integer bitpos=8;parameter s0=0,s1=1,s2=2,s3=3,s4=4; always@(posedge clk or posedge rst) if(rst) beginstate<=0;counter<=0;tag<=0;indata_buf<=9'bz;cnt<=0;bitpos=8;endelse case(state)s0:begintag=0;ok<=tag;begincnt<=cnt+1;state<=s0;if(cnt==3)beginstate<=s1;cnt<=0;endendelse begincounter<=0;state<=s0;endends1:beginif(counter==8)beginstate<=s2;counter<=0;endelsecounter<=counter+1; state<=s0;endends2:if(!din)state<=s3;elsestate<=s0;s3:beginif(bitpos==-1)beginbitpos=8;state<=s4;endelsebeginindata_buf[bitpos]<=din; bitpos<=bitpos-1; state<=s3;endends4:begintag=1'b1;ok<=tag;dout<=indata_buf;state<=s0; end endcase endmodule。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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生成模块:电路的仿真:分析与总结:这次数点实习我去测试了俩次,第一次测试时,什么现象都没有,我回去后反复检查,程序都没有问题,后来我觉得可能是我生成模块时,全都放在一个文件夹里,混乱了。