第4章 用VHDL程序实现常用逻辑电路_第1页
第4章 用VHDL程序实现常用逻辑电路_第2页
第4章 用VHDL程序实现常用逻辑电路_第3页
第4章 用VHDL程序实现常用逻辑电路_第4页
第4章 用VHDL程序实现常用逻辑电路_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章

用VHDL程序实现常用逻辑电路4.1组合逻辑电路设计1基本逻辑门

基本逻辑门电路有与门、或门、非门、与非门、异或门和异或非门等,用VHDL语言来描述十分方便.其源程序如下:

libraryieee;useiee.std_logic_1164.all;entityjbmis

port(a,b:inbit;f1,f2,f3,f4,f5,f:outbit);endjbm;architectureaofjbmisbegin

f1<=aandb;--构成与门

f2<=aorb;--构成或门

f<=nota;--构成非门

f3<=anandb;--构成与非门

f4<=anorb;--构成异或门

f5<=not(a

xorb);--构成异或非门即同门

end;2三态门源程序如下:

libraryieee;useieee.std_logic_1164.all;entitytri_sis

port(enable:instd_logic;

datain:instd_logic_vector(7downto0);

dataout:outstd_logic_vector(7downto0));endtri_s;architecturebhvoftri_sisbegin

process(enable,datain)beginifenable='1'then

dataout<=datain;else

dataout<="ZZZZZZZZ";endif;endprocess;endbhv;8位三态控制门电路dataout[7..0]comb[7..0]datain[7..0]enableIO_BUF(TRI)3.三线-八线译码器三线-八线译码器的输出有效电平为低电平,译码器的使能控制输入端g1、g2a、g2b有效时,当3线数据输入端:

cba=000时,y[7…0]=11111110(即y[0]=0);

cba=001时,y[7…0]=11111101(即y[1]=0);

cba=111时,y[7…0]=01111111(即y[7]=0);

三八译码器端口图:

源程序如下:--实体libraryieee;useieee.std_logic_1164.all;entitydecoder3_8isport(a,b,c,g1,g2a,g2b:instd_logic;y:outstd_logic_vector(7downto0));enddecoder3_8;

结构体描述(下页)architectureaofdecoder3_8issignaldz:std_logic_vector(2downto0);begin

dz<=c&b&a;process(dz,g1,g2a,g2b)beginif(g1='1'andg2a='0'andg2b='0')thencasedziswhen"000"=>y<="11111110";when"001"=>y<="11111101";when"010"=>y<="11111011";when"011"=>y<="11110111";when"100"=>y<="11101111";when"101"=>y<="11011111";when"110"=>y<="10111111";when"111"=>y<="01111111";whenothers=>y<="XXXXXXXX";endcase;elsey<="11111111";endif;endprocess;end;4.七段码译码器七段码的输出去驱动七段码显示器,才能显示正常的数字。下图为共阴极数码管显示器。

共阴极数码管显示器电路示意图分别显示0~9和A、B、C、D、E、F等16个数码,其源程序如下:

--实体描述libraryieee;useieee.std_logic_1164.allentitydecl7sisport(a:instd_logic_vector(3downto0);led7s:outstd_logic_vector(6downto0));enddecl7s;结构体描述见下页结构体描述:architecturebehaveofdecl7sisbegin

process(a)begincaseaiswhen"0000"=>led7s<="0111111";when"0001"=>led7s<="0000110";when"0010"=>led7s<="1011011";when"0011"=>led7s<="1001111";when"0100"=>led7s<="1100110";when"0101"=>led7s<="1101101";when"0110"=>led7s<="1111101";when"0111"=>led7s<="0000111";when"1000"=>led7s<="1111111";when"1001"=>led7s<="1101111";when"1010"=>led7s<="1110111";when"1011"=>led7s<="1111100";when"1100"=>led7s<="0111001";when"1101"=>led7s<="1011110";when"1110"=>led7s<="1111001";when"1111"=>led7s<="1110001";whenothers=>null;endcase;endprocess;endbehave;5.多位加(减)法器

以4位全减器为例来说明。程序说明:该例利用行为描述模式描述全减器。两个数够减,高借位值为0;两个数不够减,需要向高位借1位,这时高借位值为1,由于有借位,所以差值是大于或等于0的数。

--实体描述

libraryieee;useieee.std_logic_1164.all;useieee.std_logic_signed.all;entityjianfaqiis

