数字电路的ⅤHDL设计 组合电路设计 基本门电路的设计(采用数据流设计) 基本门电路表达简单逻辑关系,采用简单的赋值语句就能方 便地实现:没有必要采用更复杂的结构。 反相器 y<= not a 4输入与非 y <=not(a0 and aland a2 and a3) 与或非 y <=not(al and a2)or( a3 and a4) 为了表达门电路的延迟时间,可以设置中间信号,利用 after语句表达延退时间;为了表达出上升时间和下降时间的 不同,可以采用条件赋值语句 例:3输入端异或门y=a④bc 参见p.417表 library ieee use ieeestd logic 1164.all; port(a, b, c: in std logic y: out std logic) end kxor 3
数字电路的 VHDL 设计 组合电路设计 基本门电路的设计(采用数据流设计 ) 基本门电路表达简单逻辑关系,采用简单的赋值语句就能方 便地实现;没有必要采用更复杂的结构。 反相器 y <= not a ; 4 输入与非 y <= not (a0 and a1and a2 and a3); 与或非 y <= not((a1 and a2) or( a3 and a4)); 为了表达门电路的延迟时间,可以设置中间信号,利用 after 语句表达延迟时间;为了表达出上升时间和下降时间的 不同,可以采用条件赋值语句: 例:3 输入端异或门 = ⊕ ⊕cbay 参见 p.417 表 5-46 library ieee; use ieee.std_logic_1164.all; entity kxor3 is port (a, b, c: in std_logic; y: out std_logic); end kxor3;
tecture rtl of kxor 3 is yl: std logic l<= a xor b xorc; y<= yl after 3 ns when yl=Ielse yl after 5 ns when y1=0 end rtI 要点:采用中间变量以推迟信号的赋值时间; 改变上述程序中的赋值语句可以构成各类基本门电路; 对基本门电路延迟时间的设计能够较真实地模拟电路信 号传输的实际情况,分析时序步骤的正确性,避免竞争冒险; 但此类语句对电路综合没有效果 基本组合功能电路 三态缓冲器(三态驱动器) 对数据总线的共享:每一时刻只有一个器件使 对于三态门的描述通常采用条件语句进行 例 4输入与非 y <=not(a0 and aland a2 and a3) 改为 yl < not(a0 and aland a2 and a3) y<=yl when en='1'else 'Z 单向总线控制74x541p.272图5-57
architecture rtl of kxor3 is signal y1: std_logic; begin y1<= a xor b xor c ; y<= y1 after 3 ns when y1='1' else y1 after 5 ns when y1='0' ; end rtl; 要点:采用中间变量以推迟信号的赋值时间; 改变上述程序中的赋值语句可以构成各类基本门电路; 对基本门电路延迟时间的设计能够较真实地模拟电路信 号传输的实际情况,分析时序步骤的正确性,避免竞争冒险; 但此类语句对电路综合没有效果; 基本组合功能电路 三态缓冲器(三态驱动器) 对数据总线的共享:每一时刻只有一个器件使能; 对于三态门的描述通常采用条件语句进行: 例: 4 输入与非 y <= not (a0 and a1and a2 and a3); 改为: y1 <= not (a0 and a1and a2 and a3); y<=y1 when en=’1’ else ’Z’ ; 单向总线控制 74x541 p.272 图 5-57
m 例:单向总线缓冲器 Ise ieee std logic 1164. all entity k74541 is port(a: in std logic vector(7 downto O) gl, g2: in std log y out std logic vector(7 downto O)) end k74541 yZ) 双向总线控制74x245p.273图5-58
例:单向总线缓冲器 library ieee; use ieee.std_logic_1164.all; entity k74541 is port(a:in std_logic_vector(7 downto 0); g1,g2:in std_logic; y:out std_logic_vector(7 downto 0)); end k74541; architecture d of k74541 is signal en:std_logic; begin en'Z'); end d; 双向总线控制 74x245 p.273 图 5-58
图5-598三态收发器74x245 (a)逻辑图(b)传统逻辑符号 例:74245双向总线缓冲器 use ieee std logic 1164. all entity k74245 is port(a, b: inout std logic vector(7 downto O); dir, g: in std logic); end K74245 architecture dfl of k74245 bZ) 注意:双向总线在功能仿真时的输入设置 a和b的输入不要同时存在;
例: 74245 双向总线缓冲器 library ieee; use ieee.std_logic_1164.all; entity k74245 is port(a,b:inout std_logic_vector(7 downto 0); dir,g:in std_logic); end k74245; architecture dfl of k74245 is begin b'Z'); end dfl; 注意:双向总线在功能仿真时的输入设置 a 和 b 的输入不要同时存在;
设置a的输入,应将b的输入设置为“ZZZZ”(高阻) 转换传输方向时,应该以双向阻塞作为间 数据选择器MUX 电路中控制数据流动最为常用的手段 根据控制量的数值由多路数据中选择一路输出; 数据流设计中的选择代入能够非常直观地表达MUX的概 例p410表5-428位 4路8位数据选择器的数据流设计-a[1…0] a[1··日 library ieee, use ieee std logic 1164. all; d[1··日 entity mux4in8b is port(s: in std logic vector(I downto 0); a, b, c, d in std logic vector(I to 8) y: out std logic vector( l to 8)); end mux 8b architecture rtl of mux4in8b is with s select yU) when 采用行为设计中的case语句也可以很方便地设计MUX
设置 a 的输入,应将 b 的输入设置为“ZZZZ”(高阻); 转换传输方向时,应该以双向阻塞作为间隔; 数据选择器 MUX 电路中控制数据流动最为常用的手段; 根据控制量的数值由多路数据中选择一路输出; 数据流设计中的选择代入能够非常直观地表达 MUX 的概 念; 例 p.410 表 5-428 位 4 路 8 位数据选择器的数据流设计 library ieee; use ieee.std_logic_1164.all; entity mux4in8b is port (s: in std_logic_vector(1 downto 0); a,b,c,d: in std_logic_vector(1 to 8); y: out std_logic_vector( 1 to 8)); end mux4in8b; architecture rtl of mux4in8b is begin with s select y 'U') when others; end rtl; 采用行为设计中的 case 语句也可以很方便地设计 MUX:
例p.410表5-43 8位4路数据选择器的行为设计 library ieee, use ieee std logic 1164.all entity mux4in8p is port(s: in std logic vector(I downto 0 or(I to 8) y: out std logic vector( l to 8)); end mux insp architecture beh of mux4in8p is process(s, a, b, c, d) when"00"→>yyU) end beh 译码电路 二进制译码器 decoder 二进制译码器也称为“最小项发生器”,其多位输出分别表 达输入的不同最小项,典型表达形式为:y2=m 这种表达形式采用数据流设计能够方便地实现 例p368表5-15
例 p.410 表 5-43 8 位 4 路数据选择器的行为设计 library ieee; use ieee.std_logic_1164.all; entity mux4in8p is port (s: in std_logic_vector(1 downto 0); a,b,c,d: in std_logic_vector(1 to 8); y: out std_logic_vector( 1 to 8)); end mux4in8p; architecture beh of mux4in8p is begin process(s,a,b,c,d) begin case s is when "00" => y y y y y'U'); end case; end process; end beh; 译码电路 二进制译码器 decoder 二进制译码器也称为“最小项发生器”,其多位输出分别表 达输入的不同最小项,典型表达形式为: = my ii 这种表达形式采用数据流设计能够方便地实现 例 p.368 表 5-15
38译码器74138:反函数输出采用选择代入语句实现 图5-3774x1383-8译码器 逻图(包括标准16脚双列直插式封装的引脚编号)(b)传统逻辑符号 library ieee use ieee std logic 1164.all entity v74x138 is port(gl, gal, g2bl: in std logic a: in std logic vector(2 downto O) yl: out std logic vector( 0 to 7)) end v74x138 architecture rtl of v74x138 is signal yli std logic vector(0 to 7); with a select yli<= o111lll1" when 000 "10111111 when "001 "11011111" when 010 11101111 when01l 11110111"when"100 "11111011"when "101" "11111101" when"110" "11111110"when "1ll" 11111111"when others
3-8 译码器 74138 :反函数输出 采用选择代入语句实现 library ieee; use ieee.std_logic_1164.all; entity v74x138 is port (g1,g2al,g2bl: in std_logic; a: in std_logic_vector(2 downto 0); yl: out std_logic_vector( 0 to 7)); end v74x138; architecture rtl of v74x138 is signal yli:std_logic_vector(0 to 7); begin with a select yli<= "01111111" when "000", "10111111" when "001", "11011111" when "010", "11101111" when "011", "11110111" when "100", "11111011" when "101", "11111101" when "110", "11111110" when "111", "11111111" when others;
I<=yLi when (gl and not g2al and not g2bl)-1 end 将上述程序稍加改动可以得到二进制-十进制译码器设计; 二进制译码器也可以采用其他设计方式实现: 在54.7节中展示了多种设计程序; 码制转换电路 该类电路为多路输入/多路输出,将输入的编码转换为对应 的输出的编码;上述二进制译码器的数据流设计方式可以推 广到各类码制转换电路的设计中; 例: BCD-Excess3(余3码)的转换p49表29 要求:输入4位BCD码,输出4位余3码(正函数) KBCD EX3 aa.1yta· library ieee use ieee std logic 1164. all; entity kbcd ex3 is port(a: in std logic vector(3 downto 0); y: out std logic vector(3 downto O)) end kbcd ex3 architecture rtl of kbcd ex3 is with a select y<= 0111" when "0000""0100"when 0001 0101"".0110" when"0011
yl<=yLi when (g1 and not g2al and not g2bl)='1' else "11111111"; end rtl; 将上述程序稍加改动可以得到二进制-十进制译码器设计; 二进制译码器也可以采用其他设计方式实现: 在 5.4.7 节中展示了多种设计程序; 码制转换电路 该类电路为多路输入/多路输出,将输入的编码转换为对应 的输出的编码;上述二进制译码器的数据流设计方式可以推 广到各类码制转换电路的设计中; 例:BCD—Excess-3(余 3 码)的转换 p.49 表 2-9 要求:输入 4 位 BCD 码,输出 4 位余 3 码(正函数) library ieee; use ieee.std_logic_1164.all; entity kbcd_ex3 is port (a: in std_logic_vector(3 downto 0); y: out std_logic_vector(3 downto 0)); end kbcd_ex3; architecture rtl of kbcd_ex3 is begin with a select y<= "0111" when "0000", "0100" when "0001", "0101" when "0010", "0110" when "0011
"olll"when"0100","1000"when"0101", 1001"when0110""1010" when0111 "10ll"when"l000°,"1100"when"1001", 1111"when others end rtl BCD码七段静态LED译码器 输入4位BCD码,产生7个输出,分别驱动相应显示器件; p26l图5-44 考虑7段输出与数字的对应关系,可以得出如下关系 abcdefg 0:11111101:01100002:11011013:1111001 BCDSEG7 data[3.01 6·· library ieee use ieee std logic 1164.all port( data: in std logic vector(3 downto 0); y: out std logic vector(6 downto O)); end bcdseg7 architecture d of bcdseg7 is y<="lllo” when data="0000°else " 0110000" when data=0001"else 1101101" when data=0010"else 1111001"when data="0011"else
"0111" when "0100", "1000" when "0101", "1001" when "0110", "1010" when "0111", "1011" when "1000", "1100" when "1001", "1111" when others; end rtl; BCD 码-七段静态 LED 译码器 输入 4 位 BCD 码,产生 7 个输出,分别驱动相应显示器件; p.261 图 5-44 考虑 7 段输出与数字的对应关系,可以得出如下关系: abcdefg 0: 1111110 1: 0110000 2:1101101 3:1111001 library ieee; use ieee.std_logic_1164.all; entity bcdseg7 is port(data: in std_logic_vector(3 downto 0); y: out std_logic_vector(6 downto 0)); end bcdseg7; architecture d of bcdseg7 is begin y<="1111110" when data="0000" else "0110000" when data="0001" else "1101101" when data="0010" else "1111001" when data="0011" else
0110011"when data=0100"else 1011011"when data=0101"else 0011111" when data=0110"else 1110000"when data=0111" else 1111111" when data="1000"else 1110011"when data="1001"else "0000000°; d d
"0110011" when data="0100" else "1011011" when data="0101" else "0011111" when data="0110" else "1110000" when data="0111" else "1111111" when data="1000" else "1110011" when data="1001" else "0000000" ; end d;