基本逻辑电路设计_第1页
基本逻辑电路设计_第2页
基本逻辑电路设计_第3页
基本逻辑电路设计_第4页
基本逻辑电路设计_第5页
已阅读5页,还剩189页未读 继续免费阅读

下载本文档

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

文档简介

基本逻辑电路设计第一页,共一百九十五页,编辑于2023年,星期五27.1组合逻辑电路设计7.1.1设计基础

一、组合逻辑电路的设计步骤逻辑真值表逻辑函数式选定器件类型化简逻辑函数逻辑电路图逻辑问题分析事件的因果关系,确定输入端口和输出端口及逻辑状态的含意。将实际的逻辑问题抽象成逻辑函数。由EDA工具自动完成。第二页,共一百九十五页,编辑于2023年,星期五3二、用VHDL建立组合逻辑电路的方法1、借助真值表设计组合电路设计任务:设计一个四选一数据选择器。逻辑功能:从四个输入数据中选出某一数据输出。输入输出端口:四个数据输入端;两个选择控制输入端;一个数据输出端。mux4fin0in1in2in3x0x1引脚框图entitymux4isport(in0,in1,in2,in3:inbit;x0,x1:inbit;f:outbit);endentitymux4;第三页,共一百九十五页,编辑于2023年,星期五4真值表:in0in1in2in3x1x0fin0---00in0-in1--01in1--in2-10in2---in311in3architecturertlofmux4isbeginf<=(in0and((notx1)and(notx0)))or(in1and((notx1)and(x0)))or(in2and((x1)and(notx0)))or(in3and((x1)and(x0)));endarchitecturertl;第四页,共一百九十五页,编辑于2023年,星期五5此例按真值表(用“与或”结构实现)要求,用VHDL语言逻辑表达式方式描述四选一数据选择器,将f=’1’的行用最小项表达式表达出来即可。这种描述方法和传统的由真值表变为最小项表达式的设计方法是相同的,只是用VHDL语言进行描述无须化简(由计算机进行化简);而用传统设计方法描述时,常常要对最小项表达式进行化简,以使设计电路简化。第五页,共一百九十五页,编辑于2023年,星期五62、用逻辑表达式描述组合电路设计任务:设计一个函数电路y=abc+de。输入输出端口:五个函数自变量输入端;一个函数值输出端。functionyabcde引脚框图entityfunctisport(a,b,c,d,e:inbit;y:outbit);endentityfunct;architecturertloffunctisbeginy<=(aandbandc)or(dande);endarchitecturertl;逻辑表达式设计函数电路非常方便,只要用VHDL语言的逻辑符号置换布尔方程中相应的逻辑符号即可。第六页,共一百九十五页,编辑于2023年,星期五73、用算术表达式描述组合电路设计任务:设计一位全加器。逻辑功能:考虑来自低位的进位,将两个一位的二进制数相加,得到一个和位、一个进位位。输入输出端口:两个加数输入端;一个低位进位输入端;一个和输出端;一个进位输出端。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityfulladderisport(a,b,cin:instd_logic;sum,cout:outstd_logic);endentityfulladder;fulladdercoutabcin引脚框图sum第七页,共一百九十五页,编辑于2023年,星期五8算术表达式:(cout,sum)=a+b+cin;architecturertloffulladderissignala1,b1,cin1,sum1:std_logic_vector(1downto0);begina1<='0'&a;b1<='0'&b;cin1<='0'&cin;sum1<=a1+b1+cin1;sum<=sum1(0);cout<=sum1(1);endarchitecturertl;并位运算是为了满足代入符<=左、右两侧运算对象的位数相同。算术表达式设计电路,只要用VHDL语言的算术符号置换算术表达式中相应的算术符号即可,同时要考虑VHDL语言对运算操作数的要求。第八页,共一百九十五页,编辑于2023年,星期五9组合逻辑电路设计实例简单门电路译码器编码器编码转换器数据选择器运算器三态门及总线缓冲器第九页,共一百九十五页,编辑于2023年,星期五107.1.2简单门电路简单门电路表达简答逻辑关系,采用简单的信号代入语句就能够方便地实现;没有必要采用复杂的结构。例如,反向器y<=nota;2输入与非门y<=anandb;2输入或非门y<=anorb;2输入异或门y<=axorb;与或非门y<=not((a1anda2)or(a3anda4));第十页,共一百九十五页,编辑于2023年,星期五11libraryieee;useieee.std_logic_1164.all;entitynand2_71isport(a,b:instd_logic;y:outstd_logic);endentitynand2_71;architecturenand2_1ofnand2_71isbegin

