基本数字逻辑单元的设计_第1页
基本数字逻辑单元的设计_第2页
基本数字逻辑单元的设计_第3页
基本数字逻辑单元的设计_第4页
基本数字逻辑单元的设计_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

基本数字逻辑单元的设计4.1组合逻辑设计

三态缓冲器和总线缓冲器

8bit单向总线缓冲器

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYtri_buf8ISPORT(din:INSTD_LOGIC_VECTOR(7DOWNTO0);dout:OUTSTD_LOGIC_VECTOR(7DOWNTO0);en:INSTD_LOGIC);ENDtri_buf8;ARCHITECTUREdata_flowOFtri_buf8IS

PROCESS(en,din)

BEGINIF(en='1')THENdout<=din;ELSEdout<="ZZZZZZZZ";ENDIF;ENDPROCESS;ENDdata_flow;Endin(0)din(1)din(2)din(3)din(4)din(5)din(6)din(7)dout(0)dout(1)dout(2)dout(3)dout(4)dout(5)dout(6)dout(7)双向总线缓冲器

用VHDL语言描述的双向总线缓冲器。

endir功能1

X高阻态

00

a<=b

01b<=aadirenb

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYdobl_tri_buf8ISPORT(a,b:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);dir,en:INSTD_LOGIC);ENDdobl_tri_buf8;

ARCHITECTURErtlOFdobl_tri_buf8ISSIGNALaout,bout:STD_LOGIC_VECTOR(7DOWNTO0);BEGINP1:PROCESS(a,dir,en)BEGINIF((en='0')AND(dir='1'))THENbout<=a;ELSEbout<="ZZZZZZZZ";ENDIF;b<=bout;ENDPROCESSP1;

P2:PROCESS(b,dir,en)BEGINIF((en='0')AND(dir='0'))THENaout<=b;ELSEaout<="ZZZZZZZZ";ENDIFa<=aout;ENDPROCESSP2;ENDrtl;BCD码—段选码译码器。

BCD码输入与LED显示器字段的对应关系

BCD码数字显示段

hgfedcba0000011000000000111111100100102101001000011310110000010041001100101015100100100110610000010011171010011110008100000001001910010000其它11111111BCD-段选码译码器d0d1d2d3abc.hgdefVccLIBRARYIEEE;;ENTITYseg_delISPORT(d:INSTD_LOGICVECTOR(3DOWNTO0);q:OUTBIT_VECTOR(7DOWNTO0));ENDseg_del;ARCHITECTUREseg_rtlOFseg_delISBEGINPROCESS(d)BEGINCASEdISWHEN"0000"=>q<="11000000";WHEN"0001"=>q<="11111001";

WHEN"0010"=>q<="10100100";WHEN"0011"=>q<="10110000";

WHEN"0100"=>q<="10011001";WHEN"0101"=>q<="10010010";WHEN"0110"=>q<="10000010";WHEN"0111"=>q<="11011000";WHEN"1000"=>q<="10000000";WHEN"1001"=>q<="10010000";WHENOTHERS=>q<="11111111";ENDCASE;ENDPROCESS;ENDseg-rtl;

4.1.4运算器的设计

一位全加器的设计.

LIBRARYIEEE;;ENTITYfull_adderISPORT(a,b,ci:INSTD_LOGIC;sum,cout:OUTSTD_LOGIC);ENDfull_adder;ARCHITECTURErtlOFfull_adderISBEGINsum<=aXORbXORci;cout<=(aANDb)OR(aANDci)OR(bANDci);ENDrtl;asumbcicout4位串行进位加法器

ciabsumcociabsumcociabsumcociabsumcoS0S1S2S3COCIA0B0A1B1A2B2A3B3SUMCIABSUMCIABSUMCIABSUMCIABCI0A0B0CI1A1B1CI2A2B2CIn-1An-1Bn-1进位产生逻辑S0S1S3Sn-1coutCIA[0:n-1]B[0:n-1]N位超前进位加法器超前进位加法器

各位加法器产生进位的逻辑表达式为:定义为进位生成函数,定义为进位传递函数,则全加器的各位和为:4位超前进位加法器LIBRARYIEEE;USEIEEESTD_LOGIC_1164.ALL;ENTITYadder4ISPORT(a,b:INSTD_LOGIC_VECTOR(3DOWNTO0)ci:INSTD_LOGIC;sum:OUTSTD_LOGIC_VECTOR(3DOWNTO0);cout:OUTSTD_LOGIC);ENDadde4r;ARCHITECTURErtl_adder4OFadder4ISSIGNALg,p,c:STD_LOGIC_VECTOR(3DOWNTO0);BEGINp(0)<=a(0)ORb(0);p(1)<=a(1)ORb(1);p(2)<=a(2)ORb(2);g(0)<=a(0)ANDb(0);a[3:0]b[3:0]ciSum[3:0]coutg(1)<=a(1)ANDb(1);g(2)<=a(2)ANDb(2);g(3)<=a(3)ANDb(3);c(0)<=g(0)OR(p(0)ANDci);c(1)<=g(1)OR(p(1)ANDg(0))OR(p(1)ANDp(0)ANDci);c(2)<=g(2)OR(p(2)ANDg(1))OR(p(2)ANDp(1)ANDg(0))OR(p(2)ANDp(1)ANDp(0)ANDci);c(3)<=g(3)OR(p(3)ANDg(2))OR(p(3)ANDp(2)ANDg(1))OR(p(3)ANDp(2)ANDp(1)ANDg(0))OR(p(3)ANDp(2)ANDp(1)ANDp(0)ANDci);cout=c(3);sum(0)<=a(0)XORb(0)XORci;sum(1)<=a(1)XORb(1)XORc(0);sum(2)<=a(2)XORb(2)XORc(1);sum(3)<=a(3)XORb(3)XORc(2);ENDrtl_adder4;2.移位器

8bit移位器。D7D6D5D4D3D2D1D0d7d6d5d4d3d2d1d0右移d0左移d7d6d5d4d3d2d1d0d7d6d5d4d3d2d1d0d7Irsrsldataa_outdata_inil

8bit移位器的VHDL程序。

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYshifterISPROT(data_in:INSTD_LOGIC_VECTOR(7DOWNTO0);sr,sl,ir,il:INSTD_LOGIC;data_out:OUTSTD_LOGIC_VECTOR(7DOWNTO0);ENDshifter;ARCHITECTUREAlgOFshifterISBEGINPROCESS(sr,sl,data_in,ir,il)VARIABLEcon:STD_LOGIC_VECTOR(0TO1);

BEGINcon:=sr&sl;CASEconISWHEN"00"=>data_out<=data_in;WHEN"01"=>data_out<=data_in(6DOWNTO0)&il;--左移 WHEN“10”=>data_out<=ir&data_in(7DOWNTO1);--右移 WHEN"11"=>data_out<=data_in;ENDCASE;ENDPROCESS;ENDAlg;3.求补器

LIBRARYIEEE;;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYcomplementIS

PORT(a:INSTD_LOGIC_VECTOR(7DOWNTO0);

b:UTSTD_LOGIC_VECTOR(7DOWNTO0));ENDcomplement;ARCHITECTURErtlOFcomplementISBEGINb<=NOTa+”00000001”;ENDrtl;4.乘法器。

部分积右移8bit乘法器的设计。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYmultISPORT(ai,bi:INSTD_LOGIC_VECTOR(7DOWNTO0);Product:OUTSTD_LOGIC_VECTOR(15DOWNTO0);done:OUTSTD_LOGIC);ENDmult;

ARCHITECTUREshift_multOFmultISBEGINPROCESS(ai,bi)VARIABLEa,b,m:STD_LOGIC_VECTOR(8DOWNTO0);VARIABLEcount:INTEGER;

BEGINa:='0'&ai;b:='0'&bi;count:=0;m:="00000000";done<='0';WHILEcount<8LOOPIFa(0)='1'THENm:=m+bi;ENDIF;a:=m(0)&a(7DOWNTO1);m:='0'&m(7DOWNTO1);count:=count+1;ENDLOOP;product<=m(7DOWNTO0)&a(8DOWNTO1);done<='1';ENDPROCESS;ENDshift_mult;

4.1.5算术逻辑运算单元

本例是一个8bit的ALU,能够完成8种运算,即加(add),带进位加(addc),减sub,带借位减法(subc),逻辑非、与、或和逻辑异或。alucoder程序包定义指令码。LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;PACKAGEalucoderISCONSTANTadd:STD_LOGIC_VECTOR(2DOWNTO0):="000";CONSTANTaddc:STD_LOGIC_VECTOR(2DOWNTO0):="001";CONSTANTsub:STD_LOGIC_VECTOR(2DOWNTO0):="010";CONSTANTsubc:STD_LOGIC_VECTOR(2DOWNTO0):="011";CONSTANTnot:STD_LOGIC_VECTOR(2DOWNTO0):="100";CONSTANTand:STD_LOGIC_VECTOR(2DOWNTO0):="101";CONSTANTor:STD_LOGIC_VECTOR(2DOWNTO0):="110";CONSTANTxor:STD_LOGIC_VECTOR(2DOWNTO0):="111"ENDalucoder;ALU运算模块设计。LIBRARYIEEE;;;;;USEWORK.alucoder.ALL;ALUsalu_comand

cyAcccoutover

ENTITYaluISPORT(s:INSTD_LOGIC_VECTOR(7DOWNTO0);cy:INSTD_LOGIC;alu_comand:INSTD_LOGIC_VECTOR(2DOWNTO0);Acc:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);cout,over:BUFFERSTD_LOGIC);ENDalu;ARCHITECTUREalgOFaluISSIGNALr1,s1,f1:STD_LOGIC_VECTOR(8DOWNTO0);BEGINr1<='0'&Acc;s1<='0'&s;PROCESS(r1,s1,cy,alu_comand)BEGINCASEalu_comandISWHENadd=>f1<=r1+s1;WHENaddc=>IFcy='0'THENf1<=r1+s1;ELSEf1<=r1+s1+1;ENDIF;WHENsub=>f1<=r1+NOT(s1)+1;WHENsubc=>IFcy='0'THENf1<=r1+NOT(s1)+1;ELSEf1<=r1+NOT(s1);ENDIF;WHENnot=>f1<=NOT(r1);WHENand=>f1<=r1ANDs1;WHENor=>f1<=r1ORs1;WHENXOR=>f1<=r1XORs1;WHENOTHERS=>f1<="-";ENDCASE;ENDPROCESS;Acc<=f1(7DOWNTO0);cout<=f1(8);over<=f1(8)XORf1(7);ENDalu;

