VHDL的基本语法(一)

news/2024/10/18 18:29:02/

1 VHDL基本结构

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

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

在这里插入图片描述

1.1 实体 Entity

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

定义方式:
在这里插入图片描述
注意:实体名由设计者自由命名,用来表示倍设计电路芯片的名称,但是必须与VHDL程序的文件名称相同。要与文件名一致
在这里插入图片描述

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

在这里插入图片描述

2 结构体

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

定义方式:
在这里插入图片描述

提示:

  1. 声明语句的作用:用于声明该结构体将用到的信号、数据类型、常熟、子程序和元件等。声明的内容是局部的。
  2. 功能描述语句:具有描述结构体的功能和行为。

一个实体可对应多个结构体,每个结构体代表该实体功能的不同实现方案或不同实现方式。同一时刻只有一个结构体起作用,通过configuration 决定用哪个结构体进行仿真或综合。

在结构体描述中,具体给出了输入、输出信号之间的逻辑关系。

在这里插入图片描述

3 VHDL语句

3.1 并行语句

在结构体中的执行是同时进行,执行顺序与书写顺序无关。如下图所示:

在这里插入图片描述
并行信号赋值

  1. 简单赋值语句
    在这里插入图片描述
  2. 选择信号赋值语句
    在这里插入图片描述
    例子:
    实现一个四乘一多路选择器,当选择信号为00 则输出信号为data0的数据,选择为01输出data1的信号,一次类推;

在这里插入图片描述
程序如下:

library ieee:
use ieee.std_logic_1164.all;
entity mux is
port(data0,data1,data2,data3: in std_logic_vector(7 downto 0);sel : IN std_logic_vector(1 downto 0);dout: out std_logic_vector(7 downto 0);
);
end;
architecture dataflow of mux is
beginwith sel selectdout <= data0 when "00",data1 when "01",data2 when "10",data3 when "11","00000000" when others;	
end

3.2 进程语句

进程语句定义顺序语句模块,用于将从外部获得的信号值,或内部的运算数据向其他的信号进行赋值。

  1. 进程本身是并行语句,但内部是顺序语句
  2. 进程只有在特定的时刻(敏感信号发生变化)才会被激活。
    在这里插入图片描述
    在这里插入图片描述
    例子1:
    把clock设为敏感信号,当clock上升沿时,输出时钟就进行取反一次。
    程序如下:
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;
beginprocess(C)
end

例子2:
本例子做一个自加器,每遇到一个clock的上升沿,num就自加1,加到3就自动清零,重新开始,循环及进行,还有一个复位按钮,只要检测是reset的值为1,num的数值就清零,重新开始计数。

代码如下:

library ieee;
use ieee.std_logic_1164.all;entity Counter is
port(reset: in std_logic;  // 异步时钟复位信号clock: in std_logic;	// 时钟信号num : buffer integer range 0 to 3
);
end;architecture Behavior of counter is
beginprocess(reset,clock)beginif reset="1" THENnum <= 0;elsif rising_edge(clock) THENif num = 3 THENnum <= 0;elsenum <= num + 1;end if;end if;end process;end;
end;

进程的启动:
当process的敏感信号参数表中没有列出任何敏感信号时,进程通过wait语句启动;

例子:

architecture behavior of state is
beginprocess -- 敏感信号列表为空beginwait until clock; -- 等待clock激活进程if(drive = '1') thencase output iswhen s1 => output <= s2;when s2 => output <= s3;when s3 => output <= s4;when s4 => output <= s1;end case;end if;end process;end
end

进程的注意事项
1 进程本身是并行语句,但内部为顺序语句
2 进程在敏感信号发生变化时被激活,在使用了敏感表的进程中不能含 wait语句;
3 同一进程中对同一信号多次赋值,只有最后一次生效
4 在不同进程中,不可对同一信号进行赋值
5 一个进程不可同时对时钟上下沿敏感。
6 进程中的信号赋值在进程挂起时生效的,而变量赋值是即时生效的。
7 相对于结构体而言,信号具有全局性,是进程间进行并行联系的重要途经
8 进程为综合器支持,且其建模方式直接影响仿真和综合结果,综合后对应宇进程的硬件结构对进程中所有可读入信号都是敏感的。


http://www.ppmy.cn/news/63312.html

相关文章

C++11多线程:std::thread创建线程和std::async创建异步任务的区别,std::async创建异步任务后没有被推迟执行。

系列文章目录 文章目录 系列文章目录前言一、thread和async的区别1.1 新线程和异步任务1.2 std::async和std::thread最明显的不同&#xff0c;就是async有时候并不创建新线程。1.3 std::async和std::thread的区别1.4 std::async不确定性问题的解决 二、使用方法2.1 std::async创…

动态规划--01背包问题

01背包问题 背包问题题目最优解结构性质状态转移方程方程理解 递归实现核心思想代码实现用例测试 画表非递归实现核心思路代码实现画表展示 计算哪些物品放入算法思想代码实现 背包问题 题目 0-1背包问题:给定n种物品和一背包。物品的重量是w;,其价值为v; ,背包的容量为C。问…

Android studio单独导入官方例程camera-calibration

1.官方例程camera-calibration 2.将官方例程camera-calibration copy到AndroidStudioProjects项目目录下 3修改AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android“http://schemas.android.com/apk/res/andr…

医院智能导诊系统,医院导航解决方案

随着现代医院规模不断扩大&#xff0c;功能区域越来越细化&#xff0c;面对复杂的楼宇结构&#xff0c;集中的就诊人流&#xff0c;患者在就诊中经常会面临找不到目的地的困境&#xff0c;就诊体验变差。针对这个问题&#xff0c;一些面积和规模都比较大的医院&#xff0c;已经…

零基础入门 Stable Diffusion - 无需显卡把 AI 绘画引擎搬进家用电脑

我从小特别羡慕会画画的伙伴。他们能够将心中的想法画出来&#xff0c;而我最高水平的肖像画是丁老头。但在接触 Stable Diffusion 之后&#xff0c;我感觉自己脱胎换骨&#xff0c;给自己贴上了「会画画」的新标签。 丁老头进化旅程 Stable Diffusion 是一个「文本到图像」的…

线上问题-CPU使用频率飙升

描述 中午收到群内人员反馈环境访问速度慢。登录验证码打不开等问题。通过查看日志发现是kafka出现问题&#xff0c;无法处理消息。联系运维解决。在排查的过程中使用mobaXterm连接服务器。左下角看到CPU使用频率非常高。于是记录一下通过CPU查看程序占用情况分析问题。 过程 …

JVM(类的加载与ClassLoader、双亲委派机制)

文章目录 1. 类的生命周期2. 类的加载过程3. 类加载器&#xff08;classloader)3.1 类加载器的作用3.2 类加载器的分类(JDK8)3.3 双亲委派机制3.3.1 双亲委派机制优势 3.4 查看某个类的类加载器对象3.5 使用ClassLoader获取流 1. 类的生命周期 类在内存中完整的生命周期&#…

MapReduce框架原理

从源码的角度 :map --> sort —> copy --> sort -->reduce   sort —> copy --> sort属于shuffle InputFormat数据输入 切片与MapTask并行度决定机制 1&#xff09;问题引出 MapTask的并行度决定Map阶段的任务处理并发度&#xff0c;进而影响到整个Job的…