数字电路的Ⅴ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 y<=a when en='l'else(others=>Z) 双向总线控制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<=not (g1 or g2); y<=a when en='1' else (others =>'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 b<=a when(g=0)and(dir=0)else"ZZZZZZZZ a<=b when(g=0)and(dir='1")else(others=>Z) 注意:双向总线在功能仿真时的输入设置 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<=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的概 例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 y< a when"00 b when"O d when"11 (others=>U) 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<= a when "00", b when "01", c when "10", d when "11", (others => 'U') when others; end rtl; 采用行为设计中的 case 语句也可以很方便地设计 MUX: