VHDL提供五个库,IEEE库、STD库、VITAL库、自定义库和WORK库。
IEEE库常用程序包:std_logic_1164:常用数据类型(std_logic及std_logic_vector数据类型)和函数定义。std_logic_arith、std_logic_unsigned、std_logic_signed.
实体说明:
entity 实体名 is
port(端口名称1:端口方式1 端口类型1;
端口名称1:端口方式1 端口类型1);
end 实体名;
--端口方式:in、out、inout、buffer(在结构体内部可作反馈)、linkage(可与任何方向信号连接)
结构体说明:
architecture 结构体名称 of 实体名 is
结构体说明部分;
begin
结构体并行语句部分;
end 结构体名称;
数据对象:constant(常量)、variable(变量)、signal(信号)
数据类型:integer、real、bit、bit_vector(位矢量)、boolean、character、time、natural(自然数)、positive(正整数)、string。
自定义数据类型:
type 数据类型名 is 数据类型定义;
type 数据类型名 is integer range 整数范围;
--type percent is integer range -100 to 100;
逻辑运算符:not(取反)、and(与)、or(或)、nand(与非)、nor(或非)、xor(异或)
算术运算符:+、-、*、/、mod(求模)、rem(取余)、**(指数)、abs(绝对值)
if语句:
if 条件1 then
第一顺序语句;
elsif 条件2 then
第二顺序语句;
else
语句;
end if;
case语句:
case 条件表达式 is
when 条件表达式的值 => 语句;
....
when 条件表达式的值 => 语句;
end case;
loop语句:
循环标号: for 循环变量 in 范围 loop
语句;
end loop 循环标号;
循环标号: while 条件表达式 loop
语句;
end loop 循环标号;
next跳出循环语句: next 循环标号 when 条件表达式;
exit退出循环语句。
null语句:空操作
时钟激励:
--占空比50%时钟激励
-- 方法一:利用并行赋值等待语句(推荐)
clk <= not clk after <period/2>;
-- 方法二:利用串行有限等待语句
CLK_GEN: process
begin
clk <= '0';
wait for <period/2>;
clk <= '1';
wait for <period/2>;
end process;
--
--高、低电平参数时钟激励
-- 方法一:利用并行赋值等待语句
clk <= '1' after <LOW_TIME> when clk = '0'
else '0' after <HIGH_TIME>;
-- 方法二:利用串行有限等待语句
CLK_GEN: process
begin
clk <= '0';
wait for <LOW_TIME>;
clk <= '1';
wait for <HIGH_TIME>;
end process;
--
--循环执行process
process
begin
clk <= '0';
wait for <period/2>; -- 延时等待语句
clk <= '1';
wait for <period/2>; -- 延时等待语句
end process;
--
--单次执行process
-- 方法一:利用并行赋值等待语句
<signal_name> <= '0', '1' after <time1>, '0' after <time2>,
'1' after <time3>, ... , '0' after <timeN>;
-- 如生成一个初始为0,经过20ns变1,再经过20ns(即time2-time1)变0的复位信号,如下所示:
reset <= '0', '1' after 20 ns, '0' after 40 ns;
-- 方法二:利用无限等待语句wait
process
begin
wait for <wait_time1>; -- 激励生成时间
<statement1>; -- 激励信号
wait for <wait_time2>;
<statement2>;
...
wait for <wait_timeN>;
<statementN>;
wait; -- 无限等待
end process;
-- 方法三:利用条件语句
signal flag : std_logic := '1';
process
begin
if (flag = '1') then
<statement1>;
flag <= '0';
end if;
wait for clk_period;
end process;
Comments | NOTHING