1 / 42

第四章 VHDL 顺序语句( Sequential Statement )

第四章 VHDL 顺序语句( Sequential Statement ). Process , Function , Procedure 中的语句都是顺序执行,以 Process 为例 Process 与 Process 之间,与其他并行语句之间都是并行的关系. 4.1 、 赋值语句. 1. 顺序信号赋值语句 信号名 <= 赋值 源 ;   赋值符号左边必须是信号名,但不能是端口声明中指定为 in 的信号。右边表达式中可以出现任意对象类,但不能出现端口声明中指定为 out 的信号。   例: B <= A;

dillan
Download Presentation

第四章 VHDL 顺序语句( Sequential Statement )

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. 第四章 VHDL顺序语句(Sequential Statement) • Process,Function,Procedure中的语句都是顺序执行,以Process为例 • Process与Process之间,与其他并行语句之间都是并行的关系

  2. 4.1、 赋值语句 • 1. 顺序信号赋值语句 • 信号名 <=赋值源; •   赋值符号左边必须是信号名,但不能是端口声明中指定为in的信号。右边表达式中可以出现任意对象类,但不能出现端口声明中指定为out的信号。  例:B <= A; • -- 惯性延迟,无时间延迟子句,即δ延迟D <= C after 5 ns; • -- 传输延迟,指定延迟时间

  3. 2. 变量赋值语句 •  变量赋值的含义是:用计算赋值符号右边的表达式所得新值取代变量原来的值。变量赋值的语法形式为:  变量名 := 表达式;

  4. 3、赋值目标 • a:=‘1’; • C1:=“1100”; • G(2)<=y; • H(I)<=z; • F(1 to 4):=“1001”;

  5. SIGNAL a,b,c,d : STD_LOGIC; • SIGNAL S : STD_LOGIC_VECTOR(1 TO 4); • … • VARIABLE e, f : STD_LOGIC; • VARIABLE g : STD_LOGIC_VECTOR(1 TO 2); • VARIABLE h : STD_LOGIC_VECTOR(1 TO 4); • S <=(‘0’, ‘1’, ‘0’ , ‘0’); • (a, b, c, d) <= s; • --a<=‘0’; b<=‘1’; c<=‘0’; d<=‘0’; • … • (3=>e, 4=>f, 2=>g(1), 1=>g(2) ):=h; • --g(2) :=h(1) ; g(1) :=h(2) ; e :=h(3) ; f :=h(4) ;

  6. 4.2流程控制结构 VHDL为用户提供了若干控制进程内部执行流的结构,可分为条件控制和循环控制两种。 • IF语句 • CASE语句 • LOOP语句 • NEXT语句 • EXIT语句

  7. 1. if语句(条件控制语句) • if条件表达式 then • 顺序语句endif;

  8. if条件表达式 then • 顺序语句else • 顺序语句 • endif;

  9. if条件表达式 then • 顺序语句 • elsif条件表达式 then • 顺序语句 • else • 顺序语句endif;

  10. 求取最大值 BEGIN IF (a<b) THEN y<=b; ELSE y<=a; END IF; END max;

  11. B用VHDL设计一个D触发器 ddf1 引进内部节点信号 进程和敏感信号 检测CLK上升沿 顺序 语句 将数据输出端口

  12. PROCESS (clock, clear) BEGIN IF clear = ‘0’ THEN q <= ‘0’; ELSIF clock’EVENT and clock = ‘1’ THEN q <= d; END IF; END PROCESS;

  13. T触发器 Process(clk) begin if(clk’event and clk=‘1’) then if(t = ‘1’) then q <= not(q); else q <= q; end if; end if; end process;

  14. ENTITY mul IS PORT (a, b, sel : IN BIT; data_out : OUT BIT); END mul; ARCHITECTURE ex OF mul IS SIGNAL temp : BIT; BEGIN process_a: PROCESS (a, b, selx) BEGIN IF (sel = ‘0’) THEN temp <= a; ELSE temp <= b; END IF; data_out <= temp; END PROCESS process_a;

  15. 2、case语句 • case语句的一般形式为:case值表达式 iswhen选择值 => 语句;when选择值=> 语句; • …[whenothers => 语句;] • endcase; • case语句选择项的要求:    选择唯一,覆盖全集。

  16. 选择值的表达方式 • 单个普通数值 8 • 数值选择范围 (2 to 4) • 并列数值 3 | 5 | 8 • 混合方式

  17. S1,s2 2 a z b mux c d • LIBRARY ieee; • USE ieee.std_logic_1164.all; • ENTITY mux41 is • PORT (s1,s2,a,b,c,d : IN STD_LOGIC; • z : OUT STD_LOGIC); • END mux41; • ARCHITECTURE activ OF mux41 IS • SIGNAL s : STD_LOGIC_VECTOR( 1 DOWNTO 0); • BEGIN • s<= s1&s2 ; • PROCESS (s ,a,b,c,d) • BEGIN • CASE s IS • WHEN “00” => z<= a; • WHEN “01” => z<= b; • WHEN “10” => z<= c; • WHEN “11” => z<= d; • WHEN OTHERS =>z<= ‘x’; • END CASE; • END PROCESS; • END activ;

  18. 例:signal C: Integer range 1 to 20;signal Out1: ( '0', '1', '2', '3');process ( C )begincase C iswhen 1 => Out1 <= '0'; -- C= 1when 2 | 4 | 8 => Out1 <= '1'; -- C= 2,4,8when 3 | 5 to 7| 10 to 15 => Out1 <= '2';-- C= 3,5,6,7,10,11,12,13,14,15when others => Out1 <= '3'; • -- C= 9, 16, 17, 18, 19, 20end case;end process;

  19. 3. 循环控制语句(loop语句) •  有三种循环语句:简单循环语句,for循环语句以及while循环语句。Next语句和exit语句是与循环密切相关的两个顺序语句,用来控制特殊的循环过程。(1) 无条件loop语句(2) for… loop语句(3) while … loop语句(4) next语句 (5) exit语句

  20. (1) 无条件loop语句   无条件loop语句是简单循环语句,其中包含一个无限循环执行的语句集,其形式为;[loop标号] :loop顺序语句;endloop [loop标号];  循环标号是可选项。从语法上讲,循环体中的语句中还可以有循环语句,因而在一个循环语句里可以嵌套另外的循环语句。  如果语句中没有exit语句,则这样的循环语句无限循环,不会停止。但exit语句可以使它结束循环,参看下面的exit语句的介绍。

  21. loop2: loopa := a+1; exit loop2 when a>10;endloop loop2;

  22. (2) for…loop语句 [loop标号:] f or 循环变量 in 循环次数范围 loop 顺序语句;end loop [loop标号];   循环变量由循环次数范围确定其类型,无需声明。循环变量可用在循环体中,但一旦循环结束,循环变量不再起作用,即不能把循环变量的值带到循环体外。

  23. 8位奇偶校验电路 • ENTITY p_check is • PORT (a : IN STD_LOGIC_VECTOR(7 DOWNTO 0); • Y : OUT STD_LOGIC); • END p_check ; • ARCHITECTURE opt OF p_check IS • SIGNAL tmp : STD_LOGIC; • BEGIN • PROCESS (a) • BEGIN • tmp<= ‘0’; • for n in 0 to 7 looptmp<= tmp XOR a(n);end loop; • y <= tmp; • END PROCESS; • END opt;

  24. (3) while…loop语句 标号:while 循环控制条件 loop       语句;end loop 标号; 循环控制条件是布尔类型。每次执行完循环体之后,都要检测条件表达式的值是真还是假。只要其值为真,就要在执行一次循环体内的语句。在条件为假时结束循环。

  25. process (inputx)variable n : Integer := 1;beginL1: while n <= 8 loopoutputx(n) <= inputx(n+8); • n := n +1 ;endloop L1;endprocess;

  26. (4) next语句 • 该语句控制循环提前进入下一次循环,即跳过该语句后面的语句执行指定标号的下一个循环next ; • next loop标号; • next loop标号 when 条件表达式 ;

  27. loop2: loopB := B+1; next loop2 when B<10; . .endloop loop2;

  28. (5) exit语句 • exit语句使得从循环标号所标明的循环中退出。exit ; • exit loop标号; • exit loop标号 when 条件表达式 •   如果指定条件,必须要在所绐条件为真的前提下,才从循环标号所标明的循环中退出。 • 两种情况下的循环标号都是可选项。如果语句中末给出循环标号,则从当前循环中退出。

  29. signal a , b : std_logic_vector(1 downto 0); • signal a_less_then_b :BOOLEAN; • … a_less_then_b <=false; for i in 1 downto 0 loop IF (a(i)=‘1’ AND b(i)=‘0’ THEN • a_less_then_b <=false; • EXIT ; • Elsif (a(i)=‘0’ AND b(i)=‘1’ THEN • a_less_then_b <=true; • EXIT; • ELSE NULL; • END IF; • END LOOP;

  30. 3. WAIT语句 • 等待语句是进程中专门控制进程激活与挂起的的顺序语句。可以出现在进程的任何位置,也可以有多个进程语句。 • wait --永远挂起 • wait on A, B; -- A 或B 变化时,进程激活 • wait until Enable = ‘1’; -- 满足条件时,进程激活 • wait for 5 ns;-- 过5 ns 后,进程激活

  31. 任意组合:wait on A, B until Enable = '1'; • -- 等待A, B变化,且Enable = ‘1’时激活。 • wait on A, B for 5 ns; • -- 等待A, B变化,或到达5 ns 时激活 • 。wait until Enable = ‘1’ for 5 ns; -- 等待Enable = ‘1’时激活,或者到达5 ns 时激活。 • wait on A, B until Enable = ‘1’ for 5 ns; --等待A, B变化,且Enable = ‘1’时激活,或者到达 • 5 ns 时激活。

  32. p1: process --( )begin…wait on s1;…wait on s2;…wait on s1;…end process p1; • 进程中可以由若干等待语句。运行开始时,进程处于激活状态,从第一个顺序语句开始执行,遇到第一个等待语句是挂起。当该等待语句的条件满足时,进程再次激活,从该等待语句接着运行,直到遇到下一个等待语句再次挂起。以后每次激活后,运行到下一个等待语句挂起。如果进程执行到最后一个语句,则下一个语句是第一个语句。

  33. 过程(PROCEDURE) 函数(FUNCTION) VHDL的子程序有两种类型: 四、子程序调用语句 子程序的特点: ----子程序可以在结构体的任何位置被调用,而且可以反复调用。

  34. 过程(PROCEDURE) 过程语句的结构: PROCEDURE 过程名(形式参数1;形式参数2;… )IS [定义语句]; BEGIN [顺序处理语句]; END过程名; 过程语句的调用格式: 过程名 [([形数名=> ]实参表达式 {,[形数名=> ]实参表达式})];

  35. PACKAGE data_type IS • subtype data_element is integer range 0 to 3 ; • type data_array is array (1 to 3) of data_element; • end data_type;

  36. use work.data_type.all; • ENTITY sort is • PORT (in_array : in data_array ; • out_array : out data_array ; • END sort ; • ARCHITECTURE exmp OF sort IS • BEGIN PROCESS (in_array) procedure swap(data : inout data_array; low,high: in integer) is variable temp: data_element; BEGIN if (data(low) > data(high)) then • tmp:= data(low); • data(low):=data(high); • data(high):= temp; • end if; • End swap; • Varible my_array :data_array;

  37. Begin • my_array := in_array; • Swap(my_array ,1,2); • Swap(my_array ,2,3); • Swap(my_array ,1,2); • Out_array <= my_array; • End process; • End exmp;

  38. 函数(FUNCTION) 函数语句的结构: FUNCTION函数名(输入参数表)RETUEN数据类型 IS [定义语句]; BEGIN [顺序处理语句]; RETUEN [返回变量名]; END [函数名]; 函数语句的调用格式: 函数名(实际参数表);

  39. 例: 用FUNCTION语句描述求取最大值的函数。 FUNCTION max(a:std_logic_vector (5 downto0); b:std_logic_vector (5 downto0)) RETURN std_logic_vector (5 downto0) IS VARIABLE tmp:std_logic_vector(a'range); BEGIN IF (a>b) THEN tmp:=a; ELSE tmp:=b; END IF; RETURN tmp; END max; • 函数的参数均为输入参数。 • 函数调用返回一个指定数据类型的值。

  40. ARCHITECTURE rtl OF dpeak IS SIGNAL peak : STD_LOGIC_VECTOR(5 downto0); BEGIN dout<=peak; PROCESS (clk) BEGIN IF (clk'event and clk='1') THEN IF (set='1') THEN peak<=date; ELSE peak<= max(date,peak); END IF; END IF; END PROCESS; END rtl;

  41. 五、 返回语句─return语句 返回浯句(return)用来中止子程序的运行。对于过程来说,返回浯句的唯一合法形式是:return;  当执行了这个语句时,控制返回到该过程的调用点。  对于函数来说,返回语句对函数输出的数据对象回送函数值。例如:function AND_Function(x,y:in Bit) return Bit isbeginif x='l'and y='1' thenreturn '1';elsereturn '0';end if;end AND_Function

  42. 六、 空语句─null语句 • 某些时候,我们需要显式地指出在某些条件下不执行任何动作,空语句(null)可以达到这个目的。  例如:Procedure ModTwo(x: inout Integer)begincase xwhen 1 | 0 => null; • --当x等于1或0时,没有动作。when others => x := x mod 2; • --其他情况下以2为模。end case;end ModTwo

More Related