VHDL菜鸟入门到精通之激励文件编写

news2025/1/11 23:53:28

目录

一、概览

二、激励文件结构

三、样例

3.1 组合逻辑

3.2 时序逻辑

四、常用编写

4.1 时钟信号

4.2 延时

4.3 循环

4.4 进程


一、概览

 

二、激励文件结构

    VHDL激励文件结构和设计文件较为类似,下面以3-8译码器的激励文件对结构进行说明。

激励文件主要包括:

1)库的声明与使用

2)实体的申明

3)结构体的申明

4)元件的声明

5)设计文件实体例化

6)信号生成

library IEEE;                      	--申明库IEEE
use IEEE.STD_LOGIC_1164.ALL;		--使用库文件IEEE中包STD_LOGIC_1164中的所有内容
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity decoder_tb is                --定义一个实体decoder_tb
GENERIC (n:integer := 7);			--Generic语句声明一个参数n,值为7,作用范围为全局,该语句非必须的,根据实际情况使用
end decoder_tb;

architecture Behavioral of decoder_tb is   --为实体decoder_tb申明一个结构体Behavioral
component decoder is					   --实体内进行元件component申明,主要用于定义端口
	PORT(en:IN STD_LOGIC;                  --port内对端口进行申明
		sel:IN INTEGER RANGE 0 TO n;
		x:out std_logic_vector(7 downto 0));
end component decoder;

signal en:STD_LOGIC;                       --信号申明,测试中使用的信号
signal sel: INTEGER RANGE 0 TO n;
signal x:std_logic_vector(7 downto 0);
begin
dut:decoder port map(en=>en,sel=>sel,x=>x);   --对于元件decoder进行例化,同时和测试文件中的信号进行映射
process                                       --激励信号生成
	begin
	en<='0';                           
	sel<=0;
	wait for 10ns;
	en<='1';
	wait for 20ns;
	sel<=1;
	wait ;
	end process;
end Behavioral;                      --结构体结束语句

三、样例

通常设计根据输入与输出的时间关系分为组合逻辑和时序逻辑,样例也针对2种场景提供。

3.1 组合逻辑

以一个3-8译码器为例,输入的真值表逻辑见下图,真值表逻辑是根据输入的数字X,输出Y中下标为值X的为1,其余为0,将X用二进制表示即为sel[2:0]的3比特。

 

