初识FPGA记录---VHDL的流水灯实现

本文介绍了VHDL的基础语法,包括库和程序包的使用、实体(ENTITY)的定义,以及结构体(ARCHITECTURE)的创建。通过一个简单的流水灯设计实例,详细讲解了实体的端口定义、进程语句(PROCESS)的使用,以及信号赋值等关键概念,展示了如何在VHDL中描述数字逻辑系统的行为。
摘要由CSDN通过智能技术生成

一、基础语法

在这里插入图片描述

1、代码的总体架构
1.1 库、程序包的使用

类比与c语言的引用头文件,python中的调用包

LIBRARY IEEE;   -- 调用IEEE库
USE IEEE.STD_LOGIC_1164.ALL;  --调用IEEE库中的STD_LOGIC_1164程序包(必须在设计实体前显示出来)
-- 这一句话就像python中的 form pandas import *
1.2 实体(ENTITY)

类似于其它语言的全局变量。格式为

ENTITY 实体名称 IS
    [GENERIC(类属表);]     
    [PORT(端口名);]
END 实体名(也可以省略)
1.1.1 GENERIC(类属说明语句)
GENERIC ([CONSTANT]常数名:[IN]数据类型[:=静态表达式(初值)]);

​ GENERIC 是用于说明设计实体和其外部环境通信的对象,规定端口的大小、实体中子元件的数目、实体的延时特性等。只能用整数类型表示,如整型、时间型等,其他类型的数据不能逻辑综合(还没怎么用到过)

1.1.2 PORT(关键字用于定义模块的端口)
PORT( [SIGNAL] 端口名称:端口模式 数据类型 [:=静态表达式(初值)])
  • SIGNAL:SIGNAL 是关键字,但是由于 PORT 之后必须是信号类,所以一般可以将 SIGNAL关键字省略。
  • 端口名称:是该端口的标识,通常由英文字母和数字组成,但是必须是英文字母打头。
  • 端口模式:输入(IN)-只读,输出(OUT)-单项赋值模式,输出,双向(INOUT)-;缓冲(BUFFER)-具有读功能的输出模式,不允许作为双向端口使用。
  • 数据类型:说明流过该端口的数据类型,常用的数据类型有 BIT(位)、BIT_VECTOR(位向量)、BOOLEAN(布尔型)和 INTEGER(整数型)4 种。
-- 实体(generic / port说明)
ENTITY light IS
    PORT(clk, res:IN std_logic;   -- 创建时钟端口clk和复位端口res(输入模式)
        out1:OUT std_logic_vector(3 DOWNTO 0):="0000"); --(标准位矢类型,从高到低) 创建输出端口,对应4个led。要使用位移操作符(位输出模式)其左侧必须为BIT_VOCTOR类型(位矢量) 
END light;
1.3 结构体

类似于其他语言的函数集合,在里面拥有很多小函数。

结构体描述实体的行为功能,一个实体可以有多个结构体。结构体是一个基本设计单元,它具体地指明了所设计模块的行为、元件及内部的连接关系,也就是说它定义了设计单元具体的功能。结构体对其基本设计单元的输入/输出关系可以用 3 种方式进行描述,即行为描述(基本设计单元的数学模型描述)、寄存器传输描述(数据流描述)和结构描述(逻辑元件连接描述)。格式为

ARCHITECTURE 结构体名 OF 实体名 IS
 	[定义语句]
BEGIN
  	[并行处理语句]
END 结构体名;

在这里插入图片描述

也没学太明白,结构体功能描述主要是由以下一些解释:

  • 块语句:由一系列并行执行的语句构成的组合体,他的功能是将结构体中的并行语句组成一个或多个模块。
  • 进程语句:定义顺序语句模块,用以将从外部获取的信号值或内部的运算数据向其他信号进行赋值。
  • 信号赋值:设计实体内的处理结果向定义的信号或界面端口进行赋值。
  • 子程序:调用一个已经设计好的子程序
  • 元件例化语句:对其他的设计实体作元件的调用说明,并将此元件的端口和其他的元件、信号、或高层次的界面端口进行连接。
