|
|
介绍了数字系统设计中经常用到的计数器,分频器,选择器,译码器,编码器,寄存器,存储器,输入电路,显示电路等基本单元电路的VHDL程序设计。
学习要求:在教师讲授这些基本单元电路的设计思想的基础上,通过上机调试熟练掌握这些基本单元电路的设计。
关键词:计数器(Counter),分频器(Divder),选择器(Multiplexer),译码器(Decoder),编码器(Encoder),寄存器(Register),存储器(Memory),输入电路(Input Circuit),显示电路(Display Circuit)
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.2 液晶显示控制电路的设计
6.1 计数器的设计
计数器是在数字系统中使用最多的时序电路,它不仅能用于对时钟脉冲计数,还可以用于分频,定时,产生节拍脉冲和脉冲序列以及进行数字运算等。计数器是一个典型的时序电路,分析计数器就能更好地了解时序电路的特性。计数器分同步计数器和异步计数器两种。
6.1.1 同步计数器的设计
所谓同步计数器,就是在时钟脉冲(计数脉冲)的控制下,构成计数器的各触发器状态同时发生变化的那一类计数器。
1) 六十进制计数器
众所周知,用一个4位二进制计数器可构成1位十进制计数器,而2位十进制计数器连接起来可以构成一个六十进制的计数器。六十进制计数器常用于时钟计数。一个六十进制计数器的外部端口示意图如图6.1所示。在该六十进制计数器的电路中,BCDLWR和BCD10WR与DATAIN配合,以实现对六十进制计数器的个位和十位值的预置操作。应注意,在对个位和十位进行预置操作时,DATAIN输入端是公用的,因而个位和十位的预置操作必定要串行进行。利用VHDL语言描述六十进制计数器的程序如例6.1所示。
图6.1 六十进制计数器外部端口示意图
【例6.1】 用VHDL设计一个六十进制计数器(方法1)。
--BCD60COUNT.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY BCD60COUNT IS
PORT(CLK,BCD1WR,BCD10WR,CIN:STD_LOGIC;
COUT 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 IS
SIGNAL BCD1N:STD_LOGIC_VECTOR (3 DOWNTO 0);
SIGNAL BCD10N:STD_LOGIC_VECTOR (2 DOWNTO 0);
BEGIN
BCD1COUNT_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的加法分频电路。先建立一个计数器,而这个计数器的大小必须是3位(计数默认范围是0~2^3-1=7),不过将把这样的计数值为6的瞬间,立即复位改变为0,其VHDL程序如例6.5所示
【例6.5】 用VHDL设计一个除6的加法分频电路。
--COUNT6.vhd
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNT6 is
PORT(CP: IN STD_LOGIC;
Result: OUT STD_LOGIC);
END COUNT6;
ARCHITECTURE a OF COUNT6 IS
SIGNAL RST: STD_LOGIC;
SIGNAL QN: STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
PROCESS (CP,RST) -- *** COUNTER
BEGIN
IF RST = '1' THEN
QN =N才可以。
6.3 选择器的设计
多路选择器可以从多组数据来源中选取一组送入目的地。它的应用范围相当广泛,从组合逻辑的执行,到数据路径的选择,经常可以看到它的踪影。另外在像时钟,计数定时器等的输出显示电路中都可以看到利用多路选择器制作扫描电路来分别驱动输出装置(通常为七段数码显示管,点矩阵或液晶面板),以降低功率的消耗。有时也希望把两组没有必要同时观察的数据,共享一组显示电路,以降低成本。
多路选择器的结构是2N个输入线,会有N个地址选择线及一个输出线配合。现以一个四选一的多路选择器为例,其四选一电路的真值表如表6.2所示,其外部端口示意图如图6.3所示。
表6.2 四选一电路真值表
选择输入 数据输入 数据输出
b a Input(0) Input(1) Input(2) Input(3) y
0 0 0 X X X 0
0 0 1 X X X 1
0 1 X 0 X X 0
0 1 X 1 X X 1
1 0 X X 0 X 0
1 0 X X 1 X 1
1 1 X X X 0 0
1 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-else语句)。
--MUX4.VHD
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX4 IS
PORT(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 IS
SIGNAL SEL:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
SELYYYYYYYYYYYYYYQOUTQOUTQOUTNULL;
END CASE;
END IF;
END PROCESS;
END ARCHITECTURE ART;
6.6.3 并行加载移位寄存器的设计
在TTL手册中的74LS166是一个带清零端的8位并行加载的移位寄存器,其引脚图及逻辑图如图6.6所示。
图6.6 74LS166的引脚图及逻辑图
图中各引脚名称和功能如下:
A,B,C,D,E,F,G,H:8位并行数据输入端;
SER:串行数据输入端;
QH:串行数据输出端;
CLK: 时钟信号输入端;
CLKINH:时钟信号禁止(FE)端;
SH/LD:移位加载控制(SL)端;
CLR:清零端。
当清零输入端CLR为‘0’时,8个触发器的输出均为‘0’,从而使输出Q为‘0’。CLKINH是时钟禁止端,当它为‘1’时将禁止时钟,即不管时钟信号如何变化,移位寄存器的状态不发生改变。另外,时钟信号只在上升沿时才有效,且CLKINH 为‘0’。当控制端SH/LD =‘1’时是移位状态,在时钟脉冲上升沿的控制下右移,当SH/LD =‘0’时是加载状态,在时钟脉冲上升沿的作用下,数据输入端A~H的信号就是装载到移位寄存器的QA~QH。根据上述描述,就可以用VHDL语言编写出描述74166功能的程序。
【例6.15】用VHDL设计的带清零端的8位并行加载的移位寄存器74LS166。
-- SREG8PARLWCLR.VHD
LIBRARY IEEE;
USE IEEE. STD _ LOGIC _ 1164. ALL;
ENTITY SREG8PARLWCLR IS
PORT(CLR, SL, FE, CLK, SER: IN STD_ LOGIC;
A, B, C, D, E, F,G, H: IN STD_ LOGIC;
Q: OUT STD_ LOGIC);
END SREG8PARLWCLR;
ARCHITECTURE BEHAV OF SREG8PARLWCLR IS
SIGNAL TMPREG8:STD _ LOGIC _ VECTOR (7 DOWNTO O);
BEGIN
PROCESS (CLK, SL, FE, CLR)
IF (CLR= ‘0’) THEN
TMPREG8 SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT DOUT BCDBCDBCDBCDBCDBCDBCDBCD SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG SEG<="00000000";
END CASE ;
END PROCESS;
END ARCHITECTURE ART;
6.9.2 液晶显示控制电路的设计
液晶显示是一种将液晶显示器件、连接件、集成电路、PCB线路板、背光源、结构件装配在一起的组件。下面给出—个液晶显示控制电路的VHDL描述。
【例6.23】 用VHDL设计—个液晶显示控制电路。
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY LCD IS
PORT(DP1,DP2,DP3:IN STD_LOGIC;
RS,CS1,CS2: OUT STD_LOGIC;
LCDE:OUT STD_LOGIC;
RW:OUT STD_LOGIC);
END LCD;
ARCHITECTURE HAV OF LCD IS
BEGIN
PROCESS(DP1,DP2,DP3)
BEGIN
IF(DP1=“0” AND DP2=“0” AND DP3=“0”) THEN
LCDE<=“1”;RS<=“0”;RW<=“1”;CS1<=“1”;CS2<=“0”;
ELSIF(DP1=“0” AND DP2=“0” AND DP3=“1”)THEN
LCDE<=“1”;RS<=“0”;RW<=“0”;CS1<=“1”;CS2<=“0”;
ELSIF(DP1=“0” AND DP2=“1” AND DP3=“0”)THEN
LCDE<=“0”;RS<=“1”;RW<=“1”;CS1<=“1”;CS2<=“0”;
ELSIF(DP1=“0” AND DP2=“1” AND DP3=“1”)THEN
LCDE<=“1”;RS<=“1”;RW<=“0”;CS1<=“1”;CS2<=“0”;
ELSIF(DP1=“1” AND DP2=“0” AND DP3=“0”)THEN
LCDE<=“1”;RS<=“0”;RW<=“1”;CS1<=“0”;CS2<=“1”;
ELSIF(DP1=“1” AND DP2=“0” AND DP3=“1”)THEN
LCDE<=“1”;RS<=“0”;RW<=“0”;CS1<=“0”;CS2<=“1”;
ELSIF(DP1=“1” AND DP2=“1” AND DP3=“0”)THEN
LCDE<=“0”;RS<=“1”;RW<=“1”;CS1<=“0”;CS2<=“1”;
ELSIF(DP1=“1” AND DP2=“1” AND DP3=“1”)THEN
LCDE<=“1”;RS<=“1”;RW<=“0”;CS1<=“0”;CS2<=“1”;
ELSE
LCDE<=“0”;RS<=“1”;RW<=“1”;CS1<=“0”;CS2<=“0”;
END IF;
END PROCESS;
END HAV; |
|