第 3 章 vhdl 硬件描述语言 ( 一 )
DESCRIPTION
第 3 章 VHDL 硬件描述语言 ( 一 ). VHDL:V ery high speed integrated H ardware D escription L anguage Why does VHDL counts? VHDL is what you write is what functional you get - PowerPoint PPT PresentationTRANSCRIPT
YANGTZE NORMAL UNIVERSITY
第 3 章 VHDL硬件描述语言( 一 )
YANGTZE NORMAL UNIVERSITY
VHDL:Very high speed integrated Hardware Description Language
Why does VHDL counts? VHDL is what you write is what functional you get
“ tell me how your circuit should behave and the VHDL compiler will give you the hardware that does the job”,but the designer can not control how the circuit implement;
VHDL is a portable language because the same code can be applied to Device manufactured by Company A or Company B ;
Easy to Modify.
Graphic is what you draw is what you get“ tell me what hardware you want and I will give it to
you”
YANGTZE NORMAL UNIVERSITY
Such as Multiplexer, Latch Adder Counter
and more…
Let’s get started with some examples
YANGTZE NORMAL UNIVERSITY
【例 3-1】ENTITY mux21a IS PORT( a, b : IN BIT ; s : IN BIT; y : OUT BIT ) ;END ENTITY mux21a ;
ARCHITECTURE one OF mux21a IS BEGIN y <= a WHEN s = '0' ELSE b ;END ARCHITECTURE one ;
3.1.1 2 选 1 多路选择器的 VHDL描述
3.1 多路选择器 VHDL 描述
图 3-1 mux21a 实体
图 3-2 mux21a 结构体
实体
结构体
YANGTZE NORMAL UNIVERSITY
3.1.1 2 选 1 多路选择器的 VHDL 描述【例 3-2】
ENTITY mux21a IS PORT ( a, b : IN BIT; s : IN BIT; y : OUT BIT ); END ENTITY mux21a;ARCHITECTURE one OF mux21a IS SIGNAL d,e : BIT; BEGINd <= a AND (NOT S) ;e <= b AND s ;y <= d OR e ; END ARCHITECTURE one ;
【例 3-3】 ENTITY mux21a IS PORT ( a, b, s: IN BIT; y : OUT BIT );END ENTITY mux21a;ARCHITECTURE one OF mux21a
IS BEGIN PROCESS (a,b,s) BEGIN IF s = '0' THEN y <= a ; ELSE y <= b ; END IF; END PROCESS;END ARCHITECTURE one ;
YANGTZE NORMAL UNIVERSITY
3.1.1 2 选 1 多路选择器的 VHDL 描述
图 3-3 mux21a 功能时序波形
YANGTZE NORMAL UNIVERSITY
3.1.2 VHDL 相关语句说明
1. 实体表达 【例 3-3】ENTITY e_name IS PORT ( p_name : port_m data_type; ... p_namei : port_mi data_type );END ENTITY e_name;
或:
【例 3-6】ENTITY e_name IS PORT ( p_name : port_m data_type; ... p_namei : port_mi data_type );END e_name;
YANGTZE NORMAL UNIVERSITY
3.1.2 VHDL 相关语句说明
2. 实体名 :如用 counter4b,adder8b。不用or2,and2等。3. PORT语句和端口信号名4. 端口模式
INOUT INOUT BUFFER
5. 数据类型 BIT(如 INTEGER BOOLEAN STD_LOGIC BIT等)
YANGTZE NORMAL UNIVERSITY
3.1.2 VHDL 相关语句说明
6. 结构体表达 【例 3-7】ARCHITECTURE arch_name OF e_name IS ( 说明语句 )BEGIN ( 功能描述语句 )END ARCHITECTURE arch_name ;或:【例 3-8】ARCHITECTURE arch_name OF e_name IS ( 说明语句 )BEGIN ( 功能描述语句 )END arch_name ;
上下两式的区别是 IEEE93/87 标准不同。前者为IEEE VHDL’93 标准、后者是 IEEE VHDL’87 标准。
YANGTZE NORMAL UNIVERSITY
7. 信号传输 (赋值 )符号和数据比较符号
3.1.2 VHDL 相关语句说明
【例 3-1】ENTITY mux21a IS PORT( a, b : IN BIT ; s : IN BIT; y : OUT BIT ) ;END ENTITY mux21a ;
ARCHITECTURE one OF mux21a IS BEGIN y <= a WHEN s = '0' ELSE b ;END ARCHITECTURE one ;
s = ‘0’ 中“ =” 没有赋值的含义,只是一种数据比较符号。 boolean 类型,取值分别是: true和false 。
YANGTZE NORMAL UNIVERSITY
3.1.2 VHDL 相关语句说明
8. 逻辑操作符AND、 OR、 NOT9. IF_THEN条件语句
【例 3-4】 ENTITY mux21a IS PORT ( a, b, s: IN BIT; y : OUT BIT );END ENTITY mux21a;ARCHITECTURE one OF mux21a IS BEGIN PROCESS (a,b,s) BEGIN IF s = '0' THEN y <= a ; ELSE y <= b ;END IF; END PROCESS;END ARCHITECTURE one ;
YANGTZE NORMAL UNIVERSITY
3.1.2 VHDL 相关语句说明
10. WHEN_ELSE条件信号赋值语句
赋值目标 <= 表达式 WHEN 赋值条件 ELSE 表达式 WHEN 赋值条件 ELSE ... 表达式 ;
Z <= a WHEN p1 = ‘1’ ELSE b WHEN p2 = ‘1’ ELSE c ;
YANGTZE NORMAL UNIVERSITY
11. PROCESS进程语句和顺序语句
12. 文件取名和存盘
3.1.2 VHDL 相关语句说明
【例 3-4】 ENTITY mux21a IS PORT ( a, b, s: IN BIT; y : OUT BIT );END ENTITY mux21a;ARCHITECTURE one OF mux21a IS BEGIN PROCESS (a,b,s) BEGIN IF s = '0' THEN y <= a ; ELSE y <= b ;END IF; END PROCESS;END ARCHITECTURE one ;
YANGTZE NORMAL UNIVERSITY
3.1.3 VHDL 设计的基本概念和语句小节
数据类型数据类型 信号赋值符信号赋值符 条件比较符条件比较符 延时 延时
实体实体 结构体结构体 端口定义端口定义 端口模式端口模式
逻辑操作符逻辑操作符 IF条件语句IF条件语句 并行条件语句并行条件语句 进程语句进程语句
顺序语句顺序语句 并行语句并行语句 文件取名文件取名 文件存盘文件存盘
YANGTZE NORMAL UNIVERSITY3.2 寄存器描述及其 VHDL 语言现象3.2.1 D 触发器的 VHDL 描述
【例 3-9】LIBRARY IEEE ;USE IEEE.STD_LOGIC_1164.ALL ; ENTITY DFF1 IS PORT (CLK : IN STD_LOGIC ; D : IN STD_LOGIC ; Q : OUT STD_LOGIC ); END ; ARCHITECTURE bhv OF DFF1 IS
SIGNAL Q1 : STD_LOGIC ; -- 类似于在芯片内部定义一个数据的暂存节点 BEGIN PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q1 <= D ; END IF; Q <= Q1 ; -- 将内部的暂存数据向端口输出 END PROCESS ; END bhv;
D 触发器
YANGTZE NORMAL UNIVERSITY比较用 3 种不同语句的 D 触发器 VHDL 程
序Entity test1 isport (clk, d : in bit; q : out bit);end test1;architecture body of test1 issignal q1 : bit ;beginprocess (clk)begin if clk='1' AND clk’last_value='0' then q1 <= d; end if; q <= q1 ;end process;end test1_body;
LIBRARY IEEE;USE IEEE.std_logic_1164.all;Entity test1 isport (clk, d : in bit; q : out bit);end test1;architecture body of test1 isbeginprocess (clk,d)begin if rising_edge(clk) then q <= d; end if;end process;end test1_body;
Entity test1 isport (clk : in bit; d : in bit; q : out bit);end test1;architecture body of test1 issignal q1 : bit ;beginprocess (clk, d)begin if (clk = ‘1’) then q1 <= d; end if; q <= q1 ;end process;end body;
Entity test1 isport (clk : in bit; d : in bit; q : out bit);end test1;architecture body of test1 issignal q1 : bit ;beginprocess (clk)begin if (clk = ‘1’) then q1 <= d; end if; q <= q1 ;end process;end body;
YANGTZE NORMAL UNIVERSITY
How Many Registers?ENTITY reg1 IS
PORT ( d : in BIT;clk : in BIT;q : out BIT);
END reg1;
ARCHITECTURE reg1 OF reg1 ISSIGNAL a, b : BIT;BEGIN
PROCESS (clk)BEGINIF clk='1' AND clk’event THEN
a <= d;b <= a;q <= b;
END IF;END PROCESS;
END reg1;
YANGTZE NORMAL UNIVERSITY
YANGTZE NORMAL UNIVERSITY
How Many Registers?ENTITY reg1 IS
PORT ( d : in BIT;clk : in BIT;q : out BIT);
END reg1;
ARCHITECTURE reg1 OF reg1 ISBEGIN
PROCESS (clk)VARIABLE a, b : BIT;BEGINIF clk='1' AND clk’event THEN
a := d;b := a;q <= b;
END IF;END PROCESS;
END reg1;
YANGTZE NORMAL UNIVERSITY用 VHDL 设计 4 位计数器
A
B
0
10
1
0 1
0
1
取整数数据类型,为什么?取整数数据类型,为什么?
整数取值范围整数取值范围
端口信号模式取BUFFER ,为什么?
端口信号模式取BUFFER ,为什么?
注意整数和位的不同表达方式!注意整数和位的不同表达方式!
YANGTZE NORMAL UNIVERSITY修改后的程序
运算符加载
注意,信号端口模式和数据类型的改变!
注意,信号端口模式和数据类型的改变!
注意,引进内部信号矢量!
注意,引进内部信号矢量!
YANGTZE NORMAL UNIVERSITY
4 位锁存器组合电路加 1 器
锁存信号
输出反馈
YANGTZE NORMAL UNIVERSITY用 VHDL 设计 7 段 16 进制译码器
用 CASE 语句完成真值表的功能
向 7 段数码管输出信号,最高位控制小数点
YANGTZE NORMAL UNIVERSITY
注意,此语句必须加入注意,此语句必须加入
4 位加法计数器
4 位加法计数器
7 段译码器7 段译码器
8 位总线输出8 位总线输出信号输出
信号输出
YANGTZE NORMAL UNIVERSITY
3.2.2 D 触发器 VHDL 描述的语言现象说明
1. 标准逻辑位数据类型 STD_LOGIC
BIT 数 据 类 型 定 义 : TYPE BIT IS('0','1');
STD_LOGIC 数据类型定义:TYPE STD_LOGIC IS ('U','X','0','1','Z','W','L','H','-');
STD_LOGIC 所定义的 9 种数据的含义是:
‘U’ 表示未初始化的; ‘ X’ 表示强未知的; ‘ 0’ 表示强逻辑0; ‘ 1’ 表示强逻辑 1; ‘ Z’ 表示高阻态; ‘ W’ 表示弱未知的; ‘ L’ 表示弱逻辑 0; ‘ H’ 表示弱逻辑 1; ‘ -’ 表示忽略。
YANGTZE NORMAL UNIVERSITY
3.2.2 D 触发器 VHDL 描述的语言现象说明
2. 设计库和标准程序包
3. SIGNAL信号定义和数据对象 【例 3-10】
ARCHITECTURE bhv OF DFF1 IS BEGIN PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK = '1' THEN Q <= D ; END IF; END PROCESS ;END ;
使用库和程序包的一般定义表式是: LIBRARY <设计库名 >; USE < 设计库名 >.< 程序包名 >.ALL ;
SIGNAL Q1 : STD_LOGIC
YANGTZE NORMAL UNIVERSITY
3.2.2 D 触发器 VHDL 描述的语言现象说明
4. 上升沿检测表式和信号属性函数 EVENT
关键词 EVENT 是信号属性, VHDL 通过以下表式来测定某信号的跳变边沿: <信号名 >'EVENT
CLK'EVENT AND CLK = '1'
短语“ CLK’EVENT ” 就是对 CLK 标识符的信号在当前的一个极小的时间段 δ 内发生事件的情况进行检测。
YANGTZE NORMAL UNIVERSITY
3. 不完整条件语句与时序电路
【例 3-11】ENTITY COMP_BAD IS PORT( a1 : IN BIT; b1 : IN BIT; q1 : OUT BIT ); END ; ARCHITECTURE one OF COMP_BAD IS BEGIN PROCESS (a1,b1) BEGIN IF a1 > b1 THEN q1 <= '1' ; ELSIF a1 < b1 THEN q1 <= '0' ;-- 未提及当 a1=b1 时, q1 作何操
作END IF; END PROCESS ;END ;
3.2.2 D 触发器 VHDL 描述的语言现象说明
YANGTZE NORMAL UNIVERSITY
3. 不完整条件语句与时序电路
图 3-3 例 3-11 的电路图
YANGTZE NORMAL UNIVERSITY3. 不完整条件语句与时序电路
【例 3-12】ENTITY COMP_GOOD IS PORT(a1 : IN BIT; b1 : IN BIT; q1 : OUT BIT ); END ; ARCHITECTURE one OF COMP_GOOD IS BEGIN PROCESS (a1,b1) BEGIN IF a1 > b1 THEN q1 <= '1' ; ELSE q1 <= '0' ; END IF; END PROCESS ; END
图 3-6 例 3-12 的电路图
YANGTZE NORMAL UNIVERSITY
3.2.4 异步时序电路设计 【例 3-19】
... ARCHITECTURE bhv OF MULTI_DFF IS SIGNAL Q1,Q2 : STD_LOGIC; BEGINPRO1: PROCESS (CLK) BEGIN IF CLK'EVENT AND CLK='1' THEN Q1 <= NOT (Q2 OR A); END IF; END PROCESS ;PRO2:PROCESS (Q1) BEGIN IF Q1'EVENT AND Q1='1' THEN Q2 <= D; END IF; QQ <= Q2 ; END PROCESS ;
图 3-9 例 3-19 综合的电路
YANGTZE NORMAL UNIVERSITY
3.2.3 VHDL 设计基本概念和语言现象小节
数据类型数据类型
数据对象数据对象 信号属性信号属性
时钟检测时钟检测
VHDL库VHDL库 程序包程序包
时序电路时序电路 异步时序异步时序
YANGTZE NORMAL UNIVERSITY
3.3 1 位二进制全加器的 VHDL 设计
图 3-10 半加器 h_adder 电路图
图 3-11 全加器 f_adder 电路图
YANGTZE NORMAL UNIVERSITY
YANGTZE NORMAL UNIVERSITY3.3.1 半加器描述和 CASE 语句
a b so co0 0 0 00 1 1 01 0 1 01 1 0 1
表 3-1 半加器 h_adder 逻辑功能真值表
1. CASE语句
CASE 语句的一般表式是:
CASE <表达式 > ISWhen < 选择值或标识符 > => < 顺序语句 >; ... ; < 顺序语句 > ;When < 选择值或标识符 > => < 顺序语句 >; ... ; < 顺序语句 > ;...END CASE ;
YANGTZE NORMAL UNIVERSITY
2. 标准逻辑矢量数据类型 STD_LOGIC_VECTOR
3.3.1 半加器描述和 CASE 语句
在使用 STD_LOGIC_VECTOR 中,必须注明其数组宽度,即位宽,如: B : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ;或 SIGNAL A : STD_LOGIC_VECTOR(1 TO 4)
STD_LOGIC_VECTOR 类型与 STD_LOGIC 一样,都定义在STD_LOGIC_1164 程序包中,但后者属于标准位类型,而前者被定义为标准一维数组。数组中的每一个元素的数据类型都是标准逻辑位 STD_LOGIC。
B <= “01100010”; --B(7) 为‘ 0’B(4 DOWNTO 1) <= “1101”; --B(4) 为“ 1”B(7 DOWNTO 4) <= A; --B(6) 等于 A(2)
YANGTZE NORMAL UNIVERSITY
3. 并置操作符
以下是一些并置操作示例:
SIGNAL a : STD_LOGIC_VECTOR (3 DOWNTO 0) ;SIGNAL d : STD_LOGIC_VECTOR (1 DOWNTO 0) ; ...a <= '1''0'd(1)'1' ; -- 元素与元素并置,并置后的数组长度为 4 ...IF a d = "101011" THEN ... –- 在 IF 条件句中可以使用并置符
3.3.1 半加器描述和 CASE 语句
YANGTZE NORMAL UNIVERSITY3.3.1 半加器描述和 CASE 语句
【例 3-20 】 LIBRARY IEEE ;-- 或门逻辑描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY or2a IS PORT (a, b :IN STD_LOGIC; c : OUT STD_LOGIC ); END ENTITY or2a; ARCHITECTURE one OF or2a IS BEGIN c <= a OR b ; END ARCHITECTURE fu1;
【例 3-21】LIBRARY IEEE; -- 半加器描述 (1)USE IEEE.STD_LOGIC_1164.ALL; ENTITY adder IS PORT (a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END ENTITY adder; ARCHITECTURE fh1 OF adder is BEGIN so <= NOT(a XOR (NOT b)) ; co <= a AND b ; END ARCHITECTURE fh1;
YANGTZE NORMAL UNIVERSITY【例 3-22】LIBRARY IEEE; -- 半加器描述 (2)USE IEEE.STD_LOGIC_1164.ALL; ENTITY h_adder IS PORT (a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END ENTITY h_adder; ARCHITECTURE fh1 OF h_adder is SIGNAL abc : STD_LOGIC_VECTOR(1 DOWNTO 0) ;BEGIN abc <= a & b ; PROCESS(abc) BEGIN CASE abc IS WHEN "00" => so<='0'; co<='0' ; WHEN "01" => so<='1'; co<='0' ; WHEN "10" => so<='1'; co<='0' ; WHEN "11" => so<='0'; co<='1' ; WHEN OTHERS => NULL ; END CASE; END PROCESS;END ARCHITECTURE fh1 ;
YANGTZE NORMAL UNIVERSITY【例 3-23 】... -- 半加器描述 (3) SIGNAL abc,cso : STD_LOGIC_VECTOR(1 DOWNTO 0 ); BEGIN abc <= a & b ; co <= cso(1) ; so <= cso(0) ; PROCESS(abc) BEGIN CASE abc IS WHEN "00" => cso<="00" ; WHEN "01" => cso<="01" ; WHEN "10" => cso<="01" ; WHEN "11" => cso<="10" ; END CASE; END PROCESS;END ARCHITECTURE fh1;
YANGTZE NORMAL UNIVERSITY【例 3-24】 LIBRARY IEEE; --1 位二进制全加器顶层设计描述 USE IEEE.STD_LOGIC_1164.ALL; ENTITY f_adder IS PORT (ain, bin, cin : IN STD_LOGIC; cout, sum : OUT STD_LOGIC ); END ENTITY f_adder; ARCHITECTURE fd1 OF f_adder IS COMPONENT h_adder PORT ( a, b : IN STD_LOGIC; co, so : OUT STD_LOGIC); END COMPONENT ; COMPONENT or2a PORT (a, b : IN STD_LOGIC; c : OUT STD_LOGIC); END COMPONENT;SIGNAL d, e, f : STD_LOGIC; BEGIN u1 : h_adder PORT MAP(a=>ain, b=>bin, co=>d, so=>e);
u2 : h_adder PORT MAP(a=>e , b=>cin ,
co=>f, so=>sum); u3 : or2a PORT MAP(a=>d , b=>f , c=>cout); END ARCHITECTURE fd1;
YANGTZE NORMAL UNIVERSITY
元件例化语句由两部分组成,第一部分是对一个现成的设计实体定义为一个元件,语句的功能是对待调用的元件作出调用声明,它的最简表达式如下所示: COMPONENT 元件名 IS PORT (端口名表 ) ; END COMPONENT 文件名 ;
元件例化语句的第二部分则是此元件与当前设计实体 ( 顶层文件 )中元件间及端口的连接说明。语句的表达式如下: 例化名 : 元件名 PORT MAP( [ 端口名 =>] 连接端口名 ,...);
3.3.2 全加器描述和例化语句
YANGTZE NORMAL UNIVERSITY
习 题 3-3. 图 4-18 所示的是双 2 选 1 多路选择器构成的电路 MUXK ,对于其中 MUX21A ,当 s='0'和 '1' 时,分别有 y<='a'和 y<='b' 。试在一个结构体中用两个进程来表达此电路,每个进程中用 CASE 语句描述一个 2 选 1 多路选择器 MUX21A 。
图 4-18 双 2选 1 多路选择器
YANGTZE NORMAL UNIVERSITY
Library ieee;
use ieee.std_logic_1164.all;
entity MUXK is
port( a1,a2,a3,so,s1: in std_logic;
outy: out std_logic);
end MUXK;
architecture behavioral1 of MUXK is
signal temp: std_logic;
begin
process(a2,a3,so)
begin
case s0 is
when ‘0’ => temp<=a2;
when ‘1’ => temp<=a3;
when others=> NULL;
end case;
end process;
process(a1,temp,s1)
begin
case s1 is
when ‘0’ => outy<=a1;
when ‘1’ => outy<=temp;
when others=> NULL;
end case;
end process;
end behavioral1;
Library ieee;
use ieee.std_logic_1164.all;
entity MUXK is
port( a1,a2,a3,so,s1: in std_logic;
outy: out std_logic);
end MUXK;
architecture behavioral2 of MUXK is
signal temp: std_logic;
begin
process(a2,a3,so)
begin
if so=‘0’ then
temp<=a2;
else
temp<=a3;
end if;
end process;
process(a1,temp,s1)
begin
if s1=‘0’ then
outy<=a1;
else
outy<=temp;
end if;
end process;
end behavioral2;
YANGTZE NORMAL UNIVERSITY Library ieee; use ieee.std_logic_1164.all; entity MUXK is port( a1,a2,a3,so,s1: in std_logic; outy: out std_logic); end MUXK; architecture behavioral3 of MUXK is signal temp: std_logic; begin with s0 select temp<= a2 when ‘0’, <=a3 when ‘1’, <=‘Z’ when others; with s1 select outy<= a1 when ‘0’, <=temp when ‘1’, <=‘Z’ when
others;
end behavioral3;
Library ieee; use ieee.std_logic_1164.all; entity MUXK is port( a1,a2,a3,so,s1: in std_logic; outy: out std_logic); end MUXK; architecture behavioral4 of MUXK is signal temp: std_logic; begin temp<= a2 when s0=‘0’ else <= a3 when so=‘1’ else <=‘Z’ when others;
; temp<= a2 when s1=‘0’ else <= a3 when s1=‘1’ else <=‘Z’ when others; end behavioral4;