时序逻辑电路设计

4.2.1触发器

1.D触发器

LIBRARYIEEE;;ENTITYdffISPORT(d,clk:INSTD_LOGIC;q:OUTSTD_LOGIC);ENDdff;

ARCHITECTURErtl_ifOFdffISBEGINPROCESS(clk)BEGIN

IF(clk'EVENT'ANDclk=1)THENq<=d;ENDIF;ENDPROCESS;ENDrtl_if;结构体的另一种描述如下:ARCHITECTURErtl_waitOFdffISBEGINPROCESSBEGINWAITUNTILclk'EVENTANDclk=1;q<=d;ENDPROCESS;ENDrtl_wait;4.2.3寄存器

D0~D7:8位并行数据输入端。SI:串行数据输入端。Q7:串行数据输出端。Q0~Q6:内部寄存器数据输出端。clk:时钟。ckin:时钟信号禁止,只有当其无效时,移位寄存器才在时钟的触发下进行移位操作。S/L:移位(shift)/装入(load)。当此端为高电平时,可执行移位操作,当此端为低电平时,读入D0~D7端的并行数据。CLR:异步清零。D[7:0]SIS/LQ7clkckinclr

串/并入、串出移位寄存器

LIBRARYIEEE;;ENTITYshifterISPORT(clr,si,ckin,clk:INSTD_LOGIC;d:INSTD_LOGIC_VECTOR(7DOWNTO0);q:OUTSTD_LOGIC);sl:INBIT);ENDshifter;ATCHITECTURErtl_shifterOFshifterISSIGNALtemp8:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(clr,sl,ckin,clk)IF(clr='0')THENtemp8<="00000000";q<=temp8(7);ELSIF(clk'EVENT)AND(clk='1')AND(ckin='0')THENIF(sl='0')THENtemp8<=d;--装入数据q<=d(7);ELSEq<=temp8(7);temp8(7)<=temp8(6);temp8(6)<=temp8(5);temp8(5)<=temp8(4);temp8(4)<=temp8(3);temp8(3)<=temp8(2);temp8(2)<=temp8(1);temp8(1)<=temp8(0);temp8(0)<=si;ENDIF;ENDIF;ENDPROCESS;ENDrtl_shifter;4.2.4计数器

8位异步计数器的设计

Q/QDclkQ/QDclkQ/QDclkQ/QDclkdclkclrcount_in(0)count_in(1)count_in(8)Q0Q1Q2Q7计数器的顶层设计LIBRARYIEEE;;ENTITYriplecountISPORT(clk,clr:INSTD_LOGIC;count:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDriplecount;

ARCHITECTURErtl_riplecountOFriplecountISSIGNALcount_in:STD_LOGIC_VECTOR(8DOWNTO0);COMPONENTdfftPORT(clk,clr,d:INSTD_LOGIC;Q:OUTSTD_LOGIC;Qn:BUFFERSTD_LOGIC);ENDCOMPONENT;--调用当前库中的同名实体作为元件BEGINcount_in(0)<=clk;genl:FOR:IN0TO7GENERATEU:dfftPORTMAP(clk=>count_in(i),clr=>clr;d=>count_in(i+1),,Q=>count(i);Qn=>count_in(i+1));ENDGENERATE;ENDrt_riplecountl;--单个触发器性能描述LIBRARYIEEE;;ENTITYdfftISPORT(clk,clr,d:INSTD_LOGIC;Q:OUTSTD_LOGIC;Qn:BUFFERSTD_LOGIC);ENDdfft;ARCHITECTURErtldOFdfftISBEGIN

PROCESS(clk,clr)BEGINIF(clr='0')THENQ<='0';Qn<='1';ELSIF(clk'EVENTANDclk='1')THENQ<=d;Qn<=NOTd;ENDIF;ENDPROCESS;ENDrtld;4.3存储器

4.3.1概述

存储器单元实际上是时序逻辑电路的一种。按存储器的使用类型可分为只读存储器(ROM)和随机存取存储器(RAM),两者的功能有较大的区别,因此在描述上也有所不同。存储器是许多存储单元的集合,按单元号顺序排列。每个单元由若干二进制位构成,以表示存储单元中存放的数值。这种结构和数组的结构非常相似,故在VHDL语言中,通常由数组描述存储器。

TYPEmemoryISARRAY(INTEGERRANGE<>)OFINTEGER;TYPEwordISSTD_LOGIC_VECTOR(k-1DOWNTO0);TYPEmemoryISARRAY(0TOw-1)OFword;4.3.3随机存储器RAM

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;;ENTITYram4kISGENERIC(k:INTEGER:=8;w:INTEGER:=12;rd_del,wr_del:TIME);PORT(WR,RD,CS:INSTD_LOGIC;Adr:INSTD_LOGIC_VECTOR(w-1DOWNTO0);D:INOUTSTD_LOGIC_VECTOR(k-1DOWNTO0));ENDram4k;WRRDCSAdr[11:0]Dout[7:0]ARCHITECTUREbehavram4kOFram4kISTYPEmemoryISARRAY(0TO2**w-1)OFSTD_LOGIC_VECTOR(k-1DOWNTO0);SIGNALsram:memory;SIGNALAdr_in:INTEGER;BEGINAdr_in<=CONV_INEGER(Adr);--位矢量转换成整数PROCESS(WR,RD,CS)BEGINIFCS='0'THENIFRD='0'THEND<=sram(Adr_in)AFTERrd_del;ELSIFWR='0'THENsram(Adr_in)<=DAFTERwr_del;ENDIF;

ELSED<=(OTHERS’Z’)AFTERrd_del;ENDIF;ENDPROCESS;

ENDbehav;

4.3.2只读存储器ROM

在用VHDL语言描述ROM时,ROM的内容应在仿真时先读到ROM中,这就是ROM的初始化。存储器的初始化要依赖于外部文件的读取,即由TEXTIO对ROM进行初始化。下面是对ROM进行初始化的实例。

VARIABLEstartup:BOOLEAN:=TRUE;VARIABLEl:LINE;--LINE是在TEXTIO程序包定义的存取类型VARIABLEj:INTEGER;VARIABLErom:memory;FILEromin:TEXTISIN"rom2k.in";--TEXT是在TEXTIO程序包定义的文件类型初始化程序:

IFstartupTHENFORjINrom‘RANGELOOP--利用数据区间属性函数获得数组的上下限READLINE(romin,l);--从文件romin中读入一行放入l

中。READ(l,rom(j));--从l中读入一个数据放入rom中ENDLOOP;ENDIF;

G1G2Adr[11;0]Dout[7:0]只读存储器ROM的VHDL程序。

LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;;ENTITYrom4kISPORT(G1,G2:INSTD_LOGIC;Adr:INSTD_LOGIC_VECTOR(11DOWNTO0);dout:OUTSTD_LOGIC_VECTOR(7DOENTO0);ENDrom4k;ARCHITECTUREbehav_rom4kOFrom4kISTYPEwordISSTD_LOGIC_VECTOR(7DOWNTO0);TYPEmemoryISARRAY(0TO4095)OFword;SIGNALadr_in:INTEGERRANGE0TO4095;VARIBLErom:memory;VARIBLEstartup:BOOLEAN:=TURE;VARIBLEl:LINE;

VARIBLEj:INTEGER;FILEromin:TEXTISIN“rom2k.in”;--文件类说明.BEGINPROCESS(G1,G2)BEGINIFstartupTHENFORjINrom'RANGELOOPREADLINE(romin,l);READ(l,rom(j));ENDLOOP;startup:=FALSE;ENDIF;adr_in<=CONV_INTEGER(Adr);--将位矢量转换成整数.IF(G1='1'ANDG2='1')THENdout<=rom(adr_in);ELSEdout<="ZZZZZZZZ”;ENDIF;ENDPROCESS;ENDbehav_rom2k;先进后出堆栈

先进后出堆栈是处理程序中断的常用数据结构,其数据存放结构和RAM是一致的,但存储方式有所不同。先进后出堆栈由2个功能块组成,即存储器体和堆栈指针SP,进堆时SP+1→SP指向下一个存储单元;出堆时SP-1→SP,并把SP所指示的存储单元的内容输出。

din[7:0]pushpopclkresetDout[7:0]256字节先进后出堆栈的VHDL程序。LIBRARYIEEE;;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYstackISGENERIC(w:INTEGER:=256;k:INTEGER:=8);PORT(clk,reset,push,pop:INSTD_LOGICdin:INSTD_LOGIC_VECTOR(k-1DOWNTO0);dout:OUTSTD_LOGIC_VECTOR(k-1DOWNTO0));ENDstack;ARCHITECTUREbehav_stackOFstackISTYPEmemoryISARRAY(0TOw-1)OFSTD_LOGIC_VECTOR(k-1DOWNTO0);SIGNALram:MEMORY;SIRNALsp:INTEGERRANGE0TOw-1;BEGINdout<=ram(sp);P1:PROCESS(clk)BEGINIF(clk'EVENTANDclk='1')THENIF(push='0')THENram(sp)<=din;ENDIF;ENDIF;ENDPROCESSP1;数据堆栈写

P2:PROCESS(clk,reset)BEGINIF(reset='1')THENsp<=0;ELSIF(clk'EVENTANDclk='0'ANDpush=’0’)THENsp<=sp+1;--在clk的后沿sp+1ElSIF(clk'EVENTANDclk='1'ANDpop=’0’)THENsp<=sp-1;--sp指针修改ENDIF;ENDPROCESSP2;ENDbehav_stack;

加减计数器操作4.4有限状态机

有限状态机是时序电路的通用模型,任何时序电路都可以表示为有限状态机。对于大部分数字电子系统,都可以划分为控制单元和数据单元两个组成部分,控制单元的主体是一个有限状态机,它接收外部信号和数据单元产生的状态的信息,产生各种控制信号,决定何时进行何种数据处理。有限状态机分为两类:Moore型和Mealy型。

次态逻辑状态寄存器输出逻辑输入次态现态输出状态机的设计步骤

定义状态机的各状态。适当地确定状态机的工作状态,是状态机设计的基础,需要充分利用设计者的设计经验。

建立状态转换图。构造状态转换图时,通常从一个比较容易的状态开始。例如系统的初始状态、复位状态或空闲状态等,都是很好的起始状态。为每个状态标出转换的条件,相应的输入、输出信号。建立状态机进程。在VHDL程序中,通常用进程描述有限状态机。由于次态是现态及输入信号的函数,因此,往往将现态和输入信号作为进程的敏感信号。

进程中定义状态的转移。所有的状态均可表达为CASE_WHEN结构中的一条CASE语句,利用CASEWHEN语句IF_THEN_ELSE语句实现状态的转移。

存储器控制器的设计

存储器控制器的输入信号是微处理器的就绪ready和读写信号read_write。当上电复位或者ready有效时,存储器控制器开始工作,并在下一个时钟周期判断本次作业任务是读存储器还是写存储器,当read_write=‘1’时为读操作,使OE和CS信号有效,read_write=‘0’时为写操作,WE和CS信号有效。当ready信号再次有效时,结束本次读写操作,并使控制器返回到初始状态。

存储器控制器readyread-w

温馨提示

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

评论

0/150

提交评论