一周掌握 FPGA VHDL Day 2

2020-12-30 14:51:01 浏览数 (1)

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来的是一周掌握 FPGA VHDL Day 2,今天开启第二天,带来VHDL的基本结构,话不多说,上货。每日十分钟,坚持下去,量变成质变。

VHDL的基本结构

二、VHDL的基本结构

  • 实体(Entity):描述所设计的系统的外部接口信号,定义电路设计中所有的输入和输出端口;
  • 结构体 (Architecture):描述系统内部的结构和行为;
  • 包集合 (Package):存放各设计模块能共享的数据类型、常数和子程序等;
  • 配置 (Configuration):指定实体所对应的结构体;
  • 库 (Library):存放已经编译的实体、结构体、包集合和配置。

VHDL的基本设计单元结构:程序包说明、实体说明和结构体说明三部分。

代码语言:javascript复制
LIBRARY IEEE; -- 库、程序包的说明调用 USE IEEE.Std_Logic_1164.ALL;

ENTITY FreDevider IS -- 实体声明 PORT
(Clock: IN Std_logic;
Clkout: OUT Std_logic
);
END;

ARCHITECTURE Behavior OF FreDevider IS -- 结构体定义
SIGNAL Clk:Std_Logic;
BEGIN
  PROCESS(Clock)
BEGIN
  IF rising_edge(Clock) THEN
    Clk<=NOT Clk;
  END IF;
END PROCESS;
Clkout<=Clk;
END;

2.1 实体(Entity)

实体描述了设计单元的输入输出接口信号或引脚,是设计实体经封装后对外的一个通信界面。

代码语言:javascript复制
ENTITY 实体名 IS
[ GENERIC(常数名:数据类型:设定值)] 

PORT
( 端口名1:端口方向 端口类型;
端口名2:端口方向 端口类型;
..
端口名n:端口方向 端口类型 );

END [实体名];

实体名由设计者自由命名,用来表示被设计电路芯片的名 称,但是必须与VHDL程序的文件名称相同。要与文件名一致;

  • 类属说明

类属为设计实体与外界通信的静态信息提供通道,用来规定端口的大小、实体中子元件的数目和实体的定时特性等。

格式:

GENERIC(常数名:数据类型:设定值;∶常数名:数据类型:设定值)

例如:

代码语言:javascript复制
GENERIC(wide:integer:=32);--说明宽度为32
GENERIC(tmp:integer:=1ns);--说明延时1 ns
  • 端口方向:IN, OUT,INOUT,BUFFER

“OUT”和“BUFFER”都可定义输出端口;

若实体内部需要反馈输出信号,则输出端口必须被 设置为“BUFFER”,而不能为“OUT”。

  • 同方向、同类型的端口可放在同一个说明语句中。
代码语言:javascript复制
ENTITY Full_adder IS
PORT( a, b, c: IN BIT;sum, carry: OUT BIT
);
END Full_adder;

2.2 结构体(Architecture)

结构体定义了设计单元具体的功能,描述了该基本设计单元的行为、元件和内部的连接关系。

代码语言:javascript复制
ARCHITECTURE 结构体名 OF 实体名 IS
[声明语句] BEGIN
功能描述语句
END [结构体名];

[声明语句]--用于声明该结构体将用到的信号、数据类型、常数、子程序和元件等。声明的内容是局部的。

功能描述语句--具体描述结构体的功能和行为。

  • 一个实体可对应多个结构体,每个结构体代表该实体功能的不同实现方案或不同实现方式。同一时刻只有一个结构体起作用,通过CONFIGURATION决定用哪个结构体进行仿真或综合。
  • 在结构体描述中,具体给出了输入、输出信号之间的逻辑关系。
代码语言:javascript复制
ARCHITECTURE Behavior OF FreDevider IS -- 结构体定义
SIGNAL Clk:Std_Logic; --信号声明 
BEGIN
  PROCESS(Clock)
BEGIN
  IF rising_edge(Clock) THEN
    Clk<=NOT Clk;
  END IF;
END PROCESS;
  Clkout<=Clk;
END;
代码语言:javascript复制
IF rising_edge(Clock) THEN
    Clk<=NOT Clk;
END IF;

表示顺序语句;

代码语言:javascript复制
PROCESS(Clock)
BEGIN
    IF rising_edge(Clock) THEN
        Clk<=NOT Clk;
    END IF;
END PROCESS;

表示进程;

代码语言:javascript复制
BEGIN
  PROCESS(Clock)
BEGIN
  IF rising_edge(Clock) THEN
    Clk<=NOT Clk;
  END IF;
END PROCESS;
  Clkout<=Clk;
END;

表示功能描述语块。

2.3 库、程序包的调用

代码语言:javascript复制
LIBRARY 库名; USE 库名.程序包名.项目名;
LIBRARY IEEE; 
USE IEEE.Std_Logic_1164.ALL;//调用此程序包中所有的资源
代码语言:javascript复制
LIBRARY IEEE; 
USE IEEE.Std_Logic_1164.ALL;
USE IEEE.Std_Logic_Arith.ALL;
USE IEEE.Std_Logic_Unsigned.ALL;

Day 2 就到这里,Day 3 继续开始VHDL语句相关内容。

END

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

0 人点赞