port(a,b:instd_logic_vector(0to3);c0:instd_logic;c1:outstd_logic;d:outstd_logic_vector(0to3));end;--结构体描述:architectureaofjianfaqiisbeginprocessbeginifa>b+c0thend<=a-(b+c0);c1<='0';elsec1<='1';d<=("10000")-(b+c0-a);endif;endprocess;end;4.2时序逻辑电路设计1触发器

触发器是构成时序逻辑电路的基本元件,常用的触发器包括RS触发器、D触发器、JK触发器、T触发器等类型。下面仅介绍同步复位D触发器。源程序如下:

libraryieee;useieee.std_logic_1164.all;useieee.std_logic_signed.all;entitysyndffis

port(d,clk,reset:in

std_logic;

q,qb:out

std_logic);endsyndff;--结构体描述:architecturedff_artofsyndffisbegin

process(clk)beginif(clk'eventandclk='1')thenif(reset='0')thenq<='0';

qb<='1';elseq<=d;

qb<=notq;endif;endif;endprocess;enddff_art;

2计数器以n位二进制计数器设计为例。源程序如下:--实体描述

libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycnt4IS port(clk:instd_logic; q:outstd_logic_vector(3downto0)); endcnt4;改变std_logic_vector矢量的位宽,可以很方便地改变二进制计数器的模。--结构体描述:architecturebehaveofcnt4issignalq1:std_logic_vector(3downto0);begin

process(clk)beginif(clk'eventandclk='1')then q1<=q1+1;

endif;endprocess;q<=q1;endbehave;3移位寄存器设计一个带有并行预置功能的8位右移移位寄存器。端口:

clk是移位时钟信号;

din是8位并行预置数据端口;

load是并行数据预置使能信号;

qb是串行输出端口。当clk的上升沿到来时进程被启动,若load为高电平则将输入端的8位二进制数并行置入移位寄存器中,作为串行右移输出的初始值;若load为低电平,则执行reg8(6downto0):=reg8(7downto1)。8个脉冲后完成了并-串转化的功能,并将最低位首先输出。源程序如下:libraryieee;usestd_logic_1164.all;entityshfrtis--8位右移寄存器

port(clk,load:instd_logic;din:instd_logic_vector(7downto0);

qb:outstd_logic);end;architectureoneofshfrtisbeginprocess(clk,load)variablereg8:std_logic_vector(7downto0);beginifclk'eventandclk='1'then--检测时钟上升沿

ifload='1'thenreg8::=din;--由(load='1')装载新数据

elsereg8(6downto0):=reg8(7downto1);endif;endif;

qb<=reg8(0);--输出最低位endprocess;endone;4.3状态机逻辑电路设计

状态机设计是一类重要的时序电路,是许多逻辑电路的核心部件。是实现高效率、高可靠性逻辑控制的重要途径。一般状态机分类为以下两种:

MOORE型状态机,它的输出仅仅取决于现态,与输入无关。

MEALY型状态机,它的输出不仅取决于现态,还与输入有关。

状态机程序结构主要由四部分组成:

1)说明部分:定义枚举型数据类型:Typestateis(s1,s2,s3,….);定义现态和次态信号:current_state和next_state。

2)主控时序进程:在时钟驱动下负责状态转换。只是机械地将代表次态的信号next_state中的内容送入现态的信号current_state中。

3)主控组合进程:根据外部输入的控制信号和当前状态确定下一状态的取向,以及确定当前对外的输出。

4)辅助进程:为了完成某种算法或为了输出设置的锁存器。状态机应用举例:

设计一个循环彩灯控制器,该控制器控制红、绿、黄三个发光管循环发亮(红发光管亮2秒,绿发光管亮3秒,黄发光管亮1秒)。

其源程序如下:

--实体描述:

libraryieee;useieee.std_logic_1164.all;entityasm_ledis

port(clk,clr:instd_logic;led1,led2,led3:outstd_logic);end;

结构体描述见下页:architectureaofasm_ledistypestatesis(s0,s1,s2,s3,s4,s5); --对状态机的状态声明

signalq:std_logic_vector(0to2);signalstate:states;beginp1:process(clk,clr)--进程1begin

if(clr='0')thenstate<=s0;

elsif(clk'eventandclk='1')thencasestateiswhens0=>state<=s1;whens1=>state<=s2;whens2=>state<=s3;whens3=>state<=s4;whens4=>s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论