y<=anandb;endarchitecturenand2_1;1.基于逻辑表达式的二输入与非门描述第十一页,共一百九十五页,编辑于2023年,星期五12RTL视图仿真波形图第十二页,共一百九十五页,编辑于2023年,星期五132.基于真值表的二输入与非门描述libraryieee;useieee.std_logic_1164.all;entitynand2_72isport(a,b:instd_logic;y:outstd_logic);endentitynand2_72;architecturenand2_2ofnand2_72isbegin第十三页,共一百九十五页,编辑于2023年,星期五14process(a,b)isvariablecomb:std_logic_vector(1downto0);begincomb:=a&b;aby001011101110二输入与非门真值表casecombiswhen"00"=>y<='1';when"01"=>y<='1';when"10"=>y<='1';when"11"=>y<='0';whenothers=>y<='X';endcase;endprocess;endarchitecturenand2_2;RTL视图第十四页,共一百九十五页,编辑于2023年,星期五15基于真值表的另一种描述形式libraryieee;useieee.std_logic_1164.all;entitynand2_73isport(a,b:instd_logic;y:outstd_logic);endentitynand2_73;architecturenand2_3ofnand2_73isbeginy<=(notaandnotb)or(notaandb)or(aandnotb);endarchitecturenand2_3;aby001011101110二输入与非门真值表RTL视图第十五页,共一百九十五页,编辑于2023年,星期五163.N输入与门的描述entityand_nisgeneric(n:integer);port(a:inbit_vector((n-1)downto0);f:outbit);endentityand_n;architectureusing_loopofand_nisbeginendarchitectureusing_loop;构造体怎样编写?使用什么语句?and_nnaf第十六页,共一百九十五页,编辑于2023年,星期五17process(a)isvariabletemp_f:bit;begintemp_f:='1';foriina'rangelooptemp_f:=temp_fanda(i);endloop;f<=temp_f;endprocess;作业:请大家为“n输入或门”编写VHDL程序代码。第十七页,共一百九十五页,编辑于2023年,星期五18怎样调用可配置输入端口数目的N输入与门entityand_nisgeneric(n:integer);port(a:inbit_vector((n-1)downto0);f:outbit);endentityand_n;componentand_nisgeneric(n:integer);port(a:inbit_vector((n-1)downto0);f:outbit);

endcomponentand_n;N输入与门实体说明部分调用N输入与门的元件说明语句第十八页,共一百九十五页,编辑于2023年,星期五19architecturestrofandgeniscomponent…endcomponent…;signala0,a1:bit_vector(2downto0);signala2:bit_vector(1downto0);begina0<=in0&in1&in2;a1<=in3&in4&in5;u0:and_ngenericmap(3)portmap(a0,a2(0));u1:and_ngenericmap(3)portmap(a1,a2(1));u2:and_ngenericmap(2)portmap(a2,y);endarchitecturestr;利用genericmap语句对and_n配置不同输入端口数目u0&u2&u1&in0in1in2in3in4in5a2(0)a2(1)y第十九页,共一百九十五页,编辑于2023年,星期五207.1.3译码器译码器的功能根据特定的输入数字状态,激活电路的一个或多个输出。常用译码器二进制译码器:也称“最小项发生器”,其多位输出分别表达输入的不同最小项,如3-8线译码器。BCD-七段显示译码器。地址译码器。第二十页,共一百九十五页,编辑于2023年,星期五21输入输出端口:一个三位的待译码二进制数据输入端;八个译码输出端,反函数输出;三个选通输入控制端g1、g2a、g2b。libraryieee;useieee.std_logic_1164.all;entitykdecoder38isport(g1,g2a,g2b:instd_logic;a:instd_logic_vector(2downto0);y:outstd_logic_vector(7downto0));endentitykdecoder38;1.3-8线译码器第二十一页,共一百九十五页,编辑于2023年,星期五22architecturertlofkdecoder38issignalyl:std_logic_vector(7downto0);beginwithaselectyl<=

