1基本逻辑电路:组合逻辑电路、时序逻辑电路一组合逻辑电路设计简单门电路、编码器、译码器、加法器、多路选择器、三态门等。§3.9基本逻辑电路设计21、基本门电路32、编码器设计一个8输入优先级编码器,y0级别最低,y7级别最高;输出为3位编码。Y7=1Vec=111Y6=1Vec=110Y5=1Vec=101Y4=1Vec=100Y3=1Vec=011Y2=1Vec=010Y1=1Vec=001Y0=1Vec=0004方法1:利用if多选择语句自顶向下的优先特性5方法2:进程内为顺序语句,最先描述优先级最低,最后描述优先级最高,可实现优先级编码。6方法3:利用条件赋值语句architecturebehaviorofpriorityisbeginvec=“111”wheny7=‘1’else“110”wheny6=‘1’else“101”wheny5=‘1’else“100”wheny4=‘1’else“011”wheny3=‘1’else“010”wheny2=‘1’else“001”wheny1=‘1’else“000”wheny0=‘1’else“XXX”;endbehavior;73、译码器译码器是编码器的逆过程。如3-8译码器:sel=000Y=00000001sel=001Y=00000010sel=010Y=00000100sel=011Y=00001000sel=100Y=00010000sel=101Y=00100000sel=110Y=01000000sel=111Y=100000008方法1:使用逻辑左移运算符libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydecoderisport(inp:instd_logic_vector(2downto0);outp:outstd_logic_vector(7downto0));enddecoder;architecturertlofdecoderisbeginoutp=“00000001”sll(conv_integer(inp));endrtl;9方法2:使用process语句libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydecoderisport(inp:instd_logic_vector(2downto0);outp:outstd_logic_vector(7downto0));enddecoder;architecturertlofdecoderisbeginprocess(inp)beginoutp=(others=’0’);outp(conv_integer(inp))=‘1’;endprocess;endrtl;10方法3:使用case语句实现。11译码输出低有效12方法4:使用条件赋值语句133-8译码器仿真结果:译码输出低有效144、加法器带进位的4位加法器符号如下:Sum(i)=a(i)b(i)cinC(i+1)=a(i)b(i)+((a(i)+b(i))c(i)15方法1:用for–loop语句实现16方法2:直接使用加法“+”函数:17加法器仿真结果:185、多路选择器前面用if语句、case语句、条件赋值语句、选择赋值语句分别描述过4选1选择器。6、三态门及总线缓冲器VHDL语言通过指定大写的Z值表示高阻状态a:std_logic;a_bus:std_logic_vector(7downto0);指定高阻状态如下:a=‘Z’;a_bus=“ZZZZZZZZ”;191)三态门电路描述20三态门仿真结果:212)单向总线缓冲器223)双向总线缓冲器23二时序逻辑电路设计触发器、寄存器、计数器、分频器、信号发生器等。一)时序电路特殊信号的描述时钟信号和复位信号1、时钟信号描述常用的描述方式:1)进程的敏感信号是时钟信号,在进程内部用if语句描述时钟的边沿条件。24如:process(clock_signal)beginif(clock_edge_condition)thensignal_out=signal_in;┇其它时序语句┇endif;endprocess;252)在进程中用waituntil语句描述时钟信号,此时进程将没有敏感信号。如:processbeginwaituntil(clock_edge_condition);signal_out=signal_in;┇其它时序语句┇endprocess;26注意:a.在对时钟边沿说明时,一定要注明是上升沿还是下降沿。b.一个进程中只能描述一个时钟信号。c.waituntil语句只能放在进程的最前面或最后面。3)时钟边沿的描述时钟上升沿:(clock’eventandclock=‘1’)时钟下降沿:(clock’eventandclock=‘0’)272、触发器的复位信号描述1)同步复位:在只有以时钟为敏感信号的进程中定义。如:process(clock_signal)beginif(clock_edge_condition)thenif(reset_condition)thensignal_out=reset_value;elsesignal_out=signal_in;┇endif;endif;endprocess;282)异步复位:进程的敏感信号表中除时钟信号外,还有复位信号。如:process(reset_signal,clock_signal)beginif(reset_condition)thensignal_out=reset_value;elsif(clock_edge_condition)thensignal_out=signal_in;┇endif;endprocess;29二)常用时序电路设计1、触发器(Flip_Flop)1)D触发器30异步置位/复位D触发器31同步复位D触发器32比较:异步置位的锁存器(Latch)33libraryieee;useieee.std_logic_1164.all;entityt_ffisport(t,clk:instd_logic;q:bufferstd_logic);endt_ff;architecturertloft_ffisbeginprocess(clk)beginifclk’eventandclk=‘1’thenift=‘1’thenq=notq;elseq=q;endif;endprocess;endrtl;TClkQQ2)T触发器34libraryieee;useieee.std_logic_1164.all;entityrs_ffisport(r,s,clk:instd_logic;q,qn:bufferstd_logic);endrs_ff;architecturertlofrs_ffisbeginprocess(r,s,clk)beginifclk’eventandclk=‘1’thenifs=‘1’andr=‘0’thenq=‘0’;qn=‘1’;elsifs=‘0’andr=‘1’thenq=‘1’;qn=‘0’;elsifs=‘0’andr=‘0’thenq=q;qn=qn;elsenull;endif;endif;endprocess;endrtl;SClkQQRSRQQn00QQn0110100111ØØ3)RS触发器352、寄存器8位串行输入、串行输出移位寄存器:z0z1z2z3z4z5z6z7z8368位移位寄存器描述(结构描述)378位移位寄存器直接用信号连接描述38移位寄存器仿真结果:393、计数器计数器分为:同步计数器异步计数器(1)同步计数器同步计数器指在时钟脉冲(计数脉冲)的控制下,构成计数器的各触发器状态同时发生变化的计数器。40带允许端的十二进制计数器41可逆计数器(加减计数器)42可逆计数器仿真结果:43例:六十进制(分、秒)计数器444560进制计数器仿真结果:46(2)异步计数器异步计数器又称为行波计数器,它的低位计数器的输出作为高位计数器的时钟信号。异步计数器采用行波计数,使计数延迟增加,计数器工作频率较低。描述异步计数器与同步计数器的不同主要体现在对各级时钟脉冲的描述上。47例:由8个触发器构成的行波计数器:48基本元件dffr的描述:49采用元件例化描述8位行波计数器:508位行波计数器仿真结果:514、序列信号发生器、检测器1)“01111110”序列发生器5253仿真结果:542)序列信号检测器,检测“01111110”55565758简洁的序列信号检测器:5960三存储器设计1、ROM61622、SRAM6364仿真结果:65第3章习题四1、给触发器复位的方法有哪两种?如果时钟进程中用了敏感信号表,哪种复位方法要求把复位信号放在敏感信号表中?2、设计一个任意n分频的分频器。3、设计一个用于时钟(分、秒)计数的60进制的计数器(分个、十位)。4、设计一个用于时钟(小时)计数的24进制的计数器(分个、十位)。5、给定一个参考晶振频率f=1MHz,设计一个数字电子表。