ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:28.77KB ,
资源ID:25246707      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25246707.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实训十七 基本单元电路的VHDL设计.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实训十七 基本单元电路的VHDL设计.docx

1、实训十七 基本单元电路的VHDL设计实训十七 基本单元电路的VHDL设计本章提要:本章介绍了数字系统设计中经常用到的计数器,分频器,选择器,译码器,编码器,寄存器,存储器,输入电路,显示电路等基本单元电路的VHDL程序设计。学习要求:在教师讲授这些基本单元电路的设计思想的基础上,通过上机调试熟练掌握这些基本单元电路的设计。关键词:计数器(Counter),分频器(Divder),选择器(Multiplexer),译码器(Decoder),编码器(Encoder),寄存器(Register),存储器(Memory),输入电路(Input Circuit),显示电路(Display Circuit

2、)6.1 计数器的设计6.1.1 同步计数器的设计6.1.2 异步计数器的设计6.2 分频器的设计6.3 选择器的设计6.4 译码器的设计6.5 编码器的设计6.5.1 一般编码器的设计6.5.2 优先级编码器的设计6.6 寄存器的设计6.6.1 数码寄存器的设计6.6.2 移位寄存器的设计6.6.3 并行加载移位寄存器的设计6.7 存储器的设计6.7.1 只读存储器ROM的设计6.7.2 读写存储器SRAM的设计6.8 输入电路的设计6.8.1 键盘扫描电路的设计6.8.2 键盘接口电路的设计6.9 显示电路的设计6.9.1 数码管静态显示电路的设计6.9.2 数码管动态显示电路的设计6.9

3、.2 液晶显示控制电路的设计6.1 计数器的设计计数器是在数字系统中使用最多的时序电路,它不仅能用于对时钟脉冲计数,还可以用于分频,定时,产生节拍脉冲和脉冲序列以及进行数字运算等。计数器是一个典型的时序电路,分析计数器就能更好地了解时序电路的特性。计数器分同步计数器和异步计数器两种。6.1.1 同步计数器的设计所谓同步计数器,就是在时钟脉冲(计数脉冲)的控制下,构成计数器的各触发器状态同时发生变化的那一类计数器。1) 六十进制计数器众所周知,用一个4位二进制计数器可构成1位十进制计数器,而2位十进制计数器连接起来可以构成一个六十进制的计数器。六十进制计数器常用于时钟计数。一个六十进制计数器的外

4、部端口示意图如图6.1所示。在该六十进制计数器的电路中,BCDLWR和BCD10WR与DATAIN配合,以实现对六十进制计数器的个位和十位值的预置操作。应注意,在对个位和十位进行预置操作时,DATAIN输入端是公用的,因而个位和十位的预置操作必定要串行进行。利用VHDL语言描述六十进制计数器的程序如例6.1所示。图6.1 六十进制计数器外部端口示意图【例6.1】 用VHDL设计一个六十进制计数器(方法1)。 -BCD60COUNT.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY

5、 BCD60COUNT ISPORT(CLK,BCD1WR,BCD10WR,CIN:STD_LOGIC;CO:OUT STD_LOGIC;DATAIN:IN STD_LOGIC_VECTOR (3 DOWNTO 0);BCD1:OUT STD_LOGIC_VECTOR (3 DOWNTO 0);BCDI0:OUT STD_LOGIC_VECTOR (2 DOWNTO 0);END BCD60COUNT;ARCHITECTURE RTL OF BCD60COUNT ISSIGNAL BCD1N:STD_LOGIC_VECTOR (3 DOWNTO 0);SIGNAL BCD10N:STD_LOG

6、IC_VECTOR (2 DOWNTO 0);BEGINBCD1=BCD1N;BCDI0=BCD10N;PROCESS (CLK,BCD1WR) -个位数处理进程BEGIN IF (BCD1WR=1) THENBCD1N=DATAIN;ELSIF (CLKEVENT AND CLK=1) THENIF (CIN=1) THEN IF (BCD1N=9) THENBCD1N=0000;ELSEBCD1N=BCD1N+1;END IF;END IF;END IF; END PROCESS; PROCESS (CLK,BCD10WR) -十位数处理进程BEGINIF (BCD10WR=1) THEN

7、BCD10N=DATAIN (2 DOWNTO 0);ELSIF (CLKEVENT AND CLK=1) THENIF (CIN=1 AND BCD1N=9) THENIF (BCD10N=5) THENBCD10N=000;ELSE BCD10N=BCD10N+1;END IF;END IF;END IF; END PROCESS;PROCESS (BCD10N,BCD1N,CIN) -进位位处理进程BEGINIF (CIN=1 AND BCD1N=9 AND BCD10N=5) THENCO=1;ELSECO=0;END IF;END PROCESS;END RTL;【例6.2】 用VH

8、DL设计一个六十进制计数器(方法2)。-COUNTER60.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER60 ISPORT(CP: IN STD_LOGIC; -时钟脉冲 BIN: OUT STD_LOGIC_VECTOR (5 DOWNTO 0); -二进制 S: IN STD_LOGIC; -输出启动信号 CLR: IN STD_LOGIC; -清除信号 EC: IN STD_LOGIC; -使能计

9、数信号 CY60: OUT STD_LOGIC );-计数60进位信号END COUNTER60;ARCHITECTURE RTL OF COUNTER60 ISSIGNAL Q : STD_LOGIC_VECTOR (5 DOWNTO 0) ;SIGNAL RST, DLY : STD_LOGIC;BEGINPROCESS (CP,RST) - 计数60 BEGINIF RST = 1 THENQ = 000000; - 复位计数器 ELSIF CPEVENT AND CP = 1 THENDLY = Q(5);IF EC = 1 THENQ = Q+1; - 计数值加1 END IF; E

10、ND IF;END PROCESS;CY60 = NOT Q(5) AND DLY; - 进位信号微分 RST = 1 WHEN Q=60 OR CLR=1 ELSE - 复位信号设定 0;BIN = Q WHEN S = 1 ELSE - 计数输出 000000;END RTL ;2) 可逆计数器在时序应用电路中,计数器的应用十分普遍,如加法计数器,减法计数器,可逆计数器等。所谓可逆计数器,就是根据计数控制信号的不同,在时钟脉冲作用下,计数器可以进行加1或者减1操作的一种计数器。可逆计数器有一个特殊的控制端,这就是UPDN端。当UPDN=1时,计数器进行加1操作,当UPDN=0时,计数器就进