"11111110"when"000","11111101"when"001",……“01111111"when"111","11111111"whenothers;y<=ylwhen(g1andnotg2aandnotg2b)='1'else"11111111";endarchitecturertl;选通输入二进制输入译码输出g1g2ag2ba[2:0]y[7:0]X1XXXX11111111XX1XXX111111110XXXXX111111111000001111111010000111111101100010111110111000111111011110010011101111100101110111111001101011111110011101111111第二十二页,共一百九十五页,编辑于2023年,星期五23

第二十三页,共一百九十五页,编辑于2023年,星期五242.BCD-七段显示译码器输入BCD码(8421码,用四位二进制数码表示的一位十进制数),产生7个输出,分别驱动相应显示器件(二极管或液晶显示单元),可显示十进制数。7段输出与BCD码的对应关系:data(3downto0):abcdefg0000:11111100001:01100000010:11011010011:11110010100:01100110101:10110110110:00111110111:11100001000:11111111001:1110011第二十四页,共一百九十五页,编辑于2023年,星期五25libraryieee;useieee.std_logic_1164.all;entitybcdseg7isport(data:instd_logic_vector(3downto0);y:outstd_logic_vector(6downto0));endentity

bcdseg7;第二十五页,共一百九十五页,编辑于2023年,星期五26architecturedofbcdseg7isbeginy<="1111110"whendata="0000"else"0110000"whendata="0001"else"1101101"whendata="0010"else"1111001"whendata="0011"else"0110011"whendata="0100"else"1011011"whendata="0101"else"0011111"whendata="0110"else"1110000"whendata="0111"else"1111111"whendata="1000"else"1110011"whendata="1001"else

"0000000";endarchitectured;data(3downto0):abcdefg0000:11111100001:01100000010:11011010011:11110010100:01100110101:10110110110:00111110111:11100001000:11111111001:1110011第二十六页,共一百九十五页,编辑于2023年,星期五273.地址译码器使能端(en)地址(a19~a0)片选输出(cs)000000H~01FFFHCS0=0,其余为1040000H~43FFFHCS1=0,其余为1008000H~0AFFFHCS2=0,其余为10E0000H~E01FFHCS3=0,其余为11XXXXXH全1地址译码器真值表第二十七页,共一百九十五页,编辑于2023年,星期五28libraryieee;useieee.std_logic_1164.all;entityaddrdecisport(en:instd_logic;address:instd_logic_vector(19downto0);cs:outstd_logic_vector(3downto0));endentityaddrdec;第二十八页,共一百九十五页,编辑于2023年,星期五29--enmustbe'0'toenableanyoutput--cs(0):X"00000"toX"01FFF"--cs(1):X"40000"toX"43FFF"--cs(2):X"08000"toX"0AFFF"--cs(3):X"E0000"toX"E01FF"architecturev1ofaddrdecisbegincs(0)<='0'when((en='0')and((address>=X"00000")and(address<=X"01FFF")))else'1';cs(1)<='0'when((en='0')and((address>=X"40000")and(address<=X"43FFF")))else'1';cs(2)<='0'when((en='0')and((address>=X"08000")and(address<=X"0AFFF")))else'1';cs(3)<='0'when((en='0')and((address>=X"E0000")and(address<=X"E01FF")))else'1';endarchitecturev1;第二十九页,共一百九十五页,编辑于2023年,星期五30练习:改用case语句或select语句完成地址译码器的描述architecturev2ofaddrdecissignalcstemp:std_logic_vector(3downto0);beginwithaddressselectcstemp<="1110"whenX"00000"toX"01FFF","1101"whenX"40000"toX"43FFF","1011"whenX"08000"toX"0AFFF","0111"whenX"E0000"toX"E01FF","1111"whenothers;cs<=cstempwhenen='0'else"1111";endarchitecturev2;是否正确?**Error:E:/modelsimwork/addrdec/addrdec.vhd(24):Rangetypestd_logic_vectorisnotascalartype.第三十页,共一百九十五页,编辑于2023年,星期五31case语句architecturev3ofaddrdecwithissignalcstemp:std_logic_vector(3downto0);beginprocess(address)isbegincaseaddressiswhenX"00000"toX"01FFF"=>cstemp<="1110";whenX"40000"toX"43FFF"=>cstemp<="1101";whenX"08000"toX"0AFFF"=>cstemp<="1011";whenX"E0000"toX"E01FF"=>cstemp<="0111";whenothers=>cstemp<="1111";endcase;endprocess;cs<=cstempwhenen='0'else"1111";endarchitecturev3;第三十一页,共一百九十五页,编辑于2023年,星期五32……useieee.std_logic_unsigned.all;……architecturev2ofaddrdecissignalcstemp:std_logic_vector(3downto0);signaladdrtemp:integerrange0to1048575;begin