设计文件代码

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity decoder is
GENERIC (n:integer := 8);
  Port (en:IN STD_LOGIC;
  sel:IN INTEGER RANGE 0 TO n-1 ;
  x:OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
end decoder;

architecture Behavioral of decoder is
begin
	PROCESS(en,sel)
		variable temp1:STD_LOGIC_VECTOR(x'high DOWNTO 0);
	begin
		temp1:=(others=>'1');
		if(en='1') then
			temp1(sel):='0';
		end if;
	x<=temp1;
	end process;
end Behavioral;

测试文件代码

library IEEE;                      
use IEEE.STD_LOGIC_1164.ALL;		
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity decoder_tb is                
GENERIC (n:integer := 7);			
end decoder_tb;

architecture Behavioral of decoder_tb is  
component decoder is					   
	PORT(en:IN STD_LOGIC;                
		sel:IN INTEGER RANGE 0 TO n;
		x:out std_logic_vector(7 downto 0));
end component decoder;

signal en:STD_LOGIC;                      
signal sel: INTEGER RANGE 0 TO n;
signal x:std_logic_vector(7 downto 0);
begin
dut:decoder port map(en=>en,sel=>sel,x=>x);  
process                                     
	begin
	en<='0';
	sel<=0;
	wait for 10ns;
	en<='1';
	wait for 20ns;
	sel<=1;
	wait for 20ns;
	sel<=2;
	wait for 20ns;
	sel<=3;
	wait for 20ns;
	sel<=4;
	wait for 20ns;
	sel<=5;
	wait for 20ns;
	sel<=6;
	wait for 20ns;
	sel<=7;
	wait ;
	end process;
end Behavioral;

综合结果,选择输入sel连接到8个LUT4,每个LUT4对应译码输出X中的一位,无时序逻辑单元触发器。

 

仿真结果,输出信号Y中对应索引值为sel的为0,符合预期

 

3.2 时序逻辑

时序逻辑选用触发器的设计进行示例,设计文件代码。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity FF is
  Port (en,clk,d:IN STD_LOGIC; 
  	q:OUT STD_LOGIC );
end FF;

architecture Behavioral of FF is
begin
	PROCESS(en,clk)
	begin
		if(en='0') then
			q<='0';
		else
		if clk'event and clk='1' then
			q<=d;
		end if;
		end if;
	end process;
end Behavioral;

测试文件代码

entity decoder_tb is
end decoder_tb;

architecture Behavioral of decoder_tb is
component FF is
  Port ( en,clk,d:IN STD_LOGIC;
  		q:out STD_LOGIC);
end component FF;
signal en:STD_LOGIC:='0';
signal clk:STD_LOGIC:='0';
signal d:STD_LOGIC:='0';
signal q:STD_LOGIC;
begin
dut:FF port map(en=>en,clk=>clk,d=>d,q=>q);

process
	constant period:Time:=10ns;
	begin
	clk<='1';
	wait for period/2;
	clk<='0';
	wait for period/2;
end process;
process
	begin
	en<='0';
	d<='1';
	wait for 30ns;
	en<='1';
	wait for 70ns;
	d<='0';
	wait for 30ns;
	d<='1';
	wait;
	end process;

end Behavioral;

综合结果:综合出一个FDCE

 

仿真结果:

 

四、常用编写

下面将介绍激励编写中常用到的描述

4.1 时钟信号

a)占空比为50%

constant PERIOD : time := <value>;  --定义时钟周期

--使用after语句
CLK <= not CLK after PERIOD/2;

--使用wait语句
constant PERIOD : time := <value>;
CLK <= '0';
wait for PERIOD/2;
CLK <= '1';
wait for PERIOD/2;
				

b)非50%占空比

constant DUTY_CYCLE : real := <value_0.01_to_0.99>; --定义占空比系数
constant PERIOD : time := <value>;  --定义时钟周期

--使用after语句
CLK <= '1' after (PERIOD - (PERIOD * DUTY_CYCLE)) when CLK = '0'
  else '0' after (PERIOD * DUTY_CYCLE);

--使用wait语句
CLK <= '0';
wait for (PERIOD - (PERIOD * DUTY_CYCLE));
CLK <= '1';
wait for (PERIOD * DUTY_CYCLE);
				

c)差分端口占空比为50%

constant PERIOD : time := <value>;   --设置时钟周期

--使用after语句
CLK_P <= not CLK_P after PERIOD/2;
CLK_N <= not CLK_N after PERIOD/2;
--使用wait语句
CLK_P <= '0';
CLK_N <= '1';
wait for PERIOD/2;
CLK_P <= '1';
CLK_N <= '0';
wait for PERIOD/2;

4.2 延时

a) 指定延时时间

constant SIM_TIME : time := 10 ms;  --设置仿真时间SIM_TIME, 时间为10ms
<signal_name> <= <signal_value> after SIM_TIME;  --信号在SIM_TIME后进行赋值

wait on <signal_name>;   --延时到信号有变化

wait until falling_edge(<signal_name>); --延时到信号的下降沿到来
                        
wait until rising_edge(<signal_name>);  --延时到信号的上升沿到来

wait until <signal_name> = <value>;   --延时到信号变化到指定值			

4.3 循环

a) loop语句

loop
   CLK <= not CLK;
   wait for PERIOD/2;
   if <signal_name = <value> then
      exit;
   end if;
end loop;

b) for语句

for <variable_name> in <lower_limit> to <upper_limit> loop
   <statement>;
   <statement>;
end loop;		

c)while语句

while <condition> loop
   <statement>;
   <statement>;
end loop;

4.4 进程

a) 组合逻辑

process (所有的输入信号,信号间用逗号隔开)
begin
   <statements>;
end process;

b)时序逻辑

时钟下降沿触发,异步复位

