FPGA小脚丫开发板学习笔记:VHDL组合逻辑-时序逻辑练习

板子:Altera Cyclone10 STEP小脚丫FPGA开发板

IDE:QuartusII 18.1(Educational)

仿真软件:Modelsim-Alterl

芯片系列:Cydone 10 LP

芯片核心:10CL016

芯片名称:10CL016YU256C8G

文章目录

  • FPGA小脚丫开发板学习笔记:**VHDL组合逻辑-时序逻辑练习**
    • 〇、什么是FPGA?
      • 1. FPGA的概念
      • 2. 为什么FPGA≈乐高
    • 一、在QuartusII 中用原理图输入法设计 4 位加法器
      • 1. New一个原理图
      • 2. New一个波形仿真文件
      • 3. 下载与硬件测试
    • 二、应用QuartusII 完成基本组合电路设计
      • 0. VHDL
      • 1. 二选一多路选择器
        • 1.1 新建工程并新建一个VHDL文件
        • 1.2 编写代码
        • 1.3 编译即仿真
      • 2. 双二选一多路选择器
        • 2.1 编码
        • 2.2 编译并仿真
        • 2.3 硬件测试
    • 三、应用QuartusII 完成基本时序电路的设计
      • 1. 触发器
        • 1.1 代码
        • 1.2 仿真
        • 1.3 RTL电路与门电路
        • 1.4 硬件测试
      • 2. 锁存器
        • 2.1 代码
        • 2.2 仿真
        • 2.3 查看RTL电路与门电路
        • 2.4 下载测试
    • 四、总结
    • 五、参考文章
    • 六、源文件

〇、什么是FPGA?

突然发现自己连FPGA的全称是什么都不知道,所以在这里临时加一条

1. FPGA的概念