addrtemp<=conv_integer(address);withaddrtempselectcstemp<="1110"when0to8191,"1101"when262144to278527,"1011"when32768to45055,"0111"when917504to918015,"1111"whenothers;cs<=cstempwhenen='0'else"1111";endarchitecturev2;修改后程序如下第三十二页,共一百九十五页,编辑于2023年,星期五334.作业:二-十进制BCD译码器设计任务:设计一个二-十进制BCD译码器。译码器输入din为4位二进制数,输出b为十进制数的高位,a为十进制数的低位,a、b是二进制编码的十进制数。端口图如下:第三十三页,共一百九十五页,编辑于2023年,星期五347.1.4编码器编码器是与译码器逻辑功能相反的数字部件,它将特定意义的输入数字信号变成相应的若干位二进制代码。优先级编码器常用于中断的优先级控制。比如8线-3线优先编码器,输入8个数据信号,编码成3位二进制代码表示的数据,并进行输出;低位0优先,反函数输出。本节讲述该编码器的编程,真值表如下第三十四页,共一百九十五页,编辑于2023年,星期五35编码输入使能输入组信号输出编码输出d7d6d5d4d3d2d1d0eingsneona2na1na0nXXXXXXXX111111XXXXXXX0001111XXXXXX01001110XXXXX011001101XXXX0111001100XXX01111001011XX011111001010X01111110010010111111100100011111111010111第三十五页,共一百九十五页,编辑于2023年,星期五36libraryieee;useieee.std_logic_1164.all;entityencoder8_3isport(d:instd_logic_vector(7downto0);ein:instd_logic;a0n,a1n,a2n,gsn,eon:outstd_logic);endentityencoder8_3;引脚框图第三十六页,共一百九十五页,编辑于2023年,星期五37architectureaofencoder8_3issignalq:std_logic_vector(2downto0);begina0n<=q(0);a1n<=q(1);a2n<=q(2);process(d)isbeginifein='1'thenq<="111";gsn<='1';eon<='1';elsifd(0)='0'thenq<="111";gsn<='0';eon<='1';elsifd(1)='0'thenq<="110";gsn<='0';eon<='1';……elsifd(7)='0'thenq<="000";gsn<='0';eon<='1';elseq<="111";gsn<='1';eon<='0';endif;endprocess;endarchitecturea;优先级由高到低第三十七页,共一百九十五页,编辑于2023年,星期五38仿真波形图RTL视图第三十八页,共一百九十五页,编辑于2023年,星期五397.1.5码制转换电路该类电路为多路输入/多路输出,将输入的编码转换为对应的输出的编码;上述二进制译码器、编码器的数据流设计方式可以推广到各类码制转换电路的设计中;我们将8421码向余三码转换电路的VHDL描述留给同学们作为课后练习。第三十九页,共一百九十五页,编辑于2023年,星期五40作业:BCDExcess-3(余3码)的转换libraryieee;useieee.std_logic_1164.all;

entitykbcd_ex3isport(a:instd_logic_vector(3downto0);y:outstd_logic_vector(3downto0));endentitykbcd_ex3;architecturertlofkbcd_ex3isbegin………使用with…select…语句,或其他任何可行方式endarchitecturertl;第四十页,共一百九十五页,编辑于2023年,星期五417.1.6数据选择器数据选择器又叫多路开关,在选择信号的控制下,数据选择器从多个数据输入通道中选择1路或多路的数据传输至输出端,常用于信号的切换。我们在7.1.1节,讲述了利用真值表描述数据选择器的方法,在第五章中讲述if语句、case语句、选择信号代入语句、条件信号代入语句的用法时,都以四选一数据选择器为例进行说明,此处就不再重复。参看课本143页的例7-13。第四十一页,共一百九十五页,编辑于2023年,星期五42作业:设计16-4数据选择器,其引脚框图及真值表如下所示。选择输入输出s1s0x00a01b10c11d16-4数据选择器真值表第四十二页,共一百九十五页,编辑于2023年,星期五437.1.7运算器运算电路主要包括:比较器(comparator)加法器(adder)乘法器(multipliers)算术逻辑单元(ALU)求补器这里,我们主要讲加法器。第四十三页,共一百九十五页,编辑于2023年,星期五441.半加器加法器有全加器和半加器之分,半加器是组成全加器的基本部件,逻辑符号及真值表如下二进制输入和输出进位输出basco0000011010101101第四十四页,共一百九十五页,编辑于2023年,星期五45libraryieee;useieee.std_logic_1164.all;entityhalf_adderisport(a,b:instd_logic;s,co:outstd_logic);endentityhalf_adder;architecturehalf1ofhalf_adderisbeginco<=aandb;s<=axorb;endarchitecturehalf1;c<=aorb;d<=anandb;co<=notd;s<=candd;signalc,d:std_logic;第四十五页,共一百九十五页,编辑于2023年,星期五46