-- 创建结构体 behave并综合结构体behave到实体hello上  light 为实体名      
ARCHITECTURE behave OF light IS
SIGNAL sta:std_logic_vector(3 DOWNTO 0) :="0001";       -- 初始化sta值   
-- SIGNAL cnt:integer RANGE 0 TO 23;           			--创建整型的cnt,数值范围为0到23
SIGNAL count:integer:=0;                                -- SIGNAL 信号名:类型标识:[=初值]
SIGNAL tim:bit:='0';
BEGIN
    PROCESS(clk)                                        -- PROCESS()  进程语句,顺序执行,clk为关键词(铭感词),只要发生变化,语句执行
    BEGIN
        IF (clk'event and clk='1') THEN       --如果时钟上升沿,则cnt加1(一个进程只能有一个边缘触发)
            count<=count+1;
				IF(count = 5000000) THEN   -- 主频为50MHZ   设置为50 000 000 为1s。5 000 000 为0.1s的闪烁速度
					tim<='1';
					count <=0;
				else
					tim<='0';
				end if;
			end if;  
    END PROCESS;
	 
	PROCESS(tim)                                        -- 含有多个进程语句,都为并行执行
	BEGIN
		IF(tim'event and tim = '1') THEN
			sta <= sta(2 DOWNTO 0) & sta(3);
		END IF;
	END PROCESS;
	out1 <=sta;											-- 信号赋值
END behave;

a <= sta(2 DOWNTO 0) & sta(3);
		END IF;
	END PROCESS;
	out1 <=sta;											-- 信号赋值
END behave;

本次记录的代码为–vhdl版本的流水灯
全部代码如下

-- 库、程序包使用说明
LIBRARY IEEE;   -- 调用IEEE库
USE IEEE.STD_LOGIC_1164.ALL;  --调用IEEE库中的STD_LOGIC_1164程序包(必须在设计实体前显示出来)

-- 实体(generic / port说明)
ENTITY light IS
    PORT(clk, res:IN std_logic;   -- 创建时钟端口clk和复位端口res(输入模式)
        out1:OUT std_logic_vector(3 DOWNTO 0):="0000"); --(标准位矢类型,从高到低) 创建输出端口,对应4个led。要使用位移操作符(位输出模式)其左侧必须为BIT_VOCTOR类型(位矢量) 
END light;

-- 创建结构体 behave并综合结构体behave到实体hello上  light 为实体名      
ARCHITECTURE behave OF light IS
SIGNAL sta:std_logic_vector(3 DOWNTO 0) :="0001";       -- 初始化sta值   
-- SIGNAL cnt:integer RANGE 0 TO 23;           			--创建整型的cnt,数值范围为0到23
SIGNAL count:integer:=0;                                -- SIGNAL 信号名:类型标识:[=初值]
SIGNAL tim:bit:='0';
BEGIN
    PROCESS(clk)                                        -- PROCESS()  进程语句,顺序执行,clk为关键词,只要发生变化,语句执行
    BEGIN
        IF (clk'event and clk='1') THEN       --如果时钟上升沿,则cnt加1(一个进程只能有一个边缘触发)
            count<=count+1;
				IF(count = 5000000) THEN   -- 主频为50MHZ   设置为50 000 000 为1s。5 000 000 为0.1s的闪烁速度
					tim<='1';
					count <=0;
				else
					tim<='0';
				end if;
			end if;  
    END PROCESS;
	 
	PROCESS(tim)                                        -- 含有多个进程语句,都为并行执行
	BEGIN
		IF(tim'event and tim = '1') THEN
			sta <= sta(2 DOWNTO 0) & sta(3);
		END IF;
	END PROCESS;
	out1 <=sta;
END behave;
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xihuanafengxx

好累好累好累!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值