VHDL硬件描述语言(2.1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.3.1 转向控制语句 转向控制语句
转向控制语句通过条件控制开关决定是否执 行一条或几条语句,或重得执行一条或几条语句, 或跳过一条或几条语句。 分为五种: if 语句、case 语句、 loop 语句、next 语句、 exit 语句
3
1、 if 语句 、
if 语句执行一序列的语句,其次序依赖于一 个或多个条件的值。 1)if 语句的门闩控制 ) if 条件 then 顺序处理语句; end if ; 例: if (ena = ‘1’) then q <= d; end if; 综合后生成锁存器(latch)
12
2、 case 语句 、
case 语句常用来描述总线或编码、译码行为。 可读性比if 语句强。 格式如下: case 表达式 is when 分支条件 => 顺序处理语句; when 分支条件 => 顺序处理语句;
when 分支条件 => 顺序处理语句; end case;
13
其中的分支条件可有以下的形式:
19
WHEN "0110" => LED7S <= "1111101" ; -- X"7D"'6 WHEN "0111" => LED7S <= "0000111" ; -- X"07"'7 WHEN "1000" => LED7S <= "1111111" ; -- X"7F"'8 WHEN "1001" => LED7S <= "1101111" ; -- X"6F"'9 --WHEN "1010" => LED7S <= "1110111" ; -- X"77"'10 --WHEN "1011" => LED7S <= "1111100" ; -- X"7C"'11 --WHEN "1100" => LED7S <= "0111001" ; -- X"39"'12 --WHEN "1101" => Biblioteka BaiduED7S <= "1011110" ; -- X"5E"'13 --WHEN "1110" => LED7S <= "1111001" ; -- X"79"'14 --WHEN "1111" => LED7S <= "1110001" ; -- X"71"'15 WHEN OTHERS => NULL ; END CASE ; END PROCESS ; END ;
7
3)if 语句的多选择控制 ) if 语句的多选择控制又称为 if 语句的嵌套。 格式: if 条件 then 顺序处理语句; elsif 条件 then 顺序处理语句; ┇ elsif 条件 then 顺序处理语句; else 顺序处理语句; end if;
8
典型电路是多选一(四选一)电路。
5.3 VHDL顺序语句(Sequential) 顺序语句( 顺序语句 )
ENTITY
ARCHITECTURE Process Process ports
Sequential Process Combinational Process
ports
component
硬件执行:并发执行(VHDL本质) 仿真执行:顺序执行、并发执行 分为两大类:顺序(Sequential)描述语句 并发(Concurrent)描述语句
11
elsif input(3)=‘0’ then output<=“100”; elsif input(2)=‘0’ then output<=“101”; elsif input(1)=‘0’ then output<=“110”’; else output<=“111”; end if; end process; end art;
10
architecture art of coder is begin process(input) begin if input(7)=‘0’ then output<=“000”; elsif input(6)=‘0’ then output<=“001”; elsif input(5)=‘0’ then output<=“010”; elsif input(4)=‘0’ then output<=“011”;
18
BEGIN PROCESS( A ) BEGIN CASE A(3 DOWNTO 0) IS WHEN "0000" => LED7S <= "0111111" ; -- X"3F"'0 WHEN "0001" => LED7S <= "0000110" ; -- X"06"'1 WHEN "0010" => LED7S <= "1011011" ; -- X"5B"'2 WHEN "0011" => LED7S <= "1001111" ; -- X"4F"'3 WHEN "0100" => LED7S <= "1100110" ; -- X"66"'4 WHEN "0101" => LED7S <= "1101101" ; -- X"6D"'5
17
例1:七段数码管驱动电路(电子时钟的 :七段数码管驱动电路(电子时钟的DISP) ) LIBRARY IEEE ; USE IEEE.STD_LOGIC_1164.ALL ; ENTITY segment7 IS PORT ( A : IN STD_LOGIC_VECTOR(3 DOWNTO 0) ; LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) ) ; END ; ARCHITECTURE one OF segment7 IS
23
行为描述形式
end behave;
课堂作业: 请分别用行为描述和寄存器传输级 描述方式分别编写3输入的与非门电路 描述方式分别编写 输入的与非门电路
24
3、 Loop 语句 、
loop 语句与其它高级语言中的循环语句相 似。Loop 语句有三种格式。 1)无限 loop 语句 ) [loop_label]:LOOP --sequential statement EXIT loop_label ; END LOOP; VHDL重复执行 loop 循环内的语句,直至遇 到 exit 语句结束循环。
15
例:用case 语句描述四选一电路
16
例:case 语句的误用 signal value : integer range 0 to 15 ; signal out_1 : bit ; case value is -- 缺少 when条件语句 end case ; case value is -- 分支条件不包含2到15 when 0 => out_1 <= ‘1’ ; when 1 => out_1 <=‘0’ ; end case ; case value is -- 在5到10上发生重叠 when 0 to 10 => out_1 <= ‘1’ ; when 5 to 15 => out_1 <= ‘0’ ; end case ;
28
FOR N IN 0 TO 7 LOOP TMP:=TMP XOR a(N); END LOOP; Y<= TMP; END PROCESS; END ART;
29
8位奇校验电路仿真结果:
30
将变量tmp的初值改为‘0’,则为偶校验电路:
31
4、 Next 语句 、
在loop 语句中 next语句用来跳出本次循环。 格式: next [标号] [when 条件表达式]; 分三种情况: 1) next ; 无条件终止当前的循环,跳回到本次循环 LOOP语句开始处,开始下次循环。
20
例2:2输入的与门电路描述
library ieee; use ieee.std_logic_1164.all; entity and22j is port(a:in std_logic; b:in std_logic; y:out std_logic); end and22j; architecture behave of and22j is begin p1:process(a,b)
21
variable comb:std_logic_vector(1 downto 0); begin comb:=a & b; case comb is when "00"=>y<='0'; when "01"=>y<='0'; when "10"=>y<='0'; when "11"=>y<='1'; when others=>y<='X'; end case; end process p1; end behave;
9
if_then_elsif 语句中隐含了优先级别的判断, 最先出现的条件优先级最高,可用于设计具有优 先级的电路。如8-3优先级编码器。 library ieee; use ieee.std_logic_1164.all; entity coder is port(input: in std_logic_vector(7 downto 0); output: out std_logic_vector(2 downto 0)); end coder;
22
寄存器传输级 描述形式
例3:2输入的与门电路描述
library ieee; use ieee.std_logic_1164.all; entity and22 is port(a:in std_logic; b:in std_logic; y:out std_logic); end and22; architecture behave of and22 is begin y<=a and b;
27
例:用 for … loop 语句描述的8位奇校验电路
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY P_CHECK IS PORT (a:IN STD_LOGIC_VECTOR(7 DOWNTO 0); Y:OUT STD_LOGIC); END P_CHECK; ARCHITECTURE ART OF P_CHECK IS BEGIN PROCESS(A) variable TMP:STD_LOGIC; BEGIN TMP:='1';
1
顺序描述语句: 执行顺序与书写顺序一致,与传统软件设计 语言的特点相似。顺序语句只能用在进程与子程 序中。 可描述组合逻辑、时序逻辑。 常用的顺序描述语句: 赋值语句; if语句;case语句;loop语句; next语句;exit语句;子程序;return语句; wait语句;null语句。
2
when when when
值 => 顺序处理语句; 值 to 值 => 顺序处理语句; 值|值|值|…|值 => 顺序处理语句;
以上三种方式的混合; when others => 顺序处理语句;
14
Case 语句使用注意: 1)分支条件的值必须在表达式的取值范围内。 2)两个分支条件不能重叠。 3)CASE语句执行时必须选中,且只能选中 一个分支条件。 4)如果没有 others 分支条件存在,则分支条 件必须覆盖表达式所有可能的值。 对std_logc, std_logic_vector数据类型要特 别注意使用others分支条件。
4
条件改为时钟沿,则生成 D触发器:
5
2)if 语句的二选择控制 ) 格式: if 条件 then 顺序处理语句; else 顺序处理语句; end if ; 用条件来选择两条不同程序执行的路径。
6
此描述的典型电路是二选一电路: architecture rtl of mux2 is begin process(a, b, sel) begin if (sel = ‘1’) then y <= a ; else y <= b ; end if ; end process ; end rtl ;
25
例1: …… L2: loop a:=a+1; exit L2 when a >10; end loop L2; ……
26
2)for … loop 语句 ) [标号]:for 循环变量 in 离散范围 顺序处理语句; end loop [标号]; loop
特点: ①循环变量是 loop 内部自动声明的局部量,仅 在 loop 内可见;不需要指定其变化方式。 ②离散范围必须是可计算的整数范围: 整数表达式 to 整数表达式 整数表达式 downto 整数表达式