第四十六页,共一百九十五页,编辑于2023年,星期五472.全加器输入输出端口输入:a,b,ci(进位)输出:s(和位),co(进位)

半加器仅能用于1bit加法,如果要设计较多位的加法器时,仅靠多个半加器相连无法达成此愿望,因其无法处理进位问题,故须使用全加器。当两个二进制数相加时,较高的高位相加时必须加入较低的进位项,以得到输出为和(s)及进位(co),因此有三个输入项,而输出同样为两项。第四十七页,共一百九十五页,编辑于2023年,星期五48输入输出abcisco0000000110010100110110010101011100111111全加器真值表逻辑表达式:第四十八页,共一百九十五页,编辑于2023年,星期五49libraryieee;useieee.std_logic_1164.all;entityfulladderisport(a:instd_logic;b:instd_logic;

ci:instd_logic;s:outstd_logic;co:outstd_logic);endentityfulladder;architecturertloffulladderisbegins<=(axorb)xorci;co<=(aandb)or(cianda)or(ciandb);endarchitecturertl;第四十九页,共一百九十五页,编辑于2023年,星期五50基于逻辑表达式的RTL视图基于算术表达式的RTL视图第五十页,共一百九十五页,编辑于2023年,星期五513.由两个半加器构成一位全加器libraryieee;useieee.std_logic_1164.all;entityfull_adderis

port(a,b,cin:instd_logic;s,co:outstd_logic);end

entity

full_adder;半加器逻辑表达式全加器逻辑表达式第五十一页,共一百九十五页,编辑于2023年,星期五52architecturefulloffull_adderiscomponenthalf_adderis

port(a,b:instd_logic;s,co:outstd_logic);endcomponenthalf_adder;signalu0_co,u0_s,u1_co:std_logic;beginu0:half_adderportmap(a,b,u0_s,u0_co);u1:half_adderportmap(u0_s,cin,s,u1_co);co<=u0_cooru1_co;end

architecture

full;第五十二页,共一百九十五页,编辑于2023年,星期五534.N位串行进位加法器第五十三页,共一百九十五页,编辑于2023年,星期五54libraryieee;useieee.std_logic_1164.all;entityaddernisgeneric(n:integer:=16);port(a:instd_logic_vector(ndownto1);b:instd_logic_vector(ndownto1);cin:instd_logic;sum:outstd_logic_vector(ndownto1);cout:outstd_logic);end

entityaddern;architecturestructuralofaddernis

componentfulladderisport(a:instd_logic;b:instd_logic;ci:instd_logic;s:outstd_logic;co:outstd_logic);

endcomponentfulladder;第五十四页,共一百九十五页,编辑于2023年,星期五55signalcarry:std_logic_vector(0ton);begincarry(0)<=cin;cout<=carry(n);--instantiateasingle_bitadderntimesgen:foriin1tongenerate

add:

fulladderportmap(a=>a(i),b=>b(i),ci=>carry(i-1),s=>sum(i),co=>carry(i));endgenerate;end

