【例9-13】 L工 BRARY工EEE USE IEEE STD LOGIC 1164.ALL ENTITY shifter工s PoRT( data IN STD LOGIC VECTOR (7 DOWNTo 0)i shift left: IN STD LOGIC shift right: IN STD LOGIC c1k: IN STD LOG工c; reset:工 N STD LOG工C mode IN STD LOGIC VECTOR (1 DOWNTo 0) gout BUFFER STD LOGIC VECTOR (7 DOWNTO 0)) END shifter ARCHITECTURE behave oF shifter Is SIGNAL enable: STD LOGIC BEGIN PROCESS BEGIN WA工TUN工( RISING EDO(c1k)); 等待时钟上升沿 IF (reset =i1 )THEN gout<="00000000"; ELSE CASE mode Is WBEN"01"→>qut<= shift right&qut(7DoNo1);--右移 WHEN "10"=>gout<=gout(6 DOWNTo 0)& shift left; --EEE WHEN "11=> gout < datai 并行加载 WHEN OTHERS = NULL END CASE; END工E END PROCESS; eND be have;
KX 【例9-13】 康芯科技 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY shifter IS PORT ( data : IN STD_LOGIC_VECTOR (7 DOWNTO 0); shift_left: IN STD_LOGIC; shift_right: IN STD_LOGIC; clk: IN STD_LOGIC; reset : IN STD_LOGIC; mode : IN STD_LOGIC_VECTOR (1 DOWNTO 0); qout : BUFFER STD_LOGIC_VECTOR (7 DOWNTO 0) ); END shifter; ARCHITECTURE behave OF shifter IS SIGNAL enable: STD_LOGIC; BEGIN PROCESS BEGIN WAIT UNTIL (RISING_EDGE(clk) ); --等待时钟上升沿 IF (reset = '1') THEN qout <= "00000000"; ELSE CASE mode IS WHEN "01" => qout<=shift_right & qout(7 DOWNTO 1);--右移 WHEN "10" => qout<=qout(6 DOWNTO 0) & shift_left; --左移 WHEN "11" => qout <= data; -- 并行加载 WHEN OTHERS => NULL; END CASE; END IF; END PROCESS; END behave;
K述列 9.1.8子程序调用语句 22 过程调用 调用过程的语句格式如下 2过程名[形参名=>实参表达式 【,[形参名=>]实参表达式}]; 个过程的调用将分别完成以下三个步骤: (1)将Ⅳ和 INOUT模式的实参值赋给欲调用的过程中与它们对应的形参 (2)执行这个过程 (3)将过程中N和 INOUT模式的形参值返回给对应的实参
KX 康芯科技 9.1.8 子程序调用语句 调用过程的语句格式如下: 过程名[([形参名=> ]实参表达式 { ,[形参名=> ]实参表达式}) ]; 1、过程调用 一个过程的调用将分别完成以下三个步骤: (1)将IN和INOUT模式的实参值赋给欲调用的过程中与它们对应的形参; (2)执行这个过程; (3)将过程中IN和INOUT模式的形参值返回给对应的实参
例9-14】 PACKAGE data types Is 定义程序包 sUBTYPE data e1 ement IS INTEGER RANGE 0 TO3;--定义数据类型 TYPE data array Is ARRAY (1 To 3)OF data elementi END data types; USE WORK. data types.ALL;--打开以上建立在当前工作库的程序包 data types ENTETY sO卫t工S PORT in array IN data array out array our data array)i EN sor七; 酿RCH些 ECTURE exmp OF sort工s BEG工N PROCESS (in array) 进程开始,设 data types为敏感信号 PROCEDURE swap(data INOUT data array swap的形参名为data、low、high low, high IN INTEGER)工s VAR工ABL temp data element i BEG工N 开始描述本过程的逻辑功能 IF (data(low)> data(high))THEN 检测数据 temp : data (low)i data (low) : data(high) data(high):= temp i 接下页 END工F; END swap i 过程swap定义结束 VARIABLE my array: data array;--在本进程中定义变量 Imy array
KX 【例9-14】 康芯科技 PACKAGE data_types IS -- 定义程序包 SUBTYPE data_element IS INTEGER RANGE 0 TO 3 ;-- 定义数据类型 TYPE data_array IS ARRAY (1 TO 3) OF data_element; END data_types; USE WORK.data_types.ALL; --打开以上建立在当前工作库的程序包data_types 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) -- 进程开始,设data_types为敏感信号 PROCEDURE swap(data : INOUT data_array; -- swap的形参名为data、low、high low, high : IN INTEGER ) IS VARIABLE temp : data_element ; BEGIN -- 开始描述本过程的逻辑功能 IF (data(low) > data(high)) THEN -- 检测数据 temp := data(low) ; data(low) := data(high); data(high) := temp ; END IF ; END swap ; -- 过程swap定义结束 VARIABLE my_array : data_array ; -- 在本进程中定义变量my_array 接下页
接上页 K述列 BEG工N 进程开始 Iy array : = In array i 将输入值读入变量 swap(my array, 1,2)i my array、1、2是对应于data、1ow、high的实参 swap(my array, 2, 3)i 位置关联法调用,第2、第3元素交换 swap(my array, 1, 2) 位置关联法调用,第1、第2元素再次交换 out array < my array i ENDB。cess; END exmp 【例915】 ENTITY SO卫t4is GENERIc (top INTEGER =3) PORT (a, b,c, d: IN BIT VECToR (0 To top)i rar rb, rc, rd: OUT BIT VECTOR (0 To top))i END sor t4 ARCHITECTURE muxes OF sort IS PROCEDURE sort2(x, y: INOUT BIT VECTOR (0 To top))is VARIABLE tmp BIT VECTOR (0 To top)i 接下页
KX 康芯科技 BEGIN -- 进程开始 my_array := in_array ; -- 将输入值读入变量 swap(my_array, 1, 2); -- my_array、1、2是对应于data、low、high的实参 swap(my_array, 2, 3); -- 位置关联法调用, 第2、第3元素交换 swap(my_array, 1, 2); -- 位置关联法调用, 第1、第2元素再次交换 out_array <= my_array ; END Process ; END exmp ; 接上页 【例9-15】 ENTITY sort4 is GENERIC (top : INTEGER :=3); PORT (a, b, c, d : IN BIT_VECTOR (0 TO top); ra, rb, rc, rd : OUT BIT_VECTOR (0 TO top)); END sort4; ARCHITECTURE muxes OF sort4 IS PROCEDURE sort2(x, y : INOUT BIT_VECTOR (0 TO top)) is VARIABLE tmp : BIT_VECTOR (0 TO top); 接下页
接上页 BEG工N IE x> y THEN tmp := x; x :=yi END工E END sor t2 BEG工N PROCESs (a b,c, d) VARIABLE va, vb, vc, va: BIT VECTOR (o To top)i BEG工N va : a vb : b; vc := c vd : =di sort2(va, vc)i sort2(vb, va)i sort2(va, vb)i sort2(vc, va)i sort2 (vb, vc)i ra < vai rb < vb rc < vc: rd < vd; END PROCESS END muxes 2、函数调用 函数调用与过程调用是十分相似的,不同之处是,调用函数将返还 个指定数据类型的值,函数的参量只能是输入值
KX 接上页 康芯科技 BEGIN IF x > y THEN tmp := x; x := y; y := tmp; END IF; END sort2; BEGIN PROCESS (a, b, c, d) VARIABLE va, vb, vc, vd : BIT_VECTOR(0 TO top); BEGIN va := a; vb := b; vc := c; vd := d; sort2(va, vc); sort2(vb, vd); sort2(va, vb); sort2(vc, vd); sort2(vb, vc); ra <= va; rb <= vb; rc <= vc; rd <= vd; END PROCESS; END muxes; 2、函数调用 函数调用与过程调用是十分相似的,不同之处是,调用函数将返还 一个指定数据类型的值,函数的参量只能是输入值