1 / 45

第 3 章 VHDL 硬件描述语言 ( 一 )

第 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

king
Télécharger la présentation

第 3 章 VHDL 硬件描述语言 ( 一 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第3章 VHDL硬件描述语言(一)

  2. 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”

  3. Such as Multiplexer, Latch Adder Counterand more… Let’s get started with some examples

  4. 3.1 多路选择器VHDL描述 3.1.1 2选1多路选择器的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 ; 实体 图3-1 mux21a实体 结构体 图3-2 mux21a结构体

  5. 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; BEGIN d <= 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 ;

  6. 3.1.1 2选1多路选择器的VHDL描述 图3-3 mux21a功能时序波形

  7. 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;

  8. 3.1.2 VHDL相关语句说明 2. 实体名:如用counter4b,adder8b。不用or2,and2等。 3. PORT语句和端口信号名 4. 端口模式 INOUT BUFFER OUT IN 5. 数据类型BIT(如INTEGER BOOLEAN STD_LOGIC BIT等)

  9. 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标准。

  10. 3.1.2 VHDL相关语句说明 7. 信号传输(赋值)符号和数据比较符号 【例3-1】 ENTITYmux21aIS PORT( a, b : IN BIT ; s : IN BIT; y :OUT BIT ) ; END ENTITYmux21a ; ARCHITECTUREone OFmux21aIS BEGIN y <= aWHEN s = '0'ELSE b ; END ARCHITECTUREone ; s = ‘0’中“=”没有赋值的含义,只是一种数据比较符号。boolean类型,取值分别是:true和false 。

  11. 3.1.2 VHDL相关语句说明 8. 逻辑操作符AND、OR、NOT 9. 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 ;

  12. 3.1.2 VHDL相关语句说明 10. WHEN_ELSE条件信号赋值语句 赋值目标 <= 表达式 WHEN 赋值条件 ELSE 表达式 WHEN 赋值条件 ELSE ... 表达式 ; Z <= a WHEN p1 = ‘1’ ELSE b WHEN p2 = ‘1’ ELSE c ;

  13. 3.1.2 VHDL相关语句说明 11. PROCESS进程语句和顺序语句 【例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 ; 12. 文件取名和存盘

  14. 3.1.3 VHDL设计的基本概念和语句小节 实体 结构体 端口定义 端口模式 数据类型 信号赋值符 条件比较符  延时 逻辑操作符 IF条件语句 并行条件语句 进程语句 顺序语句 并行语句 文件取名 文件存盘

  15. 3.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触发器

  16. 比较用3种不同语句的D触发器VHDL程序 Entity test1 is port (clk, d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (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 is port (clk, d : in bit; q : out bit); end test1; architecture body of test1 is begin process (clk,d) begin if rising_edge(clk) then q <= d; end if; end process; end test1_body; Entity test1 is port (clk : in bit; d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (clk) begin if (clk = ‘1’) then q1 <= d; end if; q <= q1 ; end process; end body; Entity test1 is port (clk : in bit; d : in bit; q : out bit); end test1; architecture body of test1 is signal q1 : bit ; begin process (clk,d) begin if (clk = ‘1’) then q1 <= d; end if; q <= q1 ; end process; end body; They are all the same DFF

  17. How Many Registers? • ENTITY reg1 IS • PORT ( d : in BIT; • clk : in BIT; • q : out BIT); • END reg1; • ARCHITECTURE reg1 OF reg1 IS • SIGNAL a, b : BIT; • BEGIN • PROCESS (clk) • BEGIN • IF clk='1' AND clk’event THEN • a <= d; • b <= a; • q <= b; • END IF; • END PROCESS; • END reg1;

  18. How Many Registers? • ENTITY reg1 IS • PORT ( d : in BIT; • clk : in BIT; • q : out BIT); • END reg1; • ARCHITECTURE reg1 OF reg1 IS • BEGIN • PROCESS (clk) • VARIABLE a, b : BIT; • BEGIN • IF clk='1' AND clk’event THEN • a := d; • b := a; • q <= b; • END IF; • END PROCESS; • END reg1;

  19. A 0 1 0 0 1 B 1 1 0 用VHDL设计4位计数器 取整数数据类型,为什么? 整数取值范围 端口信号模式取 BUFFER,为什么? 注意整数和位的不同表达方式!

  20. 修改后的程序 运算符加载 注意,信号 端口模式和 数据类型的 改变! 注意,引 进内部信 号矢量!

  21. 综合后的计数器电路RTL图 组合电路加1器 4位锁存器 输出反馈 锁存信号

  22. 用VHDL设计7段16进制译码器 用CASE语句完成真值表的功能 向7段数码 管输出信号, 最高位控制 小数点

  23. 注意,此语句必须加入 4位加法 计数器 7段译码器 信号输出 8位总线输出

  24. 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; ‘-’表示忽略。

  25. 3.2.2 D触发器VHDL描述的语言现象说明 2. 设计库和标准程序包 使用库和程序包的一般定义表式是: LIBRARY <设计库名>; USE < 设计库名>.<程序包名>.ALL ; 3. SIGNAL信号定义和数据对象 SIGNAL Q1 : STD_LOGIC 【例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 ;

  26. 3.2.2 D触发器VHDL描述的语言现象说明 4. 上升沿检测表式和信号属性函数EVENT CLK'EVENT AND CLK = '1' 关键词EVENT是信号属性,VHDL通过以下表式来测定某信号的跳变边沿: <信号名>'EVENT 短语“CLK’EVENT ”就是对CLK标识符的信号在当前的一个极小的时间段δ内发生事件的情况进行检测。

  27. 3.2.2 D触发器VHDL描述的语言现象说明 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 ;

  28. 3. 不完整条件语句与时序电路 图3-3 例3-11的电路图

  29. 3. 不完整条件语句与时序电路 【例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的电路图

  30. 3.2.4 异步时序电路设计 【例3-19】 ... ARCHITECTURE bhv OF MULTI_DFF IS SIGNAL Q1,Q2 : STD_LOGIC; BEGIN PRO1: 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综合的电路

  31. 3.2.3 VHDL设计基本概念和语言现象小节 VHDL库 程序包 数据类型 数据对象 信号属性 时钟检测 时序电路 异步时序

  32. 3.3 1位二进制全加器的VHDL设计 图3-10半加器h_adder电路图 图3-11 全加器f_adder电路图

  33. 3.3.1 半加器描述和CASE语句 表3-1 半加器h_adder逻辑功能真值表 a b so co 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1. CASE语句 CASE语句的一般表式是: CASE <表达式> IS When <选择值或标识符> => <顺序语句>; ... ; <顺序语句> ; When <选择值或标识符> => <顺序语句>; ... ; <顺序语句> ; ... END CASE ;

  34. 3.3.1 半加器描述和CASE语句 2. 标准逻辑矢量数据类型STD_LOGIC_VECTOR STD_LOGIC_VECTOR类型与STD_LOGIC一样,都定义在STD_LOGIC_1164程序包中,但后者属于标准位类型,而前者被定义为标准一维数组。数组中的每一个元素的数据类型都是标准逻辑位STD_LOGIC。 在使用STD_LOGIC_VECTOR中,必须注明其数组宽度,即位宽,如: B : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ; 或 SIGNAL A :STD_LOGIC_VECTOR(1 TO 4) B <= “01100010”; --B(7)为‘0’ B(4 DOWNTO 1) <= “1101”; --B(4)为“1” B(7 DOWNTO 4) <= A; --B(6)等于A(2)

  35. 3.3.1 半加器描述和CASE语句 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条件句中可以使用并置符

  36. 3.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;

  37. 【例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 ;

  38. 【例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;

  39. 【例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;

  40. 3.3.2 全加器描述和例化语句 元件例化语句由两部分组成,第一部分是对一个现成的设计实体定义为一个元件,语句的功能是对待调用的元件作出调用声明,它的最简表达式如下所示: COMPONENT 元件名 IS PORT (端口名表) ; END COMPONENT 文件名 ; 元件例化语句的第二部分则是此元件与当前设计实体(顶层文件)中元件间及端口的连接说明。语句的表达式如下: 例化名 : 元件名 PORT MAP( [端口名 =>] 连接端口名,...);

  41. 习 题 3-3. 图4-18所示的是双2选1多路选择器构成的电路MUXK,对于其中MUX21A,当s='0'和'1'时,分别有y<='a'和y<='b'。试在一个结构体中用两个进程来表达此电路,每个进程中用CASE语句描述一个2选1多路选择器MUX21A。 图4-18 双2选1多路选择器

  42. 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; • 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;

  43. 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; • 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;

More Related