architecturestructural;思考:我们可以用信号代入语句来写吗?第五十五页,共一百九十五页,编辑于2023年,星期五56练习:改错并判断以下程序所描述电路的功能libraryieee;useieee.std_logic_1164.all;entitykparity9isport(i:instd_logic_vector;even,odd:outstd_logic);endentitykparity9;architecturertlofkparity9isvariabley1,y2,y3:std_logic;beginy1:=i(1)xori(2)xori(3);y2:=i(4)xori(5)xori(6);y3:=i(7)xori(8)xori(9);even<=notodd;odd<=y1xory2xory3;endarchitecturertl;9位奇偶校验电路,若输入数据中包含偶数个1则,even为1,odd为0;否则,even为0,odd为1。第五十六页,共一百九十五页,编辑于2023年,星期五57练习:设计一个四位比较器,它有两个四位输入端口in1和in2,是需要比较的两个操作数;一个一位的输出端口pout,当in1<in2时,输出高电平,否则输出低电平。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycompisport(in1,in2:instd_logic_vector(3downto0);pout:outstd_logic);endentitycomp;architecturertlofcompisbegincompin1in2pout第五十七页,共一百九十五页,编辑于2023年,星期五58process(in1,in2)isvariablet1,t2:integerrange0to15;begint1:=conv_integer(in1);t2:=conv_integer(in2);ift1<t2thenpout<='1';elsepout<='0';endif;endprocess;endarchitecturertl;compin1in2poutuseieee.std_logic_unsigned.all;第五十八页,共一百九十五页,编辑于2023年,星期五59第五十九页,共一百九十五页,编辑于2023年,星期五60练习二进制值运算经常用到求补操作,设计一个8位的求补器。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityhosuuisport(a:instd_logic_vector(7downto0);b:outstd_logic_vector(7downto0));endentityhosuu;architecturertlofhosuuisbeginb<=nota+‘1’;endarchitecturertl;此程序没有考虑有符号数的求补第六十页,共一百九十五页,编辑于2023年,星期五61libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityhosisport(a:instd_logic_vector(7downto0);b:outstd_logic_vector(7downto0));endentityhos;architecturertlofhosisbegin……endarchitecturertl;process(a)isvariablet:std_logic_vector(6downto0);beginifa(7)='1'thent:=nota(6downto0)+1;b<=a(7)&t;elseb<=a;endif;endprocess;有符号数的求补描述第六十一页,共一百九十五页,编辑于2023年,星期五62Info:Longesttpdfromsourcepin"a[7]"todestinationpin"b[4]"is10.236nstotallogicelement8Info:Longesttpdfromsourcepin"a[0]"todestinationpin"b[6]"is10.553nstotallogicelement7无符号数的求补器有符号数的求补器有符号数的求补器的仿真波形图第六十二页,共一百九十五页,编辑于2023年,星期五63作业:设计四位算术逻辑单元(ALU),它具有一个3位的功能选择输入端口sel;两个四位的操作数输入端口a、b;一个进位输入端口cin;一个四位的结果输出端口y;一个进位输出端口cout;通过sel的选择,可以对输入的两组数据及进位进行8种不同的算术运算或逻辑运算,对应关系见真值表。第六十三页,共一百九十五页,编辑于2023年,星期五64功能选择sel[2:0]对应的算术逻辑运算000y=a+b+cin001y=a-b-cin010y=a+cin011y=a-cin100y=aandb101y=aorb110y=axorb111y=nota算术逻辑单元真值表将每一种运算设计成一个小程序块,通过选择语句中的控制变量选择不同的程序块进行运算。设计思想第六十四页,共一百九十五页,编辑于2023年,星期五65libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;

entityalu1isport(a,b:instd_logic_vector(3downto0);cin:instd_logic;sel:instd_logic_vector(2downto0);y:outstd_logic_vector(3downto0);cout:outstd_logic);endentityalu1;第六十五页,共一百九十五页,编辑于2023年,星期五66architecturebehofalu1issignalc:std_logic_vector(3downto0);beginprocess(a,b,cin,sel)isbegincaseseliswhen“000”=>--实现a+b+cin;

when"001"=>--实现a-b-cin;when“010”=>--实现a+cin;

when"011"=>--实现a-cin;when“100”=>--实现y=aandb;when“101”=>--实现y=aorb;when“110”=>--实现y=axorb;when“111”=>--实现y=nota;whenothers=>y<="0000”;cout<='0';

endcase;endprocess;endarchitecturebeh;第六十六页,共一百九十五页,编辑于2023年,星期五677.1.8三态门及总线缓冲器三态门电路数据输入控制输入数据输出dinendoutX0Z010111三态门真值表

