VHDL小记
本文最后更新于:2 年前
基本结构
Library ieee;
Use ieee.std_logic_1164.all; --调库,调包
Entity mux21a is --实体,和文件同名
port(a, b, c: in std_logic; --定义输入输出
d: out std_logic); --输出信号不可读!输入信号不可写!
End entity mux21a;
Architecture one of mux21a is --结构体
Begin
... --其他语句
[名字]: Process (a, b, c) --进程,结构体可以包含多个语句和进程
Begin
...
End process [名字];
End Architecture one;
其中进程中的内容和常规编程思路一致,运行顺序同书写顺序;
而结构体中的其他语句是并发执行的,和书写顺序无关;
故顺序语句(if for
等等)只能出现在进程当中,并行语句(选择、条件赋值语句,元件例化语句)不能放在进程中;
整个 Process
也可看成其他语句的一部分,在括号中的内容 (a, b, c)
改变时进入进程
语法
常用顺序执行的语句:
if ... then ...;
elsif ...;
else ...;
end if;
for i in 0 to 7 loop
...;
end loop;
注意选择信号赋值语句:
WITH 选择表达式 SELECT
赋值目标信号 <= 表达式1 WHEN 选择值 1,
表达式2 WHEN 选择值 2,
表达式n WHEN OTHERS;
是一个并行语句,不具备优先级,所以它必须指明所有可能的情况或者指定others,且它的条件必须互斥,不能重叠;
而条件信号赋值语句:
赋值目标信号 <= 表达式1 WHEN 赋值条件1 ELSE
表达式2 WHEN 赋值条件2 ELSE
表达式n WHEN 赋值条件n ELSE
表达式;
也是一个并行语句,但它在赋值时按照优先级从上到下赋值,所以允许条件重叠(最后一条相当于没有条件的ELSE,保证了全覆盖);
CASE语句:
CASE <表达式> IS
WHEN <选择值> => <顺序语句>; ... ; <顺序语句>;
WHEN <选择值> => <顺序语句>; ... ; <顺序语句>;
...
WHEN OTHERS => <顺序语句>;
END CASE;
是顺序语句,必须指明所有可能的情况或者指定others,条件允许重叠
变量和信号
变量是电路内部的操作,代表临时数据,可以认为是一个局部变量;
信号代表的是电路单元,代表真实电路,是全局变量,不能在进程和子进程中定义;
Signal 名称: 类型:= 初始值;
variable 名称: 类型:= 初始值;
变量 := 赋值;
信号 <= 赋值;
赋值时,变量是立即赋值的,而信号会延迟赋值
常用类型:std_logic
和 std_logic_vector
一般把一个 std_logic
当成一位01信号,而事实上它可以存储9种信号(另有:’X’表示未知,’U’表示未设置,’-‘表示不关心等等),用于充分地表达一处电路线上的真实情况。
用行为描述方式时,两个同位的 std_logic_vector
可以直接相加
元件例化、生成语句
注意将元件加入library的方法
--定义和调用
Architecture one of add4 is
Component add1
port(
a, b, ci: in std_logic;
co, f: out std_logic
);
End component;
...
begin
--调用
[随便写个名字]: add1 port map(, ,co => x ,);
--可以一一对应,也可以使用上述方式指定co端口接x(位置关联和名字关联)
--测试了一下,混合关联好像会有另外的要求,(a=>ai, b=>bi, f)就不行 建议不用
元件例化的调用是一个并行语句,不能写在process里面
生成语句:
[随便写个名字]: for i in 0 to 7 generate
Begin
--并行语句
End generate;
生成语句循环内的是并行语句,但调用是从0到7按顺序的
可以认为整个for是一个并行语句,不能放进process,但其执行时是按顺序的,每一步又是并行地执行块(个人理解)
边沿判定
clk'event and clk = '1'; --上升沿判定
clk'event and clk = '0'; --下降沿判定
--发生'event事件时,clk已经变化
rising_edge(clk); --上升沿判定
falling_edge(clk); --下降沿判定
描述方式
逻辑综合:指将电路的行为级描述(代码)转化成门级电路的过程,以供硬件使用
VHDL的三种描述风格:
- 行为描述方式:和高级语言比较接近,大量使用算数运算,关系运算等等,一般只用于系统仿真,难以进行逻辑综合。要使用算数运算,需要
use ieee.std_logic_unsigned.all;
- 数据流描述方式:即表示行为也隐含地表示了结构,一般用布尔方程和并行赋值语句实现,可以进行逻辑综合。
- 结构化描述方式:多层次,常用元件例化,生成语句,可以进行逻辑综合。
其他
A nand B --与非(不是不等于)