11、行减1操作。表6.1是一个3位可逆计数器的真值表,它的VHDL语言描述如例6.3所示。表6.1 可逆计数器真值表 输入端 输出端DIR CP Q2 Q1 Q0X X 0 0 01 计数器加1操作0 计数器减1操作【例6.3】 用VHDL设计一个3位二进制的可逆计数器。-COUNT3.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNT3 ISPORT (CP,DIR:IN STD_LOGIC;Q: OUT STD_

12、LOGIC_VECTOR(2 DOWNTO 0); END;ARCHITECTURE RTL OF COUNT3 ISSIGNAL QN:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINPROCESS(CP)BEGIN IF CPEVENT AND CP=1 THENIF DIR=0 THENQN=QN +1;ELSE QN=QN-1;END IF ;END IF;END PROCESS;Q=QN;END RTL;编写可逆计数器VHDL程序时,在语法上,就是把加法和减法计数器合并,使用一个控制信号决定计数器作加法或减法的动作。在本例中,利用“控制信号DIR”可以让计数器的计

13、数动作加1或减1。6.1.2 异步计数器的设计异步计数器又称行波计数器,它将低/高位计数器的输出做为高/低位计数器的时钟信号,这一级一级串行连接起来就构成了一个异步计数器。异步计数器与同步计数器不同之处就在于时钟脉冲的提供方式,但是,由于异步计数器采用行波计数,从而使计数延迟增加,在要求延迟小的领域受到了很大限制。尽管如此,由于它的电路简单,仍有广泛的应用。图6.2是用VHDL语言描述的一个由8个触发器构成的异步计数器.它的程序如例6.4所示,采用元件例化方式生成。与上述同步计数器不同之处主要表现在对各级时钟脉冲的描述上,这一点请读者在阅读程序时多加注意。图6.2 8位异步计数器原理图【例6.

14、4】 用VHDL设计一个由8个触发器构成的8位二进制异步计数器。-RPLCONT.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DFFR ISPORT(CLK,CLR,D:IN STD_LOGIC;Q,QB:OUT STD_LOGIC);END ENTITY DFFR;ARCHITECTURE ART1 OF DFFR ISSIGNAL Q_IN:STD_LOGIC;BEGINQB=NOT Q_IN;Q=Q_IN;PROCESS(CLK,CLR) ISBEGIN IF (CLR=1) THENQ_IN=0; ELSIF (CLKEVENT

15、 AND CLK=1) THENQ_IN=D;END IF ;END PROCESS;END ARCHITECTURE ART1;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY RPLCONT ISPORT(CLK,CLR:IN STD_LOGIC;COUNT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END ENTITY RPLCONT;ARCHITECTURE ART2 OF RPLCONT ISSIGNAL COUNT_IN_BAR:STD_LOGIC_VECTOR(8 DOWNTO 0);COMPONENT DFF

16、R ISPORT(CLK,CLR,D:IN STD_LOGIC;Q,QB:OUT STD_LOGIC);END COMPONENT;BEGINCOUNT_IN_BAR(0)COUNT_IN_BAR(I),CLR=CLR,D=COUNT_IN_BAR(I+1),Q=COUNT(I),QB=COUNT_IN_BAR(I+1);END GENERATE;END ARCHITECTURE ART2;6.2 分频器的设计一般来说,可以把加法计数器看成一种分频电路,而且是除2的N的次方的分频电路。但是也常常会有除M(M不是2的N次方)的分频电路需求.下面就介绍一个除6的加法分频电路。先建立一个计数器,而这

17、个计数器的大小必须是3位(计数默认范围是023-1=7),不过将把这样的计数值为6的瞬间,立即复位改变为0,其VHDL程序如例6.5所示 【例6.5】 用VHDL设计一个除6的加法分频电路。-COUNT6.vhdLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNT6 isPORT(CP: IN STD_LOGIC;Result: OUT STD_LOGIC);END COUNT6;ARCHITECTURE a OF CO

18、UNT6 ISSIGNAL RST: STD_LOGIC;SIGNAL QN: STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN PROCESS (CP,RST) - * COUNTERBEGINIF RST = 1 THENQN = 000; -Reset Counter ELSIF CPevent AND CP=1 THENQN = QN + 1; -COUNTER + 1 END IF;END PROCESS; RST = 1 WHEN QN = 6 ELSE - RESET COUNTER0; Result =N才可以。6.3 选择器的设计多路选择器可以从多组数据

19、来源中选取一组送入目的地。它的应用范围相当广泛,从组合逻辑的执行,到数据路径的选择,经常可以看到它的踪影。另外在像时钟,计数定时器等的输出显示电路中都可以看到利用多路选择器制作扫描电路来分别驱动输出装置(通常为七段数码显示管,点矩阵或液晶面板),以降低功率的消耗。有时也希望把两组没有必要同时观察的数据,共享一组显示电路,以降低成本。多路选择器的结构是2N个输入线,会有N个地址选择线及一个输出线配合。现以一个四选一的多路选择器为例,其四选一电路的真值表如表6.2所示,其外部端口示意图如图6.3所示。表6.2 四选一电路真值表选择输入 数据输入 数据输出b a Input(0) Input(1)

20、Input(2) Input(3) y0 0 0 X X X 00 0 1 X X X 10 1 X 0 X X 00 1 X 1 X X 11 0 X X 0 X 01 0 X X 1 X 11 1 X X X 0 01 1 X X X 1 1图6.3 四选一电路外部端口示意图描述四选一多路选择器的方法有多种,例如在一个进程中使用if-then-else语句;在一个进程中使用case语句;使用with select构造或使用结构VHDL。现用if-then-else语句对它进行描述,就可以得到如例6.6所示的程序。【例6.6】设计一个四选一的多路选择器的VHDL程序(使用if-then-el

21、se语句)。-MUX4.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MUX4 ISPORT(DATA0,DATA1,DATA2,DATA3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);A,B:IN STD_LOGIC;Y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY MUX4;ARCHITECTURE ART OF MUX4 ISSIGNAL SEL:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINSEL=B&A;PROCESS(SEL)BEGINIF (

22、SEL=00) THENY=DATA0;ELSIF(SEL=01) THENY=DATA1;ELSIF(SEL=10) THENY=DATA2;ELSEY=DATA3;END IF;END PROCESS;ARCHITECTURE ART;例6.6中的四选一选择器是用IF语句描述的,程序中的ELSE项作为余下的条件,将选择INPUT(3)从Y端输出,这种描述比较安全。当然,不用ELSE项也可以,这时必须列出SEL的所有可能出现的情况,加以一一确认。在进程中使用CASE语句会更清晰易读。例6.7是用CASE语句描述的四选一选择器。【例6.7】设计一个四选一的多路选择器的VHDL程序(使用case

23、语句)。-MUX4.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MUX4 ISPORT(DATA0,DATA1,DATA2,DATA3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);A,B:IN STD_LOGIC;Y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY MUX4;ARCHITECTURE ART OF MUX4 ISSIGNAL SEL:STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINSELYYYYY=NULL;END CASE;END PROC

24、ESS;END ARCHITECTURE ART;【例6.8】设计一个四选一的多路选择器的VHDL程序(使用WHEN-ELSE并行条件赋值语句)。-MUX4.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MUX4 ISPORT(DATA0,DATA1,DATA2,DATA3:IN STD_LOGIC_VECTOR(3 DOWNTO 0);A,B:IN STD_LOGIC;Y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY MUX4;ARCHITECTURE ART OF MUX4 ISSIGNAL

25、SEL : STD_LOGIC_VECTOR(1 DOWNTO 0);BEGINSEL=B&A;Y= DATA0 WHEN SEL=00 ELSEDATA1 WHEN SEL=01 ELSEDATA2 WHEN SEL=10 ELSEDATA3 WHEN SEL=11 ELSE0 ; END ARCHITECTURE ART ;6.4 译码器的设计译码器是把输入的数码解出其对应的数码,如果有N个二进制选择线,则最多可以译码转换成2N个数据。译码器也经常被应用在地址总线或用作电路的控制线。像只读存储器(ROM)中便利用译码器来进行地址选址的工作。3-8译码器是最常用的种小规模集成电路。3-8译码

26、器外部端口示意图如图6.9所示,它有3个二进制输入端a, b,c和8个译码输出端y0y7。对输入a,b,c的值进行译码,就可以确定输出端y0y7的哪一个输出端变为有效(低电平),从而达到译码的目的。另外为方便译码器的控制或便于将来扩充用,在设计时常常会增加一个EN使能输入脚。3-8译码器的真值表如表6.3所示。有了真值表,就可以直接用查表法来设计。在VHDL 中,“WITHSELECT”,“CASEWHEN”及“WHENELSE”这类指令都是执行查表或对应动作的能手。图6.4 3-8译码器外部端口示意图表6.3 3-8译码器的真值表使能 二进制输入端 译码输出端en c b a y0 y1 y

27、2 y3 y4 y5 y6 y70 x x x 1 1 1 1 1 1 1 11 0 0 0 0 1 1 1 1 1 1 11 0 0 1 1 0 1 1 1 1 1 11 0 1 0 1 1 0 1 1 1 1 11 0 1 1 1 1 1 0 1 1 1 11 1 0 0 1 1 1 1 0 1 1 11 1 0 1 1 1 1 1 1 0 1 11 1 1 0 1 1 1 1 1 1 0 11 1 1 1 1 1 1 1 1 1 1 0【例6.9】 用VHDL设计一个3-8译码器(用“CASEWHEN”语句)。-DECODER38.VHDLIBRARY IEEE;USE IEEE.STD

28、_LOGIC_1164.ALL;ENTITY DECODER38 ISPORT (A,B,C, EN : IN STD_LOGIC;Y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END DECODER38 ;ARCHITECTURE RTL OF DECODER38 ISSIGNAL INDATA :STD_LOGIC_VECTOR(2 DOWNTO 0);BEGININDATAYYYYYYYYY=NULL;END CASE;ELSEY=11111111;END IF;END PROCESS;END RTL;【例6.10】 用VHDL设计一个3-8译码器(用“WITHSELECT”语句)。LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.All;ENTITY DECODER38 ISPORT (A,B,C, EN : IN S

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1