FPGA学习笔记01-VHDL语法基础-顺序语句
一、IF语句
- 用于门闩控制的IF语句;
if 条件 then q <= d; end if;
当门闩条件成立时,输出端口再现输入端口的值,当条件不成立时,输出值不变化;
2. 用于二选一的IF控制语句;
if (sel = '1') then c <= a; else c <= b; end if;
当二选一控制条件成立时,输出端C等于输入端a;当条件不成立时,输出端C等于输入端a;
3. 用于多选择控制的IF语句;
if 条件1 then <顺序语句1> elsif 条件2 then <顺序语句2> ... elsif 条件n then <顺序语句n> else <顺序语句n+1> end if;
当条件1成立,执行顺序语句1;当条件2成立,执行顺序语句2;当条件n成立,执行顺序语句;当所有条件都不成立,执行顺序语句n+1;
- IF语句指明的条件是布尔量,所有IF语句的条件表达式中只能用逻辑运算符和关系运算符;
- IF判断条件不可以随便颠倒顺序(例,优先级编码器);
二、CASE语句
CASE 条件表达式 IS WHEN 条件表达式 => 顺序处理语句; END CASE;
与IF语句有序处理不同的是,CASE语句的所有表达式是无序处理的;
三、LOOP语句
- FOR-LOOP语句
FOR 循环变量 IN 0 TO N LOOP <顺序语句> END LOOP;
关于FOR-LOOP语句需要注意的地方是:
- 循环变量i只能出现在进程中,不能出现在进程之间;
- FOR-LOOP语句常用于迭代电路当中;
- 按位操作,移位赋值,奇偶校验等应用;
- 在满足条件执行语句的条件下,顺序语句被执行N次,只不过每次顺序语句当中的循环变量被赋予不同的值;
例子1:使用FOR-LOOP语句仿真迭代电路:<modelsim>
1 library ieee; 2 use ieee.std_logic_1164.all; 3 use ieee.std_logic_arith.all; 4 use ieee.std_logic_unsigned.all; 5 6 entity sim_loop is 7 port( 8 sysclk : in std_logic; 9 rst_n : in std_logic; 10 11 result : out std_logic_vector(7 downto 0) 12 ); 13 end entity; 14 15 architecture a1 of sim_loop is 16 17 constant b : std_logic_vector(7 downto 0):= "10101010"; 18 19 begin 20 21 process(sysclk,rst_n) 22 variable tmp : std_logic_vector(7 downto 0):= (others =>'0'); 23 begin 24 if rst_n = '0' then 25 26 elsif rising_Edge(sysclk) then 27 28 for i in 0 to 6 loop 29 tmp(i+1) := tmp(i) xor b(i); 30 end loop; 31 result <= tmp; 32 33 end if; 34 end process; 35 36 end a1;
例子2:FOR-LOOP 语句也通常用于奇偶校验位的判断:b = 10101010
1 process(sysclk) 2 variable tmp : std_logic; 3 begin 4 if rising_edge(sysclk) then 5 tmp:='0'; 6 for i in 0 to 7 loop 7 tmp := tmp xor b(i); 8 end loop; 9 result <= tmp; 10 end if; 11 end process;
result = 偶校验位 = ’0‘;