第五章 VHDL主要描述语句
主要内容 概 述 行为描述语句 结构描述语句
5.1 概 述 VHDL中的描述语句了分为顺序语句(Sequential Statements)和并行语句 (Concurrent Statements)两大基本系列。
5.2 行为描述语句 5.2.1 赋值语句 赋值语句有两种,即信号赋值语句和变量赋值语句。每一种赋值语句都有三个基本组成部分,即赋值目标、赋值符号和赋值源。信号赋值语句和变量赋值语句的语法格式如下 : 信号赋值目标 <= 赋值源; 变量赋值目标 := 赋值源; V1 := ‘0’; V2 := ‘1’; S1 <= s1 AND s2; S2 <= s1 OR s2; array 1(0) <= V1; array 1(1) <= V2; array 1(2) <= S1; array 1(3) <= S2; END PROCESS; 标识符、数组元素目标的赋值语句示例如下: SIGNAL s1, s2: STD_LOGIC; SIGNAL array 1: STD_LOGIC_VECTOR(0 TO 3); PROCESS(s1) VARIABLE v1, v2: STD_LOGIC; BEGIN
5.2.2 并行信号赋值语句 1.一般信号赋值语句 信号赋值目标 <= 延迟选项 表达式 延迟表达式; 例5.1 四位并行加法器的数据流描述。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL ENTITY ADD4 IS PORT ( A: IN STD_LOGIC_VECTOR (3 DOWNTO 0); B: IN STD_LOGIC_VECTOR (3 DOWNTO 0); CIN : IN STD_LOGIC; SUM : OUT STD_LOGIC_VECTOR ( 3 DOWNTO 0); COUT : OUT STD_LOGIC ); END ADD4; ARCHITECTURE ADD4_concurnt OF ADD4 IS -- 定义包含有进位的SUM信号 SIGNAL SUMINT: STD_LOGIC_VECTOR( 4 DOWNTO 0); BEGIN SUMINT <= ('0' & A) + ('0' & B) + ("0000" & CIN) AFTER 10 ns; COUT <= SUMINT(4) AFTER 15 ns; SUM <= SUMINT(3 DOWNTO 0) AFTER 15 ns; END ADD4_concurnt;
5.2.2 并行信号赋值语句(续1) 2. 条件信号赋值语句 赋值目标 <= 表达式 WHEN 赋值条件 ELSE 5.2.2 并行信号赋值语句(续1) 2. 条件信号赋值语句 赋值目标 <= 表达式 WHEN 赋值条件 ELSE 表达式 WHEN 赋值条件 ELSE … 表达式; 例5.2 3选1多路选择器的行为描述。
5.2.2 并行信号赋值语句(续2) 2. 条件信号赋值语句 例5.2 3选1多路选择器的行为描述。 LIBRARY IEEE; 5.2.2 并行信号赋值语句(续2) 2. 条件信号赋值语句 例5.2 3选1多路选择器的行为描述。 LIBRARY IEEE; USE IEEE.STD_LOGIC 1164.ALL; ENTITY mux31 IS PORT (a, b, c : IN STD_LOGIC; en1, en2 : IN STD_LOGIC; z :OUT STD_LOGIC); END mux31; ARCHITECTURE behavioral OF mux31 IS BEGIN Z<= a WHEN en2 = '1' ELSE b WHEN en1= '1' ELSE c ; END behavioral;
5.2.2 并行信号赋值语句(续3) 3. 选择信号赋值语句 例5.3 简易的指令译码器设计。 WITH 选择表达式 SELECT 赋值目标信号 <=表达式 WHEN 选择值, 表达式 WHEN 选择值, … 表达式 WHEN 选择值, 表达式 WHEN 选择值; 例5.3 简易的指令译码器设计。
5.2.2 并行信号赋值语句(续4) 3. 选择信号赋值语句 例5.3 简易的指令译码器设计。 LIBRARY IEEE; 5.2.2 并行信号赋值语句(续4) 3. 选择信号赋值语句 例5.3 简易的指令译码器设计。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DECODER IS PORT (A, B, C : IN STD_LOGIC; data1, data2 : IN STD_LOGIC; data_out : OUT STD_LOGIC); END DECODER; ARCHITECTURE behavioral OF DECODER IS SIGNAL instruction: STD_LOGIC_VECTOR (0 TO 2); BEGIN Instruction <= A & B & C; WITH instruction SELECT data_out <= NOT data1 WHEN "000", data1 AND data2 WHEN "001", data1 OR data2 WHEN "010", data1 NAND data2 WHEN "011", data1 NOR data2 WHEN "100", data1 XOR data2 WHEN "101", data1 XNOR data2 WHEN "110", ‘Z’ WHEN OTHERS; END behavioral;
5.2.3 顺序控制语句 1. IF语句 第一种形式: IF 条件 THEN --顺序语句; ELSE END IF; 第二种形式: 5.2.3 顺序控制语句 1. IF语句 第一种形式: IF 条件 THEN --顺序语句; ELSE END IF; 第二种形式: IF 条件 THEN --顺序语句; END IF; 第三种形式: IF 条件 THEN --顺序语句; ELSIF 条件 THEN … ELSE END IF; 第四种形式: IF 条件 THEN --顺序语句; ELSIF 条件 THEN … END IF;
1. IF语句(续1) 例5.4 采用两种不同IF语句结构实现同一结构和功能的数据选择器。 ENTITY if_statement IS PORT (A, B, C, X: IN BIT_VECTOR(3 DOWNTO 0); Z: OUT BIT_VECTOR(3 DOWNTO 0)); END if_statement; ARCHITECTURE example1 OF if_statement IS BEGIN PROCESS (A, B, C, X) Z <= A; IF (X="1111") THEN Z<=B; ELSIF (X>"1000") THEN Z<=C; END IF; END PROCESS; END example1;
1. IF语句(续2) 例5.4 采用两种不同IF语句结构实现同一结构和功能的数据选择器。 ARCHITECTURE example2 OF if_statement IS BEGIN PROCESS (A, B, C, X) IF (X="1111") THEN Z<=B; ELSIF (X>"1000") THEN Z<=C; ELSE Z <= A; END IF; END PROCESS; END example2;
1. IF语句(续3) 例5.5 利用IF语句的多分支嵌套实现四选一多路选择器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY MUX_41 IS PORT (S1, S0, A, B, C, D : IN STD_LOGIC; Z : OUT STD_LOGIC ); END MUX_41; ARCHITECTURE BEHAV_MUX41 OF MUX_41 IS BEGIN P1: PROCESS (S1, S0, A, B, C, D) BEGIN IF S1='0' AND S0= '0' THEN Z <= A; ELSIF S1= '0' AND S0='1' THEN Z <= B; ELSIF S1= '1' AND S0='0' THEN Z <= C; ELSE Z <= D; END IF; END PROCESS P1; END BEHAV_MUX41;
1. IF语句(续4) 例5.6 利用IF语句的多分支嵌套实现四选一多路选择器的错误示例。 P1: PROCESS (S1, S0, A, B, C, D) BEGIN IF S1='0' AND S0= '0' THEN Z <= A; ELSIF S1= '0' AND S0='1' THEN Z <= B; ELSIF S1= '1' AND S0='0' THEN Z <= C; ELSIF S1= '1' AND S0='1' THEN Z <= D; END IF; END PROCESS P1;
5.2.3 顺序控制语句 2. CASE 语句 选择值可以有四种不同的表达方式: 单个普通数值,如选择值_1; 5.2.3 顺序控制语句 2. CASE 语句 CASE 表达式 IS WHEN 选择值_1 =>顺序语句; WHEN 选择值_2|选择值_3 =>顺序语句; WHEN 选择值_4 TO选择值_N =>顺序语句; WHEN OTHERS=>顺序语句; END CASE; 选择值可以有四种不同的表达方式: 单个普通数值,如选择值_1; 并列数值,如选择值_2|选择值_3,表示取值为选择值_2或者选择值_3; 数值选择范围,如选择值_4 TO 选择值_N,表示取值可以是该范围中的任意一个; 混合方式,以上三种方式的混合。
2. CASE 语句(续1) 例5.7 CASE 语句描述的8线-3线编码器。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY encoder_83 IS PORT (s: IN STD_LOGIC_VECTOR (7 DOWNTO 0); z: OUT STD_LOGIC_VECTOR (2 DOWNTO 0)); END encoder_83; ARCHITECTURE behavioral OF encoder_83 IS BEGIN PROCESS (s) CASE s IS WHEN "11111110" => z <= "000"; WHEN "11111101" => z <= "001"; WHEN "11111011" => z <= "010"; WHEN "11110111" => z <= "011"; WHEN "11101111" => z <= "100"; WHEN "11011111" => z <= "101"; WHEN "10111111" => z <= "110"; WHEN "01111111" => z <= "111"; WHEN OTHERS => z <= "XXX"; END CASE; END PROCESS; END behavioral;
2. CASE 语句(续2) 例5.8 整型数据类型的范围。 ENTITY range_1 IS PORT (A, B, C, X: IN INTEGER RANGE 0 TO 15; Z: OUT INTEGER RANGE 0 TO 15); END range_1; ARCHITECTURE example OF range_1 IS BEGIN PROCESS( A, B, C, X) BEGIN CASE X IS WHEN 0 => Z <= A; WHEN 7|9 => Z<=B; WHEN 1 TO 5 => Z<=C; WHEN OTHERS => Z<=0; END CASE; END PROCESS; END example;
2. CASE 语句(续3) 例5.9 数组数据类型范围的错误用法。 ENTITY range_2 IS PORT (A, B, C, X: IN BIT_VECTOR(3 DOWNTO 0); Z: OUT BIT_VECTOR(3 DOWNTO 0)); END range_2; ARCHITECTURE example OF range_2 IS BEGIN PROCESS(A, B, C, X) CASE X IS WHEN "0000" => Z <= A; WHEN "0111" | "1001" => Z <= B; --错误用法,数组元素没有大小关系 WHEN "0001" TO "0101" => Z <= C; WHEN OTHERS =>Z <= 0; END CASE; END PROCESS; END example;
5.2.3 顺序控制语句 3. LOOP 语句 FOR LOOP的语句格式如下: WHILE LOOP的语句格式如下: LOOP 标号: 5.2.3 顺序控制语句 3. LOOP 语句 FOR LOOP的语句格式如下: LOOP 标号: FOR 循环变量 IN 循环次数范围 LOOP 顺序语句 END LOOP LOOP 标号; WHILE LOOP的语句格式如下: LOOP标号: WHILE 循环控制条件 LOOP 顺序语句 END LOOP LOOP 标号;
3. LOOP 语句(续1) 例5.10 FOR LOOP语句使用示例。 ENTITY for_loop IS PORT(A: IN INTEGER RANGE 0 TO 3; Z: OUT BIT_VECTOR (3 DOWNTO 0)); END for_loop; ARCHITECTURE example OF for_loop IS BEGIN PROCESS(A) Z<="0000"; FOR i IN 0 TO 3 LOOP IF(A=i) THEN Z(i) <='1'; END IF; END LOOP; END PROCESS; END example;
3. LOOP 语句(续2) 例5.11 利用LOOP语句将向量转化为整数输出。 ENTITY conv_int IS PORT (vect: IN BIT_VECTOR (7 DOWNTO 0); result: OUT INTEGER); END conv_int; ARCHITECTURE A OF conv_int IS BEGIN PROCESS (vect) VARIABLE tmp: INTEGER; tmp:= 0; FOR i IN 7 DOWNTO 0 LOOP IF (vect (i) = '1') THEN tmp:= tmp + 2**i; END IF; END LOOP; result <= tmp; END PROCESS; END A; ARCHITECTURE B OF conv_int IS BEGIN PROCESS (vect) VARIABLE tmp: INTEGER; VARIABLE i: INTEGER; tmp:= 0; i:= vect' high WHILE (i >= vect' low) LOOP IF (vect (i) = '1') THEN tmp:= tmp + 2**i; END IF; i:= i - 1; --修改循环变量 END LOOP; result <= tmp; END PROCESS; END B;
5.2.3 顺序控制语句 4. NEXT语句和EXIT语句 NEXT的语句四种形式: EXIT语句四种形式: NEXT; 5.2.3 顺序控制语句 4. NEXT语句和EXIT语句 NEXT的语句四种形式: NEXT; NEXT LOOP标号; NEXT WHEN 条件表达式; NEXT LOOP标号 WHEN 条件表达式; EXIT语句四种形式: EXIT; EXIT LOOP标号; EXIT WHEN 条件表达式; EXIT LOOP标号 WHEN 条件表达式;
5.2.4 NULL语句 例5.12 NULL语句的应用示例。 空语句不会执行任何操作,其语句格式为:NULL; ENTITY EX_WAIT IS PORT ( CNTL: IN INTEGER RANGE 0 TO 31; A, B: IN STD_LOGIC_VECTOR(7 DOWNTO 0); Z: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END EX_WAIT; ARCHITECTURE arch_wait OF EX_WAIT IS BEGIN P_WAIT: PROCESS (CNTL) Z <=A; CASE CNTL IS WHEN 3 | 15 =>Z <= A XOR B; WHEN OTHERS =>NULL; END CASE; END PROCESS P_WAIT; END arch_wait;
5.2.5 WAIT语句 WAIT语句的语句格式有如下四种形式: 例5.13 利用WAIT语句描述的D触发器模块。 WAIT UNTIL 条件表达式; WAIT FOR 时间表达式; WAIT ON 信号列表; WAIT; 例5.13 利用WAIT语句描述的D触发器模块。 ENTITY FF IS PORT (D, CLK: IN BIT; Q: OUT BIT); END FF; ARCHITECTURE BEH_1 OF FF IS BEGIN PROCESS BEGIN WAIT UNTIL CLK= '1'; Q <= D; END PROCESS; END BEH_1;
5.2.6 进程语句 1. 进程语句的格式 2. 进程设计要点 进程标号:PROCESS ( 敏感信号参数列表 ) 进程说明部分 BEGIN 5.2.6 进程语句 1. 进程语句的格式 进程标号:PROCESS ( 敏感信号参数列表 ) 进程说明部分 BEGIN 顺序描述语句 END PROCESS 进程标号; 2. 进程设计要点 同一结构体中的多个进程之间是并行运行的,但每一进程中的逻辑描述语句是顺序运行的。 进程只能存在于结构体内。 一个进程的执行是事件触发的,或者将可能的事件源列在敏感信号参数表中,或者直接使用WAIT语句来控制进程的执行。 同一设计中的所有进程都是并行运行的,各进程彼此之间的通信是通过列于敏感信号参数表中的信号进行的。 如果使用了标号,那末在进程结束语句中必须重复标号。
5.2.6 进程语句(续1) 3. 进程语句设计实例 例5.14 进程中敏感信号参数表和IF语句的使用。 LIBRARY IEEE; 5.2.6 进程语句(续1) 3. 进程语句设计实例 例5.14 进程中敏感信号参数表和IF语句的使用。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY comp_list IS PORT (A, B, SEL: IN STD_LOGIC; Z: OUT STD_LOGIC); END comp_list; ARCHITECTURE RTL OF comp_list IS BEGIN PROCESS (A, B, SEL) BEGIN IF SEL = '1' THEN Z <= A; ELSE Z <= B; END IF; END PROCESS; END RTL;
3. 进程语句设计实例(续2) 例5.15 无复位十进制加法计数器的描述。 ARCHITECTURE A OF counter IS SIGNAL count: INTEGER RANGE 0 TO 15 ; BEGIN PROCESS(CLK) BEGIN IF CLK‘EVENT AND CLK = ’1‘ THEN IF (count >= 9) THEN count <= 0; ELSE count <= count+1; END IF; END IF; END PROCESS; Q <= count; END A; LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY counter IS PORT( CLK: IN STD_LOGIC; Q:OUT INTEGER RANGE 0 TO 15 ); END counter;
3. 进程语句设计实例(续3) 例5.16 带异步复位、置位端的D触发器描述。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ASYNC_FF IS PORT (D, CLK, SET, RST: IN STD_LOGIC; Q: OUT STD_LOGIC); END ASYNC_FF; ARCHITECTURE A OF ASYNC_FF IS BEGIN PROCESS (CLK, RST, SET) BEGIN IF(RST = ‘1’ ) THEN Q <= ‘0’; ELSIF SET =‘1’ THEN Q <= ‘1’; ELSIF (CLK‘ EVENT AND CLK = ’1‘ ) THEN Q <= D; END IF; END PROCESS; END A; END counter;
3. 进程语句设计实例(续4) 例5.17 移位寄存器的描述。 -- 基本移位寄存器的描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY basic_shift_register IS GENERIC ( num_stages : NATURAL := 16 ); PORT clk : IN STD_LOGIC; enable : IN STD_LOGIC; sr_in : IN STD_LOGIC; sr_out : OUT STD_LOGIC END ENTITY;
3. 进程语句设计实例(续5) 例5.17 移位寄存器的描述。 ARCHITECTURE rtl OF basic_shift_register IS -- 为基本移位寄存器构造一个数组类型 TYPE sr_length IS ARRAY ((num_stages-1) DOWNTO 0) OF STD_LOGIC; -- 声明移位寄存器内部信号 SIGNAL sr: sr_length; BEGIN PROCESS (clk) IF (clk' EVENT and clk = '1') THEN IF (enable = '1') THEN -- 左移一位,且最高位数据丢失 sr((num_stages-1) DOWNTO 1) <= sr((num_stages-2) DOWNTO 0); sr(0) <= sr_in; -- 装载最低位的新数据 END IF; END PROCESS; -- 在最高位数据丢失前将其输出 sr_out <= sr(num_stages-1); END rtl;
3. 进程语句设计实例(续6) 例5.17 移位寄存器的描述。 类属说明语句的一般书写格式如下: GENERIC( 常数名:数据类型:设定值; … 常数名:数据类型:设定值 ); 图5.8 例5.17的时序仿真图
3. 进程语句设计实例(续7) 例5.18 二进制加法/减法计数器的描述。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; ENTITY binary_up_down_counter IS GENERIC(min_count : NATURAL := 0; max_count : NATURAL := 255); PORT(clk : IN STD_LOGIC; reset : IN STD_LOGIC; enable : IN STD_LOGIC; updown : IN STD_LOGIC; q : OUT INTEGER RANGE min_count TO max_count); END ENTITY;
3. 进程语句设计实例(续8) 例5.18 二进制加法/减法计数器的描述。 ARCHITECTURE rtl OF binary_up_down_counter IS SIGNAL direction : INTEGER; --定义计数方向信号 BEGIN Proc1: PROCESS (updown) IF (updown = ‘1’) THEN direction <= 1; ELSE direction <= -1; END IF; END PROCESS Proc1; Proc2: PROCESS (clk) VARIABLE cnt: INTEGER RANGE min_count TO max_count; IF ( clk' EVENT and clk = '1' ) THEN IF reset = '1' THEN cnt := 0; --计数器复位 ELSIF enable = ‘1’ THEN cnt := cnt + direction; -- 加法/减法计数 q <= cnt; -- 输出当前计数值 END PROCESS Proc2; END rtl;
3. 进程语句设计实例(续9) 例5.18 二进制加法/减法计数器的描述。 例5.18的时序仿真图
5.3 结构描述语句 5.3.1 元件例化语句 1. 元件声明(Component Declaration) 所有准备使用的元件都需要通过元件声明语句声明,并必须放置在当前设计结构体中关键字BEGIN之前。 COMPONENT 例化元件名 IS GENERIC ( 类属表 ); PORT( 例化元件端口名表 ); END COMPONENT; 2.元件例化(Component Instantiation) 元件例化语句必须放置在当前设计结构体中关键字BIGIN之后的说明部分。 例化元件标号:例化元件名 PORT MAP( 端口映射表 );
5.3.1 元件例化语句(续1) 例5.22 16进制加法计数器的描述 LIBRARY IEEE; 例5.22 16进制加法计数器的描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; ENTITY counter_16 IS PORT( Clk : IN STD_LOGIC; reset : IN STD_LOGIC; enable : IN STD_LOGIC; out_q : OUT INTEGER RANGE 0 TO 16 ); END ENTITY;
5.3.1 元件例化语句(续2) 例5.22 16进制加法计数器的描述 ARCHITECTURE inst OF counter_16 IS 例5.22 16进制加法计数器的描述 ARCHITECTURE inst OF counter_16 IS COMPONENT binary_up_down_counter IS GENERIC ( min_count : NATURAL := 0; max_count : NATURAL := 16 --更改了最大计数值); PORT( clk : IN STD_LOGIC; reset : IN STD_LOGIC; enable : IN STD_LOGIC; updown : IN STD_LOGIC:= '1';--只保留加法计数 q : OUT INTEGER RANGE min_count TO max_count ); END COMPONENT binary_up_down_counter; BEGIN u1: binary_up_down_counter PORT MAP( clk => clk, reset => reset, enable => enable, q => out_q ); END inst;
5.3.1 元件例化语句(续3) 例5.22 16进制加法计数器的描述 例5.22的时序仿真图
5.3.2 配置语句 例5.23 一位全加器中配置语句的使用。 CONFIGURATION 配置名 OF 实体名 IS FOR 选配结构体名 配置说明 END FOR; END 配置名; 例5.23 一位全加器中配置语句的使用。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY fulladder_cfg IS PORT (a, b, ci: IN STD_LOGIC; S, co: OUT STD_LOGIC); END fulladder_cfg;
5.3.2 配置语句(续1) 例5.23 一位全加器中配置语句的使用。 例5.23 一位全加器中配置语句的使用。 ARCHITECTURE behavioral OF fulladder_cfg IS --以下是一位全加器结构体行为描述 BEGIN S <= '1' WHEN (a= '0' AND b= '1' AND ci= '0') ELSE '1' WHEN (a= '1' AND b= '0' AND ci= '0') ELSE '1' WHEN (a= '0' AND b= '0' AND ci= '1') ELSE '1' WHEN (a= '1' AND b= '1' AND ci= '1') ELSE '0'; co <= '1' WHEN (a= '1' AND b= '1' AND ci= '0') ELSE '1' WHEN (a= '0' AND b= '1' AND ci= '1') ELSE '1' WHEN (a= '1' AND b= '0' AND ci= '1') ELSE END behavioral; ARCHITECTURE Dataflow OF fulladder_cfg IS --以下是一位全加器结构体数据流描述 S <= a XOR b XOR ci; co <= (a AND b) OR (b AND ci) OR (a AND ci); END Dataflow; --以下是结构体的配置 CONFIGURATION first OF fulladder_cfg IS FOR behavioral END FOR; END first; END fulladder_cfg;
5.3.2 配置语句(续2) 例5.24 四位串行加法器的结构描述。 LIBRARY IEEE; 例5.24 四位串行加法器的结构描述。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --以下是四位串行加法器的实体描述 ENTITY fulladder_4 IS PORT (ain, bin : IN STD_LOGIC_VECTOR(3 DOWNTO 0); Cin : IN STD_LOGIC; Sum : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); Coun t: OUT STD_LOGIC); END fulladder_4; --以下是四位全加器结构体描述 ARCHITECTURE inst OF fulladder_4 IS -- 假定fulladder_cfg已在work目录中,且结构体没有配置 COMPONENT fulladder_cfg IS PORT (a, b, ci: IN STD_LOGIC; s, co: OUT STD_LOGIC); END COMPONENT; SIGNAL carry: STD_LOGIC_VECTOR(3 DOWNTO 1); --定义内部进位信号 BEGIN u1: fulladder_cfg PORT MAP(a => ain(0), b => bin(0), ci => cin, s => sum(0), co => carry(1) ); u2: fulladder_cfg PORT MAP( a => ain(1), b => bin(1), ci => carry(1), s => sum(1), co => carry(2) ); u3: fulladder_cfg PORT MAP(a => ain(2), b => bin(2), ci => carry(2), s => sum(2), co => carry(3) ); u4: fulladder_cfg PORT MAP(a => ain(3), b => bin(3), ci => carry(3), s => sum(3), co => count ); END inst;
5.3.2 配置语句(续3) 例5.24 四位串行加法器的结构描述。 --以下是一位全加器的结构体配置 例5.24 四位串行加法器的结构描述。 --以下是一位全加器的结构体配置 CONFIGURATION sel OF fulladder_4 IS FOR inst FOR u1,u2: fulladder_cfg USE ENTITY WORK.fulladder_cfg(behavioral); END FOR; FOR OTHERS: fulladder_cfg --本例中为u3、u4 USE ENTITY WORK.fulladder_cfg(Dataflow); END sel;
5.3.3 生成语句 生成语句的语句格式有如下两种形式: 标号:FOR 循环变量 取值范围 GENERATE 说明语句 BEGIN 并行语句 5.3.3 生成语句 生成语句的语句格式有如下两种形式: 标号:FOR 循环变量 取值范围 GENERATE 说明语句 BEGIN 并行语句 END GENERATE 标号; 标号: IF 条件 GENERATE
5.3.3 生成语句(续1) 例5.25 带异步复位、置位端的4位D触发器的描述。 LIBRARY IEEE; 5.3.3 生成语句(续1) 例5.25 带异步复位、置位端的4位D触发器的描述。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --4位D触发器的实体描述 ENTITY ASYNC_FF_4 IS PORT (D, SET : IN STD_LOGIC_VECTOR(3 DOWNTO 0); CLK, RST: IN STD_LOGIC; Q: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ASYNC_FF_4; --4位D触发器的结构体描述 ARCHITECTURE GENER OF ASYNC_FF_4 IS COMPONENT ASYNC_FF -- 需要确定ASYNC_FF已在work库中 PORT (D, CLK, SET, RST: IN STD_LOGIC; Q: OUT STD_LOGIC); END COMPONENT;
5.3.3 生成语句(续2) 例5.25 带异步复位、置位端的4位D触发器的描述。 BEGIN lable: 5.3.3 生成语句(续2) 例5.25 带异步复位、置位端的4位D触发器的描述。 BEGIN lable: FOR i IN 3 DOWNTO 0 GENERATE U1: ASYNC_FF PORT MAP( D => D(i), CLK => CLK, SET => SET(i), RST => RST, Q => Q(i) ); END GENERATE lable; END GENER;
5.3.4 块语句 块语句应用只是一种将结构体中的并行描述语句进行组合的方法,它的主要目的是改善并行语句及其结构的可读性。 5.3.4 块语句 块语句应用只是一种将结构体中的并行描述语句进行组合的方法,它的主要目的是改善并行语句及其结构的可读性。 块标号:BLOCK 接口说明 类属说明 BEGIN 并行语句 END BLOCK 块标号;
5.3.4 块语句(续) 例5.27 块语句应用示例1。 LIBRARY IEEE; 5.3.4 块语句(续) 例5.27 块语句应用示例1。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY block_test IS PORT(a, b: IN STD_LOGIC; s, c :OUT STD_LOGIC ); END; ARCHITECTURE example OF block_test IS BEGIN rr1:BLOCK --块定义 PORT(a1,b1:IN STD_LOGIC;--块中的端口定义 s1: OUT STD_LOGIC; c1: OUT STD_LOGIC); PORT MAP(a1=>a,b1=>b,s1=>s,c1=>c);--端口映射说明 p1:PROCESS(a1,b1)--使用的是块定义的局部变量 s1 <= a1 XOR b1; END PROCESS p1; p2:PROCESS(a1,b1) c1 <= a1 AND b1; END PROCESS p2; END BLOCK rr1; END ARCHITECTURE example;
本章小结 结构体描述语句分为顺序语句和并行语句两大基本系列, 其中顺序语句是按照代码的书写顺序一条一条顺序执行的, 描述的是硬件电路中各支路信号传输的特性;而并行语句 具有多进程并发性,各并行语句是同时执行的,与其书写 顺序无关,很好地描述了硬件电路中各分支电路同时并行 工作的特性。 结构体的描述有行为描述、数据流描述和结构描述三种方 式。 行为描述语句包括赋值语句、并行信号赋值语句、顺序控 制语句、NULL语句、WAIT语句和进程语句。 结构描述语句包括元件例化语句、配置语句、生成语句和 块语句。