250 likes | 447 Views
组合逻辑电路设计. 将重心放在 VHDL 语言的实际运用上。将由一些实际的电路设计范例,说明如何使用 VHDL 语言,来设计一些经常会使用到的组合逻辑电路。. 译码器与编码器设计 多任务器与解多任务器设计 数码转换电路设计 比较器设计 算数运算电路设计 只读存储器( ROM )设计 三态门接口设计. 译码器与编码器设计. 译码器设计 A 、译码器是把输入的数码解出其对应的数码,如果有 N 个二进制选择线,则最多可译码转换成 2 ⁿ 个数据。 B 、 N 条输入线及 M 条输出线时,称为 N×M 的译码器。 C 、常应用在地址总线或用作电路的控制线。.
E N D
将重心放在VHDL语言的实际运用上。将由一些实际的电路设计范例,说明如何使用VHDL语言,来设计一些经常会使用到的组合逻辑电路。将重心放在VHDL语言的实际运用上。将由一些实际的电路设计范例,说明如何使用VHDL语言,来设计一些经常会使用到的组合逻辑电路。 • 译码器与编码器设计 • 多任务器与解多任务器设计 • 数码转换电路设计 • 比较器设计 • 算数运算电路设计 • 只读存储器(ROM)设计 • 三态门接口设计
译码器与编码器设计 • 译码器设计 A、译码器是把输入的数码解出其对应的数码,如果有N个二进制选择线,则最多可译码转换成2ⁿ个数据。 B、N条输入线及M条输出线时,称为N×M的译码器。 C、常应用在地址总线或用作电路的控制线。
3到8线 解码器 Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7 A0 A1 A2 EN ENTITY Dec3_8 IS PORT (A : IN STD_LOGIC_VECTOR( 2 DOWNTO 0) ; EN : IN STD_LOGIC ; Y : OUT STD_LOGIC_VECTOR( 7 DOWNTO 0)) ; END Dec3_8 ; ARCHITECTURE BEHAVE OF Dec3_8 IS SIGNAL SEL : STD_LOGIC_VECTOR( 3 DOWNTO 0) ; BEGIN SEL(0) <= EN ; SEL(1) <= A(0) ; SEL(2) <= A(1) ; SEL(3) <= A(2) ; WITH SEL SELECT Y<= "00000001" WHEN "0001", "00000010" WHEN "0011", "00000100" WHEN "0101", "00001000" WHEN "0111", "00010000" WHEN "1001", "00100000" WHEN "1011", "01000000" WHEN "1101", "10000000" WHEN "1111", "11111111" WHEN OTHERS ; END BEHAVE ; • 说明: 1、将EN和A合并成序列的另一写法:SEL<=A&EN; 2、whit….select是平行语句,与其功能相同,属顺序语句的是Case….when。 3、将EN融入选择线的用法更为实用。
编码器设计 A、编码器是将2ⁿ个分离的信息代码以N个二进码来表示。 B、N条输入线及M条输出线时,称为N×M的编码器。 C、常运用于影音压缩或通信方面,以达到精简传输量的目的。编译器可看成压缩电路,译码器可看成解压电路。
Y2 Y1 Y0 A7 A6 A5 A4 A3 A2 A1 A0 8到3线 解码器 ENTITY Endec8_3 IS PORT (A : IN STD_LOGIC_VECTOR(7 DOWNTO 0) ; EN : IN STD_LOGIC ; Y : OUT STD_LOGIC_VECTOR( 2 DOWNTO 0)) ; END Endec8_3 ; ARCHITECTURE BEHAVE OF Endec8_3 IS SIGNAL SEL : STD_LOGIC_VECTOR( 8 DOWNTO 0) ; BEGIN SEL <= EN & A ; WITH SEL SELECT Y<= "000" WHEN "100000001" , "001" WHEN "100000010" , "010" WHEN "100000100" , "011" WHEN "100001000" , "100" WHEN "100010000" , "101" WHEN "100100000" , "110" WHEN "101000000" , "111" WHEN "110000000" , "000" WHEN OTHERS ; END BEHAVE ; • 说明 也可利用卡诺图化简,得布尔方程式: Y2 = A7 + A7 + A5 +A4; Y1 = A7 + A6 + A3 +A2; Y0 = A7 + A5 + A3 +A1;
多任务器与解多任务器 • 多任务器设计 A、多任务器可以从多组数据来源中选取一组送入目的地。也称为数据选择器。 B、多任务器的结构是2ⁿ个输入线,会有N个地址选择线及1个输出线配合。 C、应用范围很广,组合逻辑的执行,数据路径的选择,通信中的传输系统,扫描电路等。
A B Z C D S0 S1 LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; USE IEEE.STD_LOGIC_ARITH.ALL ; USE IEEE.STD_LOGIC_UNSIGNED.ALL ; ENTITY Conc IS PORT (A, B, C, D : IN STD_LOGIC_VECTOR( 3 DOWNTO 0) ; S : IN STD_LOGIC_VECTOR( 1 DOWNTO 0) ; Z : OUT STD_LOGIC_VECTOR( 3 DOWNTO 0 ) ) ; END Conc ; ARCHITECTURE BEHAVE OF Conc IS BEGIN Z<= A WHEN S="00" ELSE B WHEN S="01" ELSE C WHEN S="10" ELSE D WHEN S="11" ELSE "0000" ; END BEHAVE ; • 说明: 1、多任务器本质上是一个电子开关;
解多任务器设计 A、解多任务器将一组输入信号按照地址选择线指定的方式,传送到被选定的一组输出上。 B、多任务器的结构是1个输入线, N个地址选择线及2ⁿ个输出线。 ENTITY demux4 IS PORT (Z : IN STD_LOGIC_VECTOR( 3 DOWNTO 0) ; S : IN STD_LOGIC_VECTOR( 1 DOWNTO 0) ; A, B, C, D : OUT STD_LOGIC_VECTOR( 3 DOWNTO 0 ) ) ; END demux4; ARCHITECTURE behave OF demux4 IS BEGIN PROCESS (Z,S) BEGIN A <= "0000" ; B <= "0000" ; C <= "0000" ; D <= "0000" ; CASE S IS WHEN "00" => A <= Z ; WHEN "01" => B <= Z ; WHEN "10" => C <= Z ; WHEN OTHERS => D <= Z ; END CASE ; END PROCESS ; END behave ; A B IN C D S0 S1
数码转换电路设计 • 数码转换电路设计 数字逻辑电路的内部,大多采用二进制或十六进制的数字类型,但日常生活才一般采用十进制。 两种常见的数码转换电路:二进制转十进制,BCD码转成七段显示器码。
ENTITY CH4_3_1 IS PORT( A : IN UNSIGNED( 3 downto 0 ) ; BCD0, BCD1 : OUT STD_LOGIC_VECTOR( 3 DOWNTO 0) ; SEVEN0 , SEVEN1 : out STD_LOGIC_VECTOR( 6 downto 0 ) ) ; END CH4_3_1 ; ARCHITECTURE A OF CH4_3_1 IS SIGNAL XC : STD_LOGIC_VECTOR( 3 DOWNTO 0) ; BEGIN PROCESS (A) BEGIN IF A<10 THEN BCD1 <= "0000" ; BCD0<=STD_LOGIC_VECTOR(A) ; SEVEN1 <= "0111111" ; XC<=STD_LOGIC_VECTOR(A) ; ELSE BCD1 <= "0001" ; BCD0 <= A-10 ; SEVEN1 <= "0000110" ; XC <= STD_LOGIC_VECTOR(A)-10 ; END IF ; END PROCESS ;
SEVEN_SEGMENT : BLOCK BEGIN SEVEN0 <= "0111111" WHEN XC= "0000" ELSE --0 "0000110" WHEN XC= "0001" ELSE --1 "1011011" WHEN XC= "0010" ELSE --2 "1001111" WHEN XC= "0011" ELSE --3 "1100110" WHEN XC= "0100" ELSE --4 "1101101" WHEN XC= "0101" ELSE --5 "1111101" WHEN XC= "0110" ELSE --6 "0000111" WHEN XC= "0111" ELSE --7 "1111111" WHEN XC= "1000" ELSE --8 "1101111" WHEN XC= "1001" ELSE --9 "0000000" ; END BLOCK SEVEN_SEGMENT ; END A ;
八位比较器的设计 输入信号: A,B:皆为八位信号 CLK:时钟脉冲输入 RST:清除控制。 输出信号: AGTB:当A>B,值为1,否则为0; AEQB:当A=B,值为1,否则为0; ALTB:当A<B,值为1,否则为0; 例子1: Architecture B of Comp1 is Begin Process(Rst,Clk) Begin If A>B then AGTB<=‘1’; Elsif A=B then AEQB<=‘1’; Else ALTB<=‘1’; End if; End process; End B; 例子2: Architecture A of Comp1 is Begin AGTB<=‘1’ When A>B else ‘0’; AEQB<=‘1’ When A=B else ‘0’; ALTB<=‘1’ When A<B else ‘0’; End A;
ENTITY Comp2 IS PORT ( A: IN STD_LOGIC_VECTOR(7 DOWNTO 0); B: IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK: IN STD_LOGIC; RST: IN STD_LOGIC; AGTB: OUT STD_LOGIC; ALTB: OUT STD_LOGIC; AEQB: OUT STD_LOGIC); END Comp2; ARCHITECTURE arch OF Comp2 IS BEGIN PROCESS (RST,CLK) BEGIN IF RST = '1' THEN AGTB <= '0'; AEQB <= '0'; ALTB <= '0'; ELSIF CLK'EVENT AND CLK = '1' THEN IF A > B THEN AGTB <= '1'; AEQB <= '0'; ALTB <= '0'; ELSIF a = b THEN AGTB <= '0'; AEQB <= '1'; ALTB <= '0'; else AGTB <= '0'; AEQB <= '0'; ALTB <= '1'; END IF; END IF; END PROCESS; END ARCH ;
算数运算电路设计 • VHDL所处理的信号不外乎是逻辑信号和数值信号。在VHDL的算术运算中,及内定的数据类型为整数或浮点数,需要作运算的是数值信号,但是执行运算的电路,却要求使用标准逻辑类信号。 • 在执行加法或乘法运算,可能会有进位产生,需加于处理 Entity Adder Is Port( data1,data2: IN Unsigned(3 downto 0); sum: Out Std_logic_vector(3 downto 0)); End adder; Architecture arch of adder is Begin sum <= data1 + data2; End arch; 说明: 原来的VHDL中,逻辑信号和数值信号是不能互换。 新的VHDL标准加入Unsigned数据类型,可转换成逻辑信号。
entity Adder is port ( A : in UNSIGNED (3 downto 0); B : in UNSIGNED (3 downto 0); Cin : in STD_LOGIC ; BCDout : out STD_LOGIC_VECTOR (3 downto 0) ; Cout : out STD_LOGIC ); end Adder ; --********************************************************* architecture ARCH of adder is SIGNAL Y,C: STD_LOGIC_VECTOR (3 downto 0) ; begin Y(0) <= A(0) XOR B(0) XOR Cin ; Y(1) <= A(1) XOR B(1) XOR C(0) ; Y(2) <= A(2) XOR B(2) XOR C(1) ; Y(3) <= A(3) XOR B(3) XOR C(2) ; C(0) <= (Cin AND A(0)) OR (Cin AND B(0)) OR (A(0) AND B(0)); C(1) <= (C(0) AND A(1)) OR (C(0) AND B(1)) OR (A(1) AND B(1)); C(2) <= (C(1) AND A(2)) OR (C(1) AND B(2)) OR (A(2) AND B(2)); C(3) <= (C(2) AND A(3)) OR (C(2) AND B(3)) OR (A(3) AND B(3)); BCDout <= Y(3) & Y(2) & Y(1) & Y(0) ; Cout <= C(3) ; end ARCH ;
只读存储器(ROM)设计 • 常用记忆芯片有两种:RAM(存储会变动的数据、参数等)及ROM(不变的数据或常数表)。 ROM 4位地址选择线 8位数据总线输出 使能
ENTITY Rom4_8 is PORT( DATAOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); ADDR : IN STD_LOGIC_VECTOR(3 DOWNTO 0); CE : IN STD_LOGIC ); END Rom4_8; ARCHITECTURE a OF Rom4_8 IS BEGIN DATAOUT <= "00001001" WHEN ADDR = "0000" AND CE='0' ELSE "00011010" WHEN ADDR = "0001" AND CE='0' ELSE "00011011" WHEN ADDR = "0010" AND CE='0' ELSE "00101100" WHEN ADDR = "0011" AND CE='0' ELSE "11100000" WHEN ADDR = "0100" AND CE='0' ELSE "11110000" WHEN ADDR = "0101" AND CE='0' ELSE "00010000" WHEN ADDR = "1001" AND CE='0' ELSE "00010100" WHEN ADDR = "1010" AND CE='0' ELSE "00011000" WHEN ADDR = "1011" AND CE='0' ELSE "00100000" WHEN ADDR = "1100" AND CE='0' ELSE “00000000"; End a; • 设计ram或rom,如在max+plus平台上尽量多使用LPM
三态缓冲器的设计 • Entity CH47 is • Port( A : IN Std_logic; • OE : IN Std_logic; • B : Out Std_logic ); • End CH47; • Architecture one of CH47 is • Begin • Process(OE,A) • Begin • If OE=‘1’ then • B <= A; • ELSE • B <= ‘Z’; • End if; • End process; • End architecture one; • 在所定义的数据类型STD_LOGIC,其中有个“Z”,用来表示高阻抗(High impedance)。 A B OE
四位ALU(算术逻辑单元)电路设计 • ALU是一个拥有算术运算和逻辑运算能力的电路。通常如果有N条功能选择线,则ALU最多可设定2ⁿ种不同的运算功能。 • 算术运算单元的功能 ALU的算术运算主要是以加、减法为主,乘法和除法可利用“移位”配合“加法”的方法加以处理。
逻辑运算单元的功能 逻辑运算的种类很多,一般只处理And、Or、Xor、Not四种运算。其它的各种逻辑运算都可以由布尔代数化简,由上面四种运算完成。 C0 算术电路单元 A B 2×1 多工器 输出 逻辑电路单元 S0 S1 S2
算术运算单元 • 使用VHDL设计电路,一定面对两个问题 • Entity如何定义 管脚上的输出端口、输入端口的规格? • 采用何种结构描述法来描述电路的设计 根据目前手上拥有的数据,已经考虑维护及扩充时的弹性等各项因素进行选择。
如果有流程图或真值表等数据时,通常选用行为化描述法来写VHDL程序较为方便容易;如果有流程图或真值表等数据时,通常选用行为化描述法来写VHDL程序较为方便容易; • 如果有布尔方程式时,则选用数据流描述法来写VHDL程序最为快速且简洁。 • 当电路规模较大且大部分的模块电路已经设计过,则选用结构性描述法写VHDL程序较为容易省事。 算术运算单元的Entity定义 注:当对象有逻辑特性又有数值特性时,应定义为Unsigned较恰当。
算术单元的Architecture描述 由于是做运算处理,当然处理的对象一定是算术式或布尔方程式,因此使用数据流描述法应较为快速方便。 算术单元的设计 主要采用Case….When语句。
逻辑运算单元 • 算术运算单元的Entity定义 • 算术运算单元的Architecture描述 由于是逻辑运算,使用的是布尔代数或标准逻辑门,在VHDL内部得数据库中已经建立完成,所以直接采取数据流来完成