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_logicstd_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 --与非(不是不等于)

VHDL小记
http://www.lxtyin.ac.cn/2021/12/19/2021-12-19-VHDL小记/
作者
lx_tyin
发布于
2021年12月19日
许可协议