数字电路的 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; 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 例:单向总线缓冲器 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<=not (g1 or g2); y<=a when en='1' else (others =>'Z'); end d; 双向总线控制 74x245 p.273 图 5-58 例: 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<=a when (g = '0') and (dir = '0') else "ZZZZZZZZ"; a<=b when (g = '0') and (dir = '1') else (others=>'Z'); end dfl; 注意:双向总线在功能仿真时的输入设置 a 和 b 的输入不要同时存在; 设置 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<= a when "00", b when "01", c when "10", d when "11", (others => '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(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<=a; when "01" => y<=b; when "10" => y<=c; when "11" => y<=d; when others => y<=(others =>'U'); end case; end process; end beh; 译码电路 二进制译码器 decoder 二进制译码器也称为“最小项发生器” ,其多位输出分别表 达输入的不同最小项,典型表达形式为: ii my = 这种表达形式采用数据流设计能够方便地实现 例 p.368 表 5-15 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; 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", "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" ; end d;