420 likes | 683 Views
第四章 VHDL 顺序语句( Sequential Statement ). Process , Function , Procedure 中的语句都是顺序执行,以 Process 为例 Process 与 Process 之间,与其他并行语句之间都是并行的关系. 4.1 、 赋值语句. 1. 顺序信号赋值语句 信号名 <= 赋值 源 ; 赋值符号左边必须是信号名,但不能是端口声明中指定为 in 的信号。右边表达式中可以出现任意对象类,但不能出现端口声明中指定为 out 的信号。 例: B <= A;
E N D
第四章 VHDL顺序语句(Sequential Statement) • Process,Function,Procedure中的语句都是顺序执行,以Process为例 • Process与Process之间,与其他并行语句之间都是并行的关系
4.1、 赋值语句 • 1. 顺序信号赋值语句 • 信号名 <=赋值源; • 赋值符号左边必须是信号名,但不能是端口声明中指定为in的信号。右边表达式中可以出现任意对象类,但不能出现端口声明中指定为out的信号。 例:B <= A; • -- 惯性延迟,无时间延迟子句,即δ延迟D <= C after 5 ns; • -- 传输延迟,指定延迟时间
2. 变量赋值语句 • 变量赋值的含义是:用计算赋值符号右边的表达式所得新值取代变量原来的值。变量赋值的语法形式为: 变量名 := 表达式;
3、赋值目标 • a:=‘1’; • C1:=“1100”; • G(2)<=y; • H(I)<=z; • F(1 to 4):=“1001”;
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) ;
4.2流程控制结构 VHDL为用户提供了若干控制进程内部执行流的结构,可分为条件控制和循环控制两种。 • IF语句 • CASE语句 • LOOP语句 • NEXT语句 • EXIT语句
1. if语句(条件控制语句) • if条件表达式 then • 顺序语句endif;
if条件表达式 then • 顺序语句else • 顺序语句 • endif;
if条件表达式 then • 顺序语句 • elsif条件表达式 then • 顺序语句 • else • 顺序语句endif;
求取最大值 BEGIN IF (a<b) THEN y<=b; ELSE y<=a; END IF; END max;
B用VHDL设计一个D触发器 ddf1 引进内部节点信号 进程和敏感信号 检测CLK上升沿 顺序 语句 将数据输出端口
PROCESS (clock, clear) BEGIN IF clear = ‘0’ THEN q <= ‘0’; ELSIF clock’EVENT and clock = ‘1’ THEN q <= d; END IF; END PROCESS;
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;
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;
2、case语句 • case语句的一般形式为:case值表达式 iswhen选择值 => 语句;when选择值=> 语句; • …[whenothers => 语句;] • endcase; • case语句选择项的要求: 选择唯一,覆盖全集。
选择值的表达方式 • 单个普通数值 8 • 数值选择范围 (2 to 4) • 并列数值 3 | 5 | 8 • 混合方式
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;
例: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;
3. 循环控制语句(loop语句) • 有三种循环语句:简单循环语句,for循环语句以及while循环语句。Next语句和exit语句是与循环密切相关的两个顺序语句,用来控制特殊的循环过程。(1) 无条件loop语句(2) for… loop语句(3) while … loop语句(4) next语句 (5) exit语句
(1) 无条件loop语句 无条件loop语句是简单循环语句,其中包含一个无限循环执行的语句集,其形式为;[loop标号] :loop顺序语句;endloop [loop标号]; 循环标号是可选项。从语法上讲,循环体中的语句中还可以有循环语句,因而在一个循环语句里可以嵌套另外的循环语句。 如果语句中没有exit语句,则这样的循环语句无限循环,不会停止。但exit语句可以使它结束循环,参看下面的exit语句的介绍。
(2) for…loop语句 [loop标号:] f or 循环变量 in 循环次数范围 loop 顺序语句;end loop [loop标号]; 循环变量由循环次数范围确定其类型,无需声明。循环变量可用在循环体中,但一旦循环结束,循环变量不再起作用,即不能把循环变量的值带到循环体外。
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;
(3) while…loop语句 标号:while 循环控制条件 loop 语句;end loop 标号; 循环控制条件是布尔类型。每次执行完循环体之后,都要检测条件表达式的值是真还是假。只要其值为真,就要在执行一次循环体内的语句。在条件为假时结束循环。
process (inputx)variable n : Integer := 1;beginL1: while n <= 8 loopoutputx(n) <= inputx(n+8); • n := n +1 ;endloop L1;endprocess;
(4) next语句 • 该语句控制循环提前进入下一次循环,即跳过该语句后面的语句执行指定标号的下一个循环next ; • next loop标号; • next loop标号 when 条件表达式 ;
loop2: loopB := B+1; next loop2 when B<10; . .endloop loop2;
(5) exit语句 • exit语句使得从循环标号所标明的循环中退出。exit ; • exit loop标号; • exit loop标号 when 条件表达式 • 如果指定条件,必须要在所绐条件为真的前提下,才从循环标号所标明的循环中退出。 • 两种情况下的循环标号都是可选项。如果语句中末给出循环标号,则从当前循环中退出。
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;
3. WAIT语句 • 等待语句是进程中专门控制进程激活与挂起的的顺序语句。可以出现在进程的任何位置,也可以有多个进程语句。 • wait --永远挂起 • wait on A, B; -- A 或B 变化时,进程激活 • wait until Enable = ‘1’; -- 满足条件时,进程激活 • wait for 5 ns;-- 过5 ns 后,进程激活
任意组合: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 时激活。
p1: process --( )begin…wait on s1;…wait on s2;…wait on s1;…end process p1; • 进程中可以由若干等待语句。运行开始时,进程处于激活状态,从第一个顺序语句开始执行,遇到第一个等待语句是挂起。当该等待语句的条件满足时,进程再次激活,从该等待语句接着运行,直到遇到下一个等待语句再次挂起。以后每次激活后,运行到下一个等待语句挂起。如果进程执行到最后一个语句,则下一个语句是第一个语句。
过程(PROCEDURE) 函数(FUNCTION) VHDL的子程序有两种类型: 四、子程序调用语句 子程序的特点: ----子程序可以在结构体的任何位置被调用,而且可以反复调用。
过程(PROCEDURE) 过程语句的结构: PROCEDURE 过程名(形式参数1;形式参数2;… )IS [定义语句]; BEGIN [顺序处理语句]; END过程名; 过程语句的调用格式: 过程名 [([形数名=> ]实参表达式 {,[形数名=> ]实参表达式})];
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;
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;
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;
函数(FUNCTION) 函数语句的结构: FUNCTION函数名(输入参数表)RETUEN数据类型 IS [定义语句]; BEGIN [顺序处理语句]; RETUEN [返回变量名]; END [函数名]; 函数语句的调用格式: 函数名(实际参数表);
例: 用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; • 函数的参数均为输入参数。 • 函数调用返回一个指定数据类型的值。
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;
五、 返回语句─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
六、 空语句─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