FPGA(Field Programmable Gate Array)是在PAL (可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

全称Field Programmable Gate Array,译为**“现场 可编程 门 阵列”** 。

我们可以把FPGA当做是数字世界的乐高(Lego),它由几种最基本的单元(每种单元数量有很多很多)让你组成自己想实现的功能。能玩好乐高就一定能玩好FPGA。乐高玩得好不好,取决于什么因素?

通过一些最基本的积木块可以拼出任何复杂的物体

2. 为什么FPGA≈乐高

  • 第一:一套乐高中都有很多单元,每种单元各有自己的特性,不同单元之间的拼接方法也是多样的

  • 第二:从几千个乐高piece里面组装一辆车一栋楼亦或是一座城是很困难的,但如果有图纸就会变得很简单,亦或是把我们的思维当作一张图纸来把这几千个piece构建成一座梦幻都市。

  • 第三:无限次地拆分与重组,乐高可以将成品拆分再构建成另一个成品,FPGA同样能加载一个新的设计方案并且只需几百毫秒,利用重配置可以减少硬件的开销。

  • 第四:逻辑单元越多,FPGA便能越强大。当我们的乐高piece够多时,组装一个1:1比例的法拉利跑车也变为可能,而当FPGA的逻辑单元足够多时,他甚至能成为一个5G基站的核心。

    逻辑门单元是构成一切数字逻辑器件的基本单元,在数字世界里你想做任何事情、实现任何功能,都可以通过逻辑门的堆砌来实现,也就是说FPGA在数字领域里几乎无所不能,因此n年前我国的某一个FPGA公司在向国务院领导描述其产品的时候称他们做的是“万能芯片”(用这种通俗易懂的说法忽悠国家的经费)。万能有些夸张,但FPGA高度灵活,理论上来讲,只要有足够的资源(积木数量足够多)几乎可以实现数字域的任何功能,受限的是速度、功耗以及系统的成本。

一、在QuartusII 中用原理图输入法设计 4 位加法器

**原理:**一个4位全加器可以由4个1位全加器构成,加法器间的进位可以串行方式实现,即将低位加法器的进位输出cout与相临的高位加法器的最低进位输入信号cin相接(串行进位加法器)。

1. New一个原理图

  • 在上一个工程文件《FPGA实验记录一:1位全加器设计》的基础上直接新建一个原理图,并把原来的一位全加器直接导出为可调用元件

  • 建立一个更高层次的原理图设计,利用实验一获得的1位全加器构成4位全加器:

    注意总线连接方式必须对连线命名,方法是单击要命名的连线,出现光标后直接输入连线的名字,如总线a[3…0],或单线a0(✌✌✌!!把标准两个字打在公屏上!!✌✌✌

  • 将新的原理图设置为顶层文件后并编译

2. New一个波形仿真文件

  • 新建波形文件Waveform2作为四位全加器的波形仿真文件,用老方法将所有input和output添加到仿真文件中,并使用Random随机波形

  • 点击进行仿真,等待片刻得到结果

3. 下载与硬件测试

  • 绑定引脚:将a[0…3]和b[0…3]两根总线拆分为八根input输入线分别绑定Switch1-8(小脚丫开发板刚好八个开关);c与s[0…3]分别绑定在LED1-5上。(引脚参考手册见末尾)

  • 下载程序至开发板

  • 根据波形文件的仿真结果进行测验:

二、应用QuartusII 完成基本组合电路设计

0. VHDL

​ VHDL 的英文全名是VHSIC Hardware Description Language(超高速集成电路硬件描述语言)。VHSIC是Very High Speed Integrated Circuit的缩写,是20世纪80年代在美国国防部的资助下始创的,并最终导致了VHDL语言的出现。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。VHDL 用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可视部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。

1. 二选一多路选择器

完成2选1多路选择器的文本编辑输入(mux21a.vhd)和仿真测试等步骤。最后在实验系统上进行硬件测试,验证本项设计的功能。

1.1 新建工程并新建一个VHDL文件

1.2 编写代码

代码解释全在注释里,基本每一句都读了。

LIBRARY IEEE;
--LIBRARY:库 当作import即可
--IEEE库:由IEEE(美国电子电机工程师学会)制定的标准库 LPM库
--库:库分为ieee库,std库,work库。
USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--USE:使用IEEE库中的STD_LOGIC_UNSIGNED的所有内容
--ieee库列举常用的包:std_logic_1164:逻辑系统;std_logic_arith:数据类型的转换;std_logic_signed;std_logic_unsigned。
--“.”:包含关系,类似于Java的包
--“;”:表示语句结束ENTITY mux21a IS
--实体名:mux21a 是PORT (   IN0,IN1,S1:in BIT;   --port_name : signal_mode signal_type;
--引脚IN0,IN1,S1;为输入单向引脚;输入为二进制高低电频
--STD_LOGIC是IEEE在1993年制定的新的标准(IEEE STD1164),它具有9种不同的值COUTY : OUT BIT);
--引脚COUTY;为输出单向引脚;输入为二进制高低电频END mux21a;
--ENTITY到END位实体结构,用来描述电路的输入输出引脚
--singal_mode有四种:in,out;inout;buffer
--IN,OUT是单向引脚,INOUT是双向引脚,BUFFER输出一个引脚,但是输出信号可供电路内部使用 注意啦:OUT不能供电路内部使用
--signal_type包括BIT;STD_LOGIC;INTEGER(BIT为二进制,两种值;STD_LOGIC有九种;)
ARCHITECTURE behav OF mux21a IS
--mux21a实体的行为逻辑是:
--ARCHITECTURE部分为构造体(用来描述电路行为和实现功能),对信号和常量等进行声明
BEGIN
--代码(BEGIN-END):描述电路行为和实现功能COUTY<=IN0 when S1='0' ELSE IN1;
--当S1处于低电平时,COUNT输出IN0;反之,输出IN1
END behav;

1.3 编译即仿真

  • 编译

  • 仿真

    由仿真结果可知,我们可知当S1处于高电平时,COUNT输出IN1;反之,输出IN0.所以所设计的实验能够满足要求。

2. 双二选一多路选择器

本实验中直接利用上题的mux21a。由上题可知,mux21a由2个数据输入口(IN0,IN1),1个数据选择端(S1),一个输出口(COUTY)构成。设有两个mux21a,分别为U1和U2。为了充分利用U1和U2的数据选择端,我们将U1的输出口(COUNT)接到U2的输入口IN0,这样U2通过自身的选择端(S1)就可以选择U1的输出或则自己IN0的输入数据,实现2选1选择器到双2选1多路选择器的扩展。

2.1 编码

LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY dmux21a IS
--实体双二选一多路选择器是PORT (   IN0,IN1,IN2,S0,S1:in BIT;
--输入引脚为IN0,IN1,IN2,S0,S1,输入模式为BITCOUTY : OUT BIT);
--输出引脚为COUTY,输出模式为BIT
END dmux21a;ARCHITECTURE BHV OF dmux21a IS
--实体双二选一多路选择器的逻辑行为模式是COMPONENT MUX21A
--元件名称是MUX21A 它的构造如下所示:PORT(IN0,IN1,S1:IN BIT;COUTY :OUT BIT);END COMPONENT;
--元件声明和实体声明一致,元件就是一个实体
SIGNAL tmp : BIT;
--声明一个信号为tmp,模式为bit
BEGINu1 : MUX21A PORT MAP(IN0, IN1, S0, tmp);
--元件u1为MUX21A,引脚为IN0,IN1,S0,TMPu2 : MUX21A PORT MAP(IN2, tmp, S1, COUTY);END BHV;

2.2 编译并仿真

  • 将dmux21a设置为顶层文件然后进行编译

  • 新建波形文件进行仿真

    波形图预测:当S1=0时输出IN2的波形;当S1=1,S0=1,输出IN1的波形;当S1=1,S0=0,输出IN0的波形。

    由波形图可知,仿真结果与预测结果一致。

波形仿真时曾出现error loading design错误,网上说法有很多,但我这里是因为笔记本没电了不足以支持完成仿真导致的

  • 查看RTL电路

    Tools->Netlist Viewers->RTL Viewer

  • 查看门电路

    Tools->Netlist Viewers->Technology Map Viewer

2.3 硬件测试

  • 绑定引脚

    将COUTY绑定在LED1,五个输入引脚分别绑定给SW1-5

  • 下载

  • 测试

    测试预测:IN0,IN1,IN2分别恒为0,1,0

    当S2=0时输出IN2的波形;

    当S2=1,S1=1,输出IN1的波形;

    当S2=1,S1=0,输出IN0的波形

因为做图的时候把S0,S1做成S1,S2了,所以文字也将错就错了。

由硬件测试图可知,仿真结果与预测结果一致,实验成功

三、应用QuartusII 完成基本时序电路的设计

1. 触发器

在实际的数字系统中往往包含大量的存储单元,而且经常要求他们在同一时刻同步动作,为达到这个目的,在每个存储单元电路上引入一个时钟脉冲(CLK)作为控制信号,只有当CLK到来时电路才被“触发”而动作,并根据输入信号改变输出状态。把这种在时钟信号触发时才能动作的存储单元电路称为触发器,以区别没有时钟信号控制的锁存器。

**实验内容1:**用VHDL文本设计触发器,设计触发器(使用例4-1),给出程序设计、软件编译、仿真分析、硬件测试及详细实验过程。

**实验原理:**由数电知识可知,D触发器由输入的时钟信号(CLK)、数据输入口(D)和数据输出(Q)构成。本程序通过进程监视CLK和D\,当CLK为上升沿的时候,将D赋值给Q,要完成这个赋值操作,必须再借助一个信号S来进行值的传递。

1.1 代码

新建一个VHDL文件,并输入下列代码

LIBRARY IEEE ;
--使用IEEE库
USE IEEE.STD_LOGIC_1164.ALL ;
--使用IEEE库中STD_LOGIC_1164中的所有内容
ENTITY DFF1 IS
--实体DDF1是PORT (CLK : IN STD_LOGIC ;
--输入引脚CLK,输入模式为STD_LOGIC(因为是时序逻辑电路所以不能使用BIT输入模式)D : IN STD_LOGIC ;
--输入引脚D,输入模式为STD_LOGICQ : OUT STD_LOGIC ); END DFF1;
ARCHITECTURE bhv OF DFF1 IS
--DFF1的逻辑行为模式为:
SIGNAL Q1 : STD_LOGIC ; --类似于在芯片内部定义一个数据的暂存节 点
BEGIN PROCESS (CLK,Q1)
--PROCESS进程 (clk,rst)为敏感信号列表:敏感信号中的某个信号发生变化,PROCESS中的代码就顺序执行一次。类似与C中的条件循环代码,VHDL的条件为信号的变化,这里就是说时钟信号的上升下降沿的每次出现,或者Q1每变一次程序就会执行一次BEGIN IF CLK'EVENT AND CLK = '1'THEN
--如果CLK发生了变化,那么返回布尔值TRUE,以此来判断是否出现了上升沿,即即CLK是否='1'Q1 <= D ;
--如果CLK=1那么就把D的值赋予给Q1
--“<=”给信号赋值,“:=”给变量赋值END IF;
--IF语句是用于顺序代码的,只能用于PROCESS,FUNCTION,PROCEDURE中。 没什么好讲的,记住就可以了。END PROCESS ; Q <= Q1 ; --将内部的暂存数据向端口输出(双横线--是注释符号)
END bhv;

1.2 仿真

新建一个VWF波形文件进行仿真得到以下结果

**仿真预测:**输入一组波形,当且仅当CLK为上升沿的时候,Q输出D的值;否则,Q保持原值不变。

仿真符合预测结果,表示结果正确

1.3 RTL电路与门电路

1.4 硬件测试

  • 绑定引脚

    clk与D分别绑定在SW1-2,Q绑定与LED1

  • 下载测试

  • 仿真预测,当CLK处于上升沿时将D的值赋予Q否则Q保持不变

与预测结果一致,实验成功

2. 锁存器

锁存器(Latch)是一种对脉冲电平敏感的存储单元电路,它们可以在特定输入脉冲电平作用下改变状态。锁存,就是把信号暂存以维持某种电平状态。锁存器的最主要作用是缓存,其次完成高速的控制器与慢速的外设的不同步问题,再其次是解决驱动的问题,最后是解决一个 I/O 口既能输出也能输入的问题。锁存器是利用电平控制数据的输入,它包括不带使能控制的锁存器和带使能控制的锁存器。

2.1 代码

新建VHDL文件latch1,并输入下列代码

LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
ENTITY latch1 IS
--实体 latch1 是PORT (CLK : IN STD_LOGIC ;
--CLK为输入引脚,输入模式为STD_LOGICD : IN STD_LOGIC ;
--D为输入引脚,输入模式为STD_LOGICQ : OUT STD_LOGIC );
--Q为输出引脚,输出模式为STD_LOGICEND latch1;
ARCHITECTURE bhv OF latch1 IS
--latch1的逻辑行为模式是BEGINPROCESS (CLK,D) BEGINIF CLK = '1' --电平触发型寄存器THEN Q <= D ;
--当CLK处于上升沿时,将D的值赋予给QEND IF;END PROCESS ;END bhv;

2.2 仿真

新建波形文件并进行仿真

2.3 查看RTL电路与门电路

2.4 下载测试

直接上测试结果,不然太墨迹了

测试结果与预测结果相同,试验成功

四、总结

通过第二次学习的三个实验内容对我的FPGA的基础知识很有帮助。

五、参考文章

电子研习社:FPGA到底是啥

实验三 组合逻辑电路的VHDL设计

江南烟雨:VHDL学习笔记(1)

实验一:1位全加器设计—— 原理图与VHDL设计初步

STEP-CYC10 硬件手册

STEP 10资源参考:

六、源文件

https://github.com/Wattson1128/FPGA

FPGA实验记录二:VHDL组合逻辑-时序逻辑练习相关推荐

  1. FPGA实验记录五:I2C读取AHT10温湿度传感器

    FPGA实验记录五:I2C读取AHT10温湿度传感器 一.AHT10温湿度传感器 1. 简介 AHT10,新一代温湿度传感器在尺寸与智能方面建立了新的标准:它嵌入了始于回流焊的双列扁平无引脚SMD封装 ...

  2. FPGA数字系统设计(6)——时序逻辑电路设计

    用always@(posedge clk)描述 时序逻辑电路的基础--计数器(在每个时钟的上升沿递增1) 例1.四位计数器(同步使能.异步复位) // Module Name: counter_4bi ...

  3. HEU大二数电时序逻辑电路设计实验

    Contents 1 实验目的 2 实验仪器 3 子任务 3.1 消抖电路 实验原理 实验步骤 具体实现 问题解决 3.2 简易篮球比赛计分器 实验原理 实验步骤 具体实现 问题解决 4 结论心得 1 ...

  4. 数字电路组合逻辑时序逻辑竞争-冒险总结

    竞争-冒险 竞争冒险定义 竞争:只要发生输入端信号的同时向相反的方向变化(输入端信号指的是任意一个与门或者非门,因此两个以上的不同信号,也可以为同一信号经过不同路径{反向}后同时向相反的方向跳变)由于 ...

  5. 实验记录二 示例程序

    在实验室呆了一整天,越来越喜欢这种感觉.把十七个测试程序都跑了一个遍,在电路板卡上折腾过来过去.晕.终于结束了.大致的了解到了自己接触的究竟是什么玩意,感觉不赖.坚持!用程序播梁祝,模拟交通灯等等,真 ...

  6. FPGA之道(77)静态时序分析(三)同步时序逻辑的分析原理

    文章目录 前言 同步时序逻辑的分析原理 逻辑锥的概念 逻辑锥的划分 逻辑锥的求解 建立时间求解原理 保持时间求解原理 一般逻辑锥的求解 一般建立时间求解 一般保持时间求解 前言 本文来自于<FP ...

  7. 组合逻辑和时序逻辑学习笔记

    目录 数字逻辑电路的种类 组合逻辑 时序逻辑 同步有限状态机 数字逻辑电路的构成 组合逻辑构成 时序逻辑构成 组合逻辑举例 一.一个八位数据通路控制器 二.一个八位三态数据通路控制器 数字逻辑电路的种 ...

  8. eNSP动态NAT实验记录

    将内部网络10.1.1.0/24转换为公网地址200.1.1.1-200.1.1.10/28上网(访问Server3),并抓包分析 验证动态NAT是单向转换 搭建实验环境 实现此案例需要按照如下步骤进 ...

  9. 零基础学FPGA(五):时序逻辑电路设计之计数器(附有呼吸灯实验、简单组合逻辑设计介绍)

    目录 日常·唠嗑 前言 一.认清逻辑设计 二.时序逻辑电路设计 三.扩展:呼吸灯实验 日常·唠嗑 第一次建立<零基础学FPGA>专栏,是在2021年2月2日,已经过去了一年了,目前只更新了 ...

最新文章

  1. 心得丨吴恩达Deeplearning.ai 全部课程学习心得分享
  2. linux 的ss看进程号,linux ss命令详解
  3. AIX 3D32B80D 错误
  4. 99. 恢复二叉搜索树
  5. TensorFlow全新的数据读取方式:Dataset API入门教程
  6. 2005/7/15[随便写写]
  7. G - Best ACMer Solves the Hardest Problem Gym - 101955G
  8. 最近重构公司消息服务的架构设计
  9. Cmake确实应该用到的时候再学
  10. 滤波 放电速度比充电慢 模电
  11. 中国剧本推理市场洞察2021
  12. 153. php 引用
  13. linux系统基本特点分时,Linux操作系统四个优点.docx
  14. 2021-2022年数学建模资料汇总——数学模型篇
  15. 机房收费系统个人重构—图(文档)
  16. 色彩原理-色相、明度、纯度
  17. 第一章 MapReduce概述
  18. APS计划排程和生产排产系统,包含哪些排程算法?
  19. [详细教程]jdk官方下载,Linux安装jdk1.7,图文解说,一看就会
  20. android获取网页标题,android获取系统自带浏览器书签

热门文章

  1. AS如何设置ProgressBar宽度以及实现反向进度条
  2. 蓝牙协议开发常见词汇缩写
  3. ReentrantLock 到底锁定了哪个对象了?
  4. C++ 异常 0xC0000005 访问冲突,exit code 0xC0000005 的解决方法
  5. Unity 2D横版移动跳跃
  6. 从SpriteKit看我的游戏人生
  7. 尼康d850相机参数测试软件,尼康(Nikon)D850 单机数码相机宽容度评测-ZOL中关村在线...
  8. 动词17【続】【長】【永】【存】
  9. Druid连接池的实用配置详解
  10. Acwing寒假每日一题(一)笨拙的手指