process (<clock>,<async_reset>)
begin  
   if <async_reset> = '1' then       
      <statements>;
   elsif (<clock>'event and <clock> = '0') then
      if <sync_reset> = '1' then
         <statements>;
      else
         <statements>;
      end if;
   end if;
end process;

时钟下降沿触发,同步置位

process (<clock>)
begin  
   if (<clock>'event and <clock> = '0'>) then
      if <reset> = '1' then
         <statements>;
      else
         <statements>;
      end if;
   end if;
end process;

时钟上升沿触发,异步复位

process (<clock>,<async_reset>)
begin  
   if <async_reset> = '1' then
      <statements>;
   elsif (<clock>'event and <clock> = '1') then
      if <sync_reset> = '1' then
         <statements>;
      else
         <statements>;
      end if;
   end if;
end process;

时钟上升沿触发,同步复位

process (<clock>)
begin  
   if (<clock>'event and <clock> = '1'>) then
      if <reset> = '1' then
         <statements>;
      else
         <statements>;
      end if;
   end if;
end process;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git clone报错Failed to connect to github.com port 443 after 21055 ms:

git 设置代理端口号 git config --global http.proxy http://127.0.0.1:10085 和 git config --global https.proxy http://127.0.0.1:10085 然后就可以成功git clone hugging face的数据集了 如果是https://huggingface.co/datasets/shibing624/medical/tree/main 那么…

logstash通过kafka通道采集日志信息

1.修改文件/opt/app/elk/logstash-7.5.1/config.d/config1.conf&#xff0c;在input下添加kafka采集配置 #192.168.128.130:9103:kafka地址 #topics:主题 kafka {bootstrap_servers > ["192.168.128.130:9103"]group_id > "logstash"topics > [&…

Optuna学习博客

介绍 简单来说&#xff0c;OPtuna就是一个能够进行调整超参数的框架&#xff0c;它能够将自动调整超参数以及能够将超参数优化过程可视化&#xff0c;方便保存&#xff0c;分析。可拓展性较强。 使用方法 optuna的优化程序具体有三个组成部分。 objective&#xff08;目标函…

MySQL数据库管理及数据库基本操作

目录 1 MySQL数据库基本操作 1.1 SQL分类 1.2 SQL语言规范 1.3 数据库对象和命名 1.4 SQL语句分类 2 管理MySQL数据库 2.1 查看数据库结构 2.1.1 查看当前服务器中的数据库 2.1.2 查看数据库中包含的表 2.1.3 查看表的结构&#xff08;字段&#xff09; 2.2 数据类型…

【linux】进程创建,进程终止

进程创建&#xff0c;进程终止 1.进程创建1.1写时拷贝1.2fork常规用法1.3fork调用失败的原因 2.进程终止2.1退出码2.2进程退出场景2.3进程如何退出 1.进程创建 在前面创建子进程的时候就学过了fork函数&#xff0c;它能从已经存在进程中创建一个新进程&#xff0c;新进程为子进…

Python 图形化界面基础篇:打开和关闭新窗口

Python 图形化界面基础篇&#xff1a;打开和关闭新窗口 引言 Tkinter 库简介步骤1&#xff1a;导入 Tkinter 模块步骤2&#xff1a;创建 Tkinter 窗口步骤3&#xff1a;创建一个新窗口步骤4&#xff1a;关闭新窗口步骤5&#xff1a;启动 Tkinter 主事件循环 完整示例代码代码解…

C语言指针详解(4)———找工作必看指针笔试题汇总

指针对于编程工作的重要性 C语言指针在找工作中具有重要性。以下是几个原因&#xff1a; 1.高效的内存管理&#xff1a;C语言指针可以帮助程序员高效地管理内存&#xff0c;包括动态内存分配和释放&#xff0c;以及数据的访问和操作。这对于开发性能优化的应用程序非常重要&am…

7.代理模式

1.UML 2.代码 #include <iostream> using namespace std;class Subject{ public:virtual void Request() 0; };class RealSubject:public Subject { public:virtual void Request(){cout << "RealSubject" << endl;} }; class Proxy:public Subj…

VUE build:gulp打包:测试、正式环境

目录 项目结构 Gulp VUE使用Gulp Vue安装Gulp Vue定义Gulp.js package.json build文件夹 config文件夹 static-config文件夹 项目结构 Gulp Gulp是一个自动化构建工具&#xff0c;可以帮助前端开发者通过自动化任务来管理工作流程。Gulp使用Node.js的代码编写&#xff…

go初识iris框架(五) -MVC包的使用

在Iris框架中&#xff0c;封装了mvc包作为对mvc架构的支持&#xff0c;方便开发者遵循mvc的开发原则进行开发。 iis框架支持请求数据、模型、持久数据分层处理&#xff0c;并支持各层级模块代码绑定执行。 MVC即&#xff1a;model、view、controller三个部分&#xff0c;分别代…

【微信小程序】swiper的使用

1.swiper的基本使用 <jxz-header></jxz-header> <view class"banner"><swiperprevious-margin"30rpx"autoplayinterval"2000"indicator-dotsindicator-color"rgba(0,0,0,0.3)"indicator-active-color"#bda…

数字化管理平台建设实践

在勘察设计行业&#xff0c;各企业加速推进数字化转型。通过管理要素数字化&#xff0c;不断优化内部组织运营效率&#xff1b;通过生产手段数字化、技术产品数字化&#xff0c;提升服务质量&#xff0c;改善客户体验&#xff1b;通过数字化营销&#xff0c;精准对接市场需求&a…

Linux下的系统编程——信号(十一)

前言&#xff1a; 信号在我们的生活中随处可见&#xff0c; 如&#xff1a;古代战争中摔杯为号&#xff1b;现代战争中的信号弹&#xff1b;体育比赛中使用的信号枪...... 他们都有共性&#xff0c;信号是信息的载体&#xff0c;Linux/UNIX 环境下&#xff0c;古老、经典的通信…

基于Java+SpringBoot+Vue的图书借还小程序的设计与实现(亮点:多角色、点赞评论、借书还书、在线支付)

图书借还管理小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 小…

.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!

这是我们计划在今年晚些时候发布的最终.NET 8版本之前的两个候选版本中的第一个。大部分计划中的功能和变更都包含在这个候选版本中&#xff0c;可以供您尝试使用。您可以在文档中找到完整的ASP.NET Core在.NET 8中的新功能列表。一些领域&#xff08;尤其是Blazor&#xff09;…

SpringMvc第六战-【SpringMvcJSON返回异常处理机制】

前言&#xff1a; 小编讲述了&#xff1a;JSR303的概念&#xff0c;应用场景和在具体实例的使用&#xff1b;和拦截器的应用 今天小编来讲述的为cJSON返回&异常处理机制&#xff0c;json返回就不用多说&#xff0c;毕竟大部分数据都是通过Json来传递数据的&#xff0c;异…

elasticsearch4-文档操作

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

VSCode 安装使用教程 环境安装配置 保姆级教程

一个好用的 IDE 不仅能提升我们的开发效率&#xff0c;还能让我们保持愉悦的心情&#xff0c;这样才是非常 Nice 的状态 ^_^ 那么&#xff0c;什么是 IDE 呢 &#xff1f; what IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;是含代码…

Python实现四维图像绘制系统

文章目录 动图绘制系统的实现播放控制接口优化总结 Python绘图系统&#xff1a; 源码地址&#xff1a;Python打造动态绘图系统&#x1f4c8;从0开始的3D绘图系统&#x1f4c9;一套3D坐标&#xff0c;多个函数&#x1f4ca;散点图、极坐标和子图自定义控件&#xff1a;绘图风格…

Modbus协议介绍及Modbus TCP

这里写目录标题 一、Modbus起源1.起源2.分类3.优势4.应用场景5.ModbusTCP特点⭐⭐⭐ 二、Modbus TCP协议格式1.报文头2.寄存器3.功能码4.协议包书写模板总结 一、Modbus起源 1.起源 Modbus由Modicon公司于1979年开发&#xff0c;是一种工业现场总线协议标准。 Modbus通信协议…