三态门和双向缓冲器是接口电路和总线驱动电路经常用到的器件。利用高阻态,可以使总线被多个设备所共享,并且可以方便地实现数据总线的双向操作。第六十七页,共一百九十五页,编辑于2023年,星期五68libraryieee;useieee.std_logic_1164.all;entitytrigateisport(din,en:instd_logic;dout:outstd_logic);endentitytrigate;architecturertloftrigateisbeginprocess(din,en)isbeginif(en='1')thendout<=din;elsedout<='Z';endif;endprocess;endarchitecturertl;第六十八页,共一百九十五页,编辑于2023年,星期五69卫式块结构描述的三态门architecturertloftri_gateisbegintri_gate2:block(en='1')begindout<=guardeddin;endblocktri_gate2;endarchitecturertl;architecturertloftri_gateisbeginprocess(din,en)isbegincaseeniswhen‘1’=>dout=>din;whenothers=>dout<=‘Z’;endcase;endprocess;endarchitecturertl;case语句描述的三态门第六十九页,共一百九十五页,编辑于2023年,星期五702.单向总线缓冲器单向总线缓冲器通常由多个三态门组成,所有三态缓冲器的控制端连在一起。八位单向总线驱动器din(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)enendin(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)en第七十页,共一百九十五页,编辑于2023年,星期五71libraryieee;useieee.std_logic_1164.all;entitytribuf8isport(din:instd_logic_vector(7downto0);dout:outstd_logic_vector(7downto0);en:instd_logic);endentitytribuf8;architecturertloftribuf8isbeginprocess(en,din)isbeginif(en=‘1’)thendout<=din;elsedout<=“ZZZZZZZZ”;endif;endprocess;endarchitecturertl;Tri_buff:block(en=‘1’)begindout<=guardeddin;endblockTri_buff;tri_buf:process(en,din)isbegincaseeniswhen‘1’=>dout<=din;whenothers=>dout<="ZZZZZZZZ";endcase;endprocesstri_buf;dout<=dinwhenen='1'else"ZZZZZZZZ";第七十一页,共一百九十五页,编辑于2023年,星期五72采用条件语句的仿真波形采用卫式块的仿真波形采用条件语句的RTL视图第七十二页,共一百九十五页,编辑于2023年,星期五733.双向总线缓冲器gdir功能00a<=b01b<=a1X高阻双向总线缓冲器真值表第七十三页,共一百九十五页,编辑于2023年,星期五74libraryieee;useieee.std_logic_1164.all;entitytribigateis

port(a,b:inoutstd_logic_vector(7downto0);g,dir:instd_logic);endentitytribigate;architecturertloftribigateissignalaout,bout:std_logic_vector(7downto0);begin引脚框图第七十四页,共一百九十五页,编辑于2023年,星期五75process(a,dir,g)isbeginif((g='0')and(dir='1'))thenbout<=a;elsebout<="ZZZZZZZZ";endif;b<=bout;endprocess;process(b,dir,g)isbeginif(g='0'anddir='0')thenaout<=b;elseaout<="ZZZZZZZZ";endif;a<=aout;endprocess;endarchitecturertl;b<=awhen(g='0')and(dir='0')else"ZZZZZZZZ";a<=bwhen(g='0')and(dir='1')else“ZZZZZZZZ”;gdir功能00a<=b01b<=a1X高阻真值表第七十五页,共一百九十五页,编辑于2023年,星期五76注意双向总线缓冲器在功能仿真时的输入波形设置a和b的输入不要同时存在;设置a的输入,应将b的输入设置为“ZZZZZZZZ”(高阻);转换传输方向时,应该以双向阻塞作为间隔。b<=awhen(g='0')and(dir='0')else"ZZZZZZZZ";a<=bwhen(g='0')and(dir='1')else“ZZZZZZZZ”;第七十六页,共一百九十五页,编辑于2023年,星期五777.2时序逻辑电路的VHDL设计

时序电路与组合电路的区别在于,时序逻辑电路多了存储电路部分,需要记录目前的输出信号状态,用来与输入信号一起,共同决定下一次输出信号的状态。本节内容:时钟信号和复位信号触发器寄存器计数器第七十七页,共一百九十五页,编辑于2023年,星期五787.2.1时钟信号和复位信号1.时钟信号的描述时序逻辑电路的信号变化特点:任何时序逻辑电路以时钟信号为驱动;电路内部信号的变化(或输出信号的变化)只发生在特定的时钟边沿;其他时刻输入信号的变化对电路不产生影响;所以,时钟信号通常是描述时序逻辑电路程序的执行条件;时序逻辑电路总是以时钟进程的形式进行描述,一般有两种形式。第七十八页,共一百九十五页,编辑于2023年,星期五791)进程的敏感信号是时钟信号process(clock_signal)isbeginif(clock_edge_condition)thensignal_out<=signal_in;…

其他时序语句;

…endif;endprocess;时钟信号发生变化时启动测试时钟边沿条件是否满足,满足则执行时序电路所对应的语句第七十九页,共一百九十五页,编辑于2023年,星期五802)进程中使用wait语句等待时钟processbegin

waituntil(clock_signal)and(clock_edge_condition);signal_out<=signal_in;…

其他时序语句;…endprocess;等待时钟边沿在程序中要说明是使用时钟上升沿还是下降沿;进程中的敏感信号表,只能出现一个时钟;wait语句只能放在进程的最前面或最后面。第八十页,共一百九十五页,编辑于2023年,星期五813)时钟边沿的描述A.上升沿ifclk=‘1’andclk’last_value=‘0’andclk’eventB.下降沿ifclk=‘0’andclk’last_value=‘1’andclk’event时钟边沿属性描述的一般形式:

clock_siganl=current_valueandclock_signal’last_valueandclock_signal’event第八十一页,共一百九十五页,编辑于2023年,星期五822.复位信号时序逻辑电路的初始状态应由复位信号来设置,根据复位信号对时序逻辑电路复位操作的不同,可分为同步复位和异步复位。同步复位:复位信号有效,并且在给定的时钟边沿到来时,触发器才被复位。异步复位:复位信号一旦有效,时序逻辑电路立即回到初始状态。第八十二页,共一百九十五页,编辑于2023年,星期五831)同步复位同步复位在以时钟为敏感信号的进程中定义,且用if语句来描述复位条件。形式A:

process(clock_signal)isbeginif(clock_edge_condition)then……endif;endprocess;if(reset_condition)thensignal_out<=reset_value;elsesignal_out<=signal_in;

其他时序语句;

endif;第八十三页,共一百九十五页,编辑于2023年,星期五84形式B:processbegin

waituntil(clock_signal)and(clock_edge_condition);if(reset_condition)thensignal_out<=reset_value;elsesignal_out<=signal_in;…

其它时序语句;

…endif;endprocess;第八十四页,共一百九十五页,编辑于2023年,星期五852)异步复位在描述上与同步方式的不同之处:进程敏感信号表中应有clk、reset同时存在;用if语句描述复位条件;在elsif段描述时钟边沿的条件,并加上event属性。第八十五页,共一百九十五页,编辑于2023年,星期五86process(clock_signal,reset_signal)isbegin

if(reset_condition)then

signal_out<=reset_value;

elsif(clock’eventandclock_edge_condition)thensignal_out<=signal_in;…

其他时序语句;

…endif;endprocess;第八十六页,共一百九十五页,编辑于2023年,星期五877.2.2触发器1.D触发器数据输入端时钟输入端数据输出端dclkqn+1X0qnX1qn0上升沿01上升沿1

输出只在时钟边沿时刻发生变化,输入信号变化不能直接导致输出变化。(边沿控制)第八十七页,共一百九十五页,编辑于2023年,星期五88libraryieee;useieee.std_logic_1164.all;entitydff1isport(clk,d:instd_logic;q:outstd_logic);endentitydff1;architecturertlofdff1isbeginprocess(clk)isbeginif(clk'eventandclk='1')thenq<=d;endif;endprocess;endarchitecturertl;第八十八页,共一百九十五页,编辑于2023年,星期五89使用waituntil语句描述时钟边沿触发条件libraryieee;useieee.std_logic_1164.all;entitydff11isport(clk,d:instd_logic;q:outstd_logic);endentitydff11;architecturertlofdff11isbeginprocessbegin

waituntilclk'eventandclk='1';

q<=d;endprocess;endarchitecturertl;作业:请大家用VHDL语言描述D锁存器,输出受时钟电平控制,在高电平期间其输出跟随输入变化。(电平控制)

第八十九页,共一百九十五页,编辑于2023年,星期五90libraryieee;useieee.std_logic_1164.all;entitydff2isport(clk,d,clr:instd_logic;q:outstd_logic);endentitydff2;architecturertlofdff2isbeginprocess(clk,clr)isbeginif(clr=‘0’)thenq<='0';elsif(clk'eventandclk='1')thenq<=d;endif;endprocess;endarchitecturertl;2.异步复位D触发器第九十页,共一百九十五页,编辑于2023年,星期五913.异步置位/复位D触发器libraryieee;useieee.std_logic_1164.all;entitydff3isport(clk,d,clr,pset

:instd_logic;

温馨提示

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

评论

0/150

提交评论