1、用VHDL进行基本逻辑电路设计总结,组合逻辑电路设计时序逻辑电路设计 状态机设计 存储器设计(调用宏功能模块进行设计),1 组合逻辑电路设计,常见组合逻辑电路设计主要有:基本门电路、3-8译码器、8-3线优先编码器、比较器、多路选择器、三态门电路、单向总线驱动器、双向总线缓冲器等。,1.1 基本门电路 基本门电路用VHDL语言来描述十分方便。为方便起见,在下面的两输入模块中,使用VHDL中定义的逻辑运算符,同时实现一个与门、或门、与非门、或非门、异或门及反相器的逻辑。,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY GATE IS PORT (A
2、,B:IN STD_LOGIC; YAND,YOR,YNAND,YNOR,YNOT,YXOR:OUT STD_LOGIC); END GATE;ARCHITECTURE ART OF GATE IS BEGIN YAND =A AND B; -与门输出 YOR =A OR B; -或门输出 YNAND=A NAND B; -与非门输出 YNOR =A NOR B; -或非门输出 YNOT =A NOT B; -反相器输出 YXOR =A XOR B; -异或门输出 END ART;,方法1:使用CASE_WHEN 语句LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.A
3、LL;ENTITY DECODER ISPORT(SEL:IN STD_LOGIC_VECTOR(2 DOWNTO 0); EN: IN STD_LOGIC; -加使能控制端 Y:OUT STD_LOGIC _VECTOR (7 DOWNTO 0);END;,1.2 3-8译码器下面我们分别以2种方法描述一个3-8译码器。,ARCHITECTURE ART1 OF DECODER ISBEGINPROCESS(SEL,EN) BEGIN Y Y(0) Y(1) Y(2) Y(3) Y(4) Y(5) Y(6) Y(7)NULL; END CASE;ELSE Y=”11111111”; END
4、IF;END PROCESS;END ART1;,方法2:使用条件选择WHEN ELSE 语句 ARCHITECTURE ART2 OF DECODER ISBEGIN Y (0)=0 WHEN (EN=1AND SEL=000) ELSE 1; Y (1)=0 WHEN (EN=1AND SEL=001) ELSE 1; Y (2)=0 WHEN (EN=1AND SEL=010) ELSE 1; Y (3)=0 WHEN (EN=1AND SEL=011) ELSE 1; Y (4)=0 WHEN (EN=1AND SEL=100) ELSE 1; Y (5)=0 WHEN (EN=1AN
5、D SEL=101) ELSE 1; Y (6)=0 WHEN (EN=1AND SEL=110) ELSE 1; Y (7)=0 WHEN (EN=1AND SEL=111) ELSE 1;END ART2;注意:使用了8条 WHEN ELSE 语句,1.3 8-3线优先编码器8-3线优先编码器输入信号为y0、y1、y2、y3、y4、y5、y6和y7,输出信号为OUT0、OUT1和OUT2。输入信号中y0的优先级别最低,依次类推,y7的优先级别最高。下面我们用两种方法设计8-3线优先编码器。,方法1:使用条件赋值语句LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.A
6、LL;ENTITY ENCODER IS PORT (y0,y1,y2,y3,y4,y5,y6,y7:IN STD_LOGIC; OUT0,OUT1,OUT2:OUT STD_LOGIC);END ENCODER; ARCHITECTURE ART1 OF ENCODER IS SIGNAL OUTS:STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN OUTS (2 DOWNTO 0)= 111” WHEN y7=1 ELSE 110 WHEN y6=1 ELSE 101 WHEN y5=1 ELSE 100 WHEN y4=1 ELSE 011 WHEN y3=1 EL
7、SE 010 WHEN y2=1 ELSE 001 WHEN y1=1 ELSE 000 WHEN y0=1 ELSE XXX; OUT0=OUTS(0); OUT1=OUTS(1); OUT2=OUTS(2); END ART1;,方法2:使用IF语句LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ENCODER IS PORT(IN1:IN STD_LOGIC_VECTOR(7 DOWNTO 0); OUT1:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);END ENCODER;ARCHITECTURE ART2 OF E
8、NCODER ISBEGIN PROCESS(IN1) BEGIN IF IN1(7)=1 THEN OUT1=111;ELSIF IN1(6)=1 THEN OUT1=110;ELSIF IN1(5)=1 THEN OUT1=101;ELSIF IN1(4)=1 THEN OUT1=100;ELSIF IN1(3)=1 THEN OUT1=011;ELSIF IN1(2)=1 THEN OUT1=010;ELSIF IN1(1)=1 THEN OUT1=001;ELSIF IN1(0)=1 THEN OUT1=000;ELSE OUT1=XXX;END IF ;END PROCESS;END
9、 ART2;,1.4 加法器带进位的4位加法器方法1:用FOR-LOOP语句实现LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ADDER4 IS PORT (A,B:IN STD_LOGIC_VECTOR(3 DOWNTO 0); CIN:IN STD_LOGIC; SUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT:OUT STD_LOGIC);END ADDER4;ARCHITECTURE ART OF ADDER4ISSIGNAL C :STD_LOGIC_VECTOR(4 DOWNTO 0); BEGI
10、N PROCESS(A,B,CIN,C) BEGIN C(0)=CIN; FOR I IN 0 TO 3 LOOP -用FOR循环语句实现多位相加 SUM(I)=A(I) XOR B(I) XOR C(I); C(I+1) =(A(I) AND B(I) OR (C(I) AND (A(I) ) OR (C(I) AND B(I); END LOOP; COUT=C(4); -总的进位输出 END PROCESS;END ART;,方法2:直接使用加法“+”函数LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNE
11、D_ALL;ENTITY ADDER4_OP ISPORT ( A,B:IN STD_LOGIC_VECTOR(3 DOWNTO 0); CIN:IN STD_LOGIC; SUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); COUT:OUT STD_LOGIC);END ADDER4_OP;ARCHITECTURE ART OF ADDER4_OP ISSIGNAL C :STD_LOGIC_VECTOR(4 DOWNTO 0);SIGNAL AA,BB :STD_LOGIC_VECTOR(4 DOWNTO 0); BEGIN AAB时,YA=1;当A B) THEN
12、 YA =1; YB =0; YC =0; ELSIF(A B) THEN YA =0; YB =1; YC =0; ELSE YA =0; YB =0; YC Q Q Q Q = D; END CASE;END PROCESS;END RTL;,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MUX4TO1 ISPORT(A,B,C,D:IN STD_LOGIC; SEL:IN STD_LOGIC_VECTOR(1 DOWNTO 0); Q:OUT STD_LOGIC);END MUX4TO1;ARCHITECTURE RTL OF MUX4T
13、O1 ISBEGINWITH SEL SELECT Q = A WHEN 00“, B WHEN 01 , C WHEN 10 , D WHEN OTHERS;END RTL;,1.6 多路选择器 选择器常用于信号的切换,用IF语句、CASE语句、条件赋值语句、选择信号赋值语句都可以描述多路选择器。思考:用选择信号赋值语句如何进行描述?,1.7 总线驱动器设计 :单向总线驱动器设计 在微型计算机的总线驱动中经常要用单向总线缓冲器,它通常由多个三态门组成,用来驱动地址总线和控制总线。一个8位的单向总线缓冲器如图所示。,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.AL
14、L;ENTITY TR1_BUF8 ISPORT(DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0); EN:IN STD_LOGIC; DOUNT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);ARCHITECTURE ART OF TR1_BUF8 IS BEGIN PROCESS(EN,DIN) IF(EN=1)THEN DOUT=DIN; ELSE DOUT=ZZZZZZZZ; END IF; END PROCESS;END ART;,:双向总线缓冲器设计 双向总线缓冲器用于数据总线的驱动和缓冲,典型的双向总线缓冲器如图所示。图中的双向总线缓冲器
15、有两个数据输入输出端A和B,一个方向控制端DIR和一个选通端EN。 EN=0时双向缓冲器选通 DIR=0,则A=B(B送A) DIR=1,则B=A(A送B),LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BIDIR ISPORT(A,B:INOUT STD_LOGIC_VECTOR(7 DOWNTO 0); EN,DIR:IN STD_STD_LOGIC);END BIDIR;ARCHITECTURE ART OF BIDIR ISSIGNAL AOUT,BOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINPROCES
16、S(A,EN,DIR)BEGIN IF EN=0 AND DIR=1THEN BOUT=A; ELSE BOUTZZZZZZZZ; END IF ; B=BOUT;END PROCESS;PROCESS(B,EN,DIR)BEGIN IF EN=0 AND DIR=1 THEN AOUT=B; ELSE AOUTZZZZZZZZ; END IF ; A=AOUT;END PROCESS;END ART ;,2 时序逻辑电路设计 时序电路设计主要有 触发器 寄存器 计数器 分频器 序列信号发生器 序列信号检测器,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;E
17、NTITY DFF2 ISPORT(CLK,CD,SD,D:IN STD_LOGIC; Q,NOTQ:OUT STD_LOGIC);END DFF2;ARCHITECTURE RTL OF DFF2 ISBEGIN PROCESS(CLK,SD,CD)BEGIN IF CD=0 THEN Q=0; NOTQ=1;ELSIF SD=0 THEN Q=1; NOTQ=0;ELSIF CLKEVENT AND CLK=1 THEN Q=D;END IF;END PROCESS;END RTL;,2.1 D触发器的设计,设计如图所示的D触发器,2. 2 移位寄存器的设计 下面给出一个8位的移位寄存器,
18、其具有左移一位或右移一位、并行输入和同步复位的功能。,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY SHIFTER ISPORT( DATA:IN STD_LOGIC_VECTOR(7 DOWNTO 0); SHIFT_LEFT:IN STD_LOGIC; SHIFT_RIGHT:IN STD_LOGIC; RESET:IN STD_LOGIC; MODE:IN STD_LOGIC_VECTOR(1 DOWNTO 0); QOUT:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END SHIFTER;ARCHITECT
19、URE ART OF SHIFTER ISBEGINPROCESS BEGINWAIT UNTIL RISING_EDGE(CLK);IF RESET=1 THEN QOUTQOUTQOUTQOUTNULL; END CASE; END IF; END PROCESS; END ART;,2.3 计数器,例:模为60具有异步复位、同步置数功能的8421BCD码计数器,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Clock60 ISPORT(CI, RESET, LOAD, CLK
20、 :IN STD_LOGIC; D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); CO:OUT STD_LOGIC; Q10, Q1 :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END CNTM60;ARCHITECTURE ART OF CNTM60 IS SIGNAL QH, QL :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN CO=1 WHEN (QH=0101“ AND QL=1001“ AND CI=1) ELSE 0; -进位输出的产生,PROCESS(CLK,RESET)BEGINIF RESET=0 THEN
21、 QH=0000; QL=0000; -异步复位ELSIF CLKEVENT AND CLK=1 THEN -同步置数 IF LOAD=1 THEN QH=D(7 DOWNTO 4); Q L=D(3 DOWNTO 0); ELSIF CI=1 THEN -模60的实现 IF QL=9 THEN QL=0000; IF QH=5 THEN QH=0000; ELSE QH=QH+1; -计数功能的实现 END IF ELSE QL=QL+1; END IF; END IF; -END IF LOADEND IF;END PROCESS;Q10=QH;Q1=QL;END ART;,LIBRARY
22、 IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY FREDIVN ISPORT (CLK:IN STD_LOGIC; OUTCLK:OUT STD_LOGIC);END FREDIVN;ARCHITECTURE RTL OF FREDIVN ISCONSTANT N:INTEGER:=9;SIGNAL COUNT:INTEGER RANGE N DOWNTO 0;BEGINPROCESS(CLK)BEGIN IF(CLKEVENT AND CLK=1) THEN IF(COUNT=N-1)THEN
23、COUNT=0; ELSECOUNT=COUNT+1; IF COUNT(INTEGER(N/2) THEN OUTCLK=0;ELSE OUTCLK=1; END IF; END IF; END IF;END PROCESS; END RTL;,2.4 N分频器的设计,2.5 序列信号发生器,在数字信号的传输和数字系统的测试中,有时需要用到一组特定的串行数字信号,产生序列信号的电路称为序列信号发生器。 如产生 “01111110”序列的序列信号发生器(序列可任意) 该电路可由计数器与数据选择器构成,其VHDL描述如下:,LIBRARY IEEE; - “01111110”序列信号发生器USE
24、 IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SENQGEN IS PORT(CLK,CLR,CLK1:IN STD_LOGIC; -两个时钟信号 ZO:OUT STD_LOGIC);END SENQGEN;ARCHITECTURE ART OF SENQGEN ISSIGNAL COUNT:STD_LOGIC_VECTOR(2 DOWNTO 0); -序列发生器的关键是计数器,COUNT的宽度决定序列的长度,此为8位SIGNAL Z:STD_LOGIC :=0; -赋初值仅对仿真有用BEGIN PROCESS(
25、CLK,CLR) - 8进制计数器进程BEGIN IF CLR=1 THEN COUNT=000; ELSIF CLK=1AND CLKEVENT THEN IF COUNT=111“ THEN COUNT=000; -此处可不要 ELSE COUNTZZZZZZZZ=0;END CASE;END PROCESS;PROCESS(CLK1,Z) -消除毛刺的锁存器进程BEGIN IF CLK1EVENT AND CLK1=1 THEN ZO=Z; -把中间信号通过一个触发器寄存输出 END IF; END PROCESS;END ART;,LIBRARY IEEE;USE IEEE.STD_L
26、OGIC_1164.ALL;ENTITY DETECT_S IS PORT( DATAIN,CLK:IN STD_LOGIC; Q:OUT STD_LOGIC);END DETECT_S;ARCHITECTURE ART OF DETECT_S ISSIGNAL REG : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGINPROCESS(CLK)BEGINIF CLKEVENT AND CLK=1 THEN -第一个IF语句 REG(0)=DATAIN; -被检测数据打入第一个寄存器的0位 REG (7 DOWNTO 1)=REG (6 DOWNTO 0); -内部寄存器
27、进行向(左)高 位的移位操作END IF;IF REG=”01111110” THEN Q=1; 第二个IF语句是判断检测到”01111110” 序列时把标志置1 ELSE Q=0;END IF;END PROCESS;END ART; -也可设计一个状态机进行检测,2.6 序列信号检测器:检测”01111110”序列,3 状态机的VHDL设计,一般状态机结构框图,包含四个部分:1、说明部分2、主控时序进程3、主控组合进程4、辅助进程,设计一个状态机对序列数进行检测,当这一串序列数高位在前(左移)串行进入检测器后,若此数与预置的密码“11100101”数相同,则输出“A”,否则输出“B”。,L
28、IBRARY IEEE ;-单进程,符号化状态机USE IEEE.STD_LOGIC_1164.ALL;ENTITY schk_2 ISPORT(DIN,clk,clr:IN STD_LOGIC; -串行输入数据位/工作时钟/复位信号 AB:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -检测结果输出END schk_2;ARCHITECTURE behav OF schk_2 IS TYPE state IS (ST0,ST1,ST2,ST3,ST4,ST5,ST6,ST7,ST8); SIGNAL D : STD_LOGIC_VECTOR(7 DOWNTO 0); -
29、8位待检测预置数 SIGNAL C_ST : state;BEGIN D =11100101; -8位待检测预置数PROCESS( CLK, CLR,DIN ) BEGIN IF CLR = 1 THEN C_ST = ST0;AB IF DIN = D(7) THEN C_ST IF DIN = D(6) THEN C_ST IF DIN = D(5) THEN C_ST IF DIN = D(4) THEN C_ST IF DIN = D(3) THEN C_ST IF DIN = D(2) THEN C_ST IF DIN = D(1) THEN C_ST IF DIN = D(0) T
30、HEN C_ST AB C_ST= ST0;END CASE ;END IF ;END PROCESS ;END behav ;,LIBRARY IEEE ;-符号化状态机,双进程USE IEEE.STD_LOGIC_1164.ALL;ENTITY schk_2_p IS PORT(DIN,clk,clr:IN STD_LOGIC; -串行输入数据位/工作时钟/复位信号 AB:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); -检测结果输出END schk_2_p;ARCHITECTURE behav OF schk_2_p IS TYPE state IS (ST0,ST1
31、,ST2,ST3,ST4,ST5,ST6,ST7,ST8); SIGNAL D : STD_LOGIC_VECTOR(7 DOWNTO 0); -8位待检测预置数 SIGNAL C_ST,N_ST : state;BEGIN D IF DIN = D(7) THEN N_ST IF DIN = D(6) THEN N_ST IF DIN = D(5) THEN N_ST IF DIN = D(4) THEN N_ST IF DIN = D(3) THEN N_ST IF DIN = D(2) THEN N_ST IF DIN = D(1) THEN N_ST IF DIN = D(0) THE
32、N N_ST N_ST N_ST= ST0; AB = 1011; END CASE ; END PROCESS ;END behav ;,试写出如图所示状态机的VHDL程序,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY MOOREB ISPORT (CLK, RESET : IN STD_LOGIC; INA : IN STD_LOGIC_VECTOR (1 DOWNTO 0); OUTA : OUT STD_LOGIC_VECTOR (3 DOWNTO 0) );END MOOREB;ARCHITECTURE ONE OF MOOREB ISTYPE MS_STATE IS (ST0, ST1, ST2, ST3);SIGNAL C_ST, N_ST : MS_STATE;BEGINPROCESS (CLK, RESET)BEGIN IF RESET = 1 THEN C_ST IF INA = “00” THEN N_ST IF INA = “00” THEN N_ST IF INA = “11” THEN N_ST IF INA = “11” THEN N_ST N_ST = ST0;END CASE;END PROCESS;END ONE;,