VHDL学习:

发布于 2023-06-13  203 次阅读


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;

时光会把你雕刻成你应有的样子。