FPGA_VHDL 学习课堂笔记

 

记录说明:本文档主要记录大学期间,老师FPGA授课课堂笔记。

代码语言:VHDL

编程软件:MAX+plus II

FPGA硬件:FLE-843

 

03月05日 理论课

wo先唠点:

FPGA硬件中有百万个逻辑门,我们可以通过编程将各种门组合连接,并将编程下载到FPGA中,以实现设计功能。编程分为文本编辑和图行编辑,图形编辑就是通过数电逻辑原理图,进行逻辑门间的线路连接。而文本编辑,是通过描述性代码,将设计者想要实现的功能转换成机器语言,使得FPGA根据机器语言,将内部的各种逻辑门进行搭建,以实现最终功能。需要注意的是,各种逻辑门的搭建方式完全由FPGA自己优化实现搭建,因而,我们控制的只是去描述下想要实现的最终功能即可。文本编辑主要由VHDL和Verilog两种,Verilog在工程上用的较多,但是由于其太灵活,有些想要实现的功能并不能由Verilog语言直接进行描述实现,还需要VHDL来解决。所以,我觉得VHDL和Verilog 的关系就像汇编语言和C语言的关系一样。不管哪个好,老师教的是VHDL,我的FPGA学习之路就由VHDL开始。但是我觉得在学习了单片机以后再来学习FPGA的最先要干的事是先把思想从单片机的顺序循环执行调到FPGA的并行运行模式,这样在学习FPGA时就不会限于原有的惯有思想了。

laoshi课堂:

    以1997年电子设计大赛中题目频率计,说明了FPGA应用的必要性(理解起来有点难,以后再写):

    先介绍MAX+Plus II软件的使用界面:

下载和使用网站:
http://www.bokeboke.net/articles/46960.html

  1. 打开软件max+plusII

 

双击图标:

 

  1. 新建文本文件

 

 

  1. 代码结构

整体代码包括一个实体和多个结构体(至少一个结构体),代码不区分大小写。以一个二选一数据选择器为例,介绍代码组成。

实体部分:(代码实体部分在上,结构体部分在下)

entity mux21
is -- entity引导实体开始,mux21是实体名(自定义,要求无汉字,开头非数字,末与库文件中关键词重复),is固定结构关键词。

port(a,b,s:in
bit; --port定义端口关键词,端口a,b,s是输入端口,bit表示是位数据

     y:out
bit); --端口y是输出端口,位数据类型。有关端口模式和数据类型见tip1.

end entity
mux21; --end entity 实体名,结束实体部分

 

结构体部分:

architecture one of
mux21
is --architecture关键词结构体开始

begin --begin关键词开始功能描述

y<=a when s='0' else --<=是赋值符号,y=a(端口a的值)当端口s为低电平,

b; --else,否则y=b(端口b的值)

end;
--结束结构体

 

*tip1:

端口描述:

a,b,s,y是端口名,任意取,s是数据选择端,y是输出端,根据s的值选择输出a或b的值;

in,out是端口模式,常用的端口模式有in(单向输入)、out(单向输出)、inout(双向I/O口,在某一时刻是单向的,其传输方向需要先设置)、buffer(缓冲输出,该模式下有一个反馈信号,用于检测输出的状态值,常用于计数器等设计)。

数据类型:

    bit表示是位数据,表明其取值范围为0或1;

    常用的数据类型有bit(只有0和1两种状态,较少使用)、std_logic(标准逻辑位,有9种状态)、bit_vector(位矢量)、std_logic_vector(标准逻辑矢量,可以表示多个数值,比如3 downto 0或0 to 3,说明有4个数值,每个都是标准逻辑位)、integer(整数型,要限定整数的范围,以便系统提供数据线,如H:integer range 0 to 99,系统会提供7条线)

并行语句:

    结构体中的语句不想C语言那样具有顺序性的执行,而是不分先后,同时进行的,对于结构体中出现的条件语句,判断条件时具有顺序性,但在进行赋值时是同时赋值,所以对于一个变量值要考虑其在同一时刻会被赋予不同值的情况。

 

  1. 文本文件存盘及代码输入


 

在代码输入前,先将文本文件命名后存盘,这样在输入代码时,软件会自动检测关键词,使得其变色,这样就可以看出来有没有把关键词代码打错了。需要注意,文本文件名是代码中的实体名+后缀.vhd。

 


 

按照上图,把文本文件设置成工程文件,才能在编写好代码后进行编译。

  1. 代码编译

     


若编译后有错误,需要从错误提示的第一条开始更改错误,这个和在学习C语言时的检错是一致的步骤。

  1. 波形仿真

    在代码编译通过后,进行波形仿真,也就是常见的时序图分析。给输入变量在不同时刻设置初值,进行软件仿真后,就可以看到输出端的时序逻辑,以判读代码是否达到设计要求。






     

保存好波形文件后,首先对时序仿真信号的总时间[End time]进行设定,默认值太小,根据需要设置放置的长度:



 

设置好仿真时间段后,对输入端s/a/b不同时刻进行赋值:


 

按照上述方法,对不同时间段的a/b端口依次赋值:


对输入端口赋完初值后,就可以进行仿真:





 

到此仿真结束。

 

03月12日 理论课

 

03月14日 理论课

 

03月19日 理论课

设计要求:

设计一个100进制的计数器,要求其按8421码进行计数(不是按照二进制码,所谓的8421码是指将十位和个位分开表示,对于个位计数范围为0~9,即0000~1001.同样,对于十位计数范围也是0~9)。其他功能要求有同步置数端(当同步置数端有效,若数据输入端为d,时钟为上升沿时将输出值置为d),异步清零端(异步清零不受时钟限制,应该作为敏感信号),计数使能端(只有当同步置数端无效时,才可以判读计数使能进行计数)。

输入端口:时钟输入端clk;异步清零端clr;同步置数端load;计数使能端en;数据输入端d.

输出端口:计数输出端q.

代码部分:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity count100 is

port(clr,load,en,clk:in std_logic;

     d:in std_logic_vector(7 downto 0);

     q:out std_logic_vector(7 downto 0));

end entity count100;

 

architecture one of count100 is

signal p: std_logic_vector(7 downto 0);

begin

process(clr,clk)

begin

if clr='1' then p<="00000000";

elsif clk'event and clk='1' then

        if load='1' then p<=d;

        elsif en='1' then

                if p(3 downto 0)="1001" then p(3 downto 0)<="0000";

                        if p(7 downto 4)="1001" then p(7 downto 4)<="0000";

                        else p(7 downto 4)<=p(7 downto 4)+1;

                        end if;

                else p(3 downto 0)<=p(3 downto 0)+1;

                end if;

        end if;

end if;

end process;

q<=p;

end;

 

tip:在Node那加端口;

波形仿真时,双击H可以改为Dec等进制,以便于查看数据;

对d赋值时,点波形左侧最下面的G开头,双击进去赋值;


对于赋值问题,由于采用的是8421码形式进行计数,但如果赋值大于1001,比如赋值为3F,则会变为30,因为低位为F,计数满了会变为0,而对于高位只有低位后才会加一,这就是为什么下一个数不是40的原因;

举一反三:若改为66进制,则计数范围为0~65。当计数值达到最大值65时,需要注意的是此时的个位是5而不是9,这个时候就要清零了。所以,编程思路应该为:先判断整体的值是否为65,如果是65就要先将整体(个位和十位)都清零(因而在后面的代码中就不需要判断十位什么时候到6了,到65后会自动清零);在判断个位是否到9后,如果个位到9个位清零,十位加一,如果个位没有到9,个位加一,十位不变。

再分析66进制赋值问题,如果赋值送的数大于66,则会自动加到99,再加的话会从A0一直加到F9才会清零,这个是因为代码中对于十位的清零只有在整体等于65时才会清零所致,所以个位到9就会清零,而十位一直加到F加满了才会变成0。

设计要求:分频器(改变时钟的频率)

wo先唠点:

对于一个硬件系统,为了防止多个时钟同时输入会产生竞争冒险,一般只会接一个外时钟,但是系统内部各个部分所需要的时钟频率并不是固定的,这就需要进行分配或者倍频实现。倍频是提高频率,一般最大为500Mhz,倍频较难实现,一般调用库IP内核直接使用。分频是降低频率,其分频原理是通过计数器来实现。把计数器的溢出作为分频输出信号就可以实现分频。比如一个10进制的技术器,输入端(若T=1us)来10个信号,才会使得溢出信号产生一个(T=10us),这就实现了10分频。

代码部分:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_unsigned.all;

entity fp10 is

port(clk:in std_logic;

     cp:out std_logic);

end entity fp10;

 

architecture one of fp10 is

signal p:integer range 0 to 9;

begin

process(clk)

begin

if clk'event and clk='1' then

        if p=9 then p<=0; cp<='1';

        else p<=p+1;cp<='0';

        end if;

end if;

end process;

end;        

FPGA_VHDL 学习课堂笔记001的更多相关文章

  1. [python学习手册-笔记]001.python前言

    001.python前言 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明 ...

  2. [Oracle]OWI学习笔记--001

    [Oracle]OWI学习笔记--001 在 OWI 的概念里面,最为重要的是 等待事件 和 等待时间. 等待事件发生时,需要通过 P1,P2,P3 查看具体的资源. 可以通过 v$session_w ...

  3. TensorFlow机器学习框架-学习笔记-001

    # TensorFlow机器学习框架-学习笔记-001 ### 测试TensorFlow环境是否安装完成-----------------------------```import tensorflo ...

  4. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  5. 九章算法系列(#3 Binary Tree & Divide Conquer)-课堂笔记

    前言 第一天的算法都还没有缓过来,直接就进入了第二天的算法学习.前一天一直在整理Binary Search的笔记,也没有提前预习一下,好在Binary Tree算是自己最熟的地方了吧(LeetCode ...

  6. 九章算法系列(#2 Binary Search)-课堂笔记

    前言 先说一些题外的东西吧.受到春跃大神的影响和启发,推荐了这个算法公开课给我,晚上睡觉前点开一看发现课还有两天要开始,本着要好好系统地学习一下算法,于是就爬起来拉上两个小伙伴组团报名了.今天听了第一 ...

  7. Java课堂笔记(零):内容索引

    回想自己学习和使用Java的时间也是很长了.本科期间课堂上浅尝辄止地学习了点皮毛,后来也是搁置不用,未曾深入研究.研究生期间因为项目和实习的原因,基本算是重新拾起Java这门语言,并且接触到了Spri ...

  8. 课堂笔记&总结与遇错纠错篇

    一.课堂笔记 二.个人总结 在学习和工作JDK是必不可少的程序员必备工具,遇到问题可以在帮助文档寻找答案! 接受能力不足,老师讲的知识点过去了,我经常还在想上一个知识点.希望老师有时候重点可以讲慢点哈 ...

  9. DSP28377S - ADC学习编程笔记

    DSP28377S -  ADC学习编程笔记 彭会锋 2016-08-04  20:19:52 1 ADC类型导致的配置区别 F28377S的ADC类型是Type 4类型,我的理解是不同类型的ADC采 ...

随机推荐

  1. WAMP中mysql服务突然无法启动 解决方法

    wamp的mysql服务前两天还能用,今天突然不能无法启动了,原因可能是近期电脑强行关机,删除wamp\bin\mysql\mysql5.6.17\data目录下的ib_logfile0和ib_log ...

  2. oracle dg 报错提示 涉及硬盘错误

    ###oracle dg 报错提示 涉及硬盘错误 Dec 23 03:28:01 xhisdg rsyslogd: [origin software="rsyslogd" swVe ...

  3. js实时显示鼠标坐标

    <!DOCTYPE html><html><head>    <meta charset="utf-8">    <title ...

  4. Centos 7环境下配置MySQL 5.7读写分离

    1.实验目的: 实现在Centos 7系统环境下,MySQL5.7读写分离. 2.实验条件: MySQL主服务器:Centos 7桌面环境,IP:10.10.11.31 MySQL从服务器:Cento ...

  5. 数据帧、MTU、MSS、IP分片

    1.以太网帧 在以太网链路上的数据包称作以太帧,在802.3标准里,规定了一个以太帧的数据部分(Payload)的最大长度是1500个字节(MTU),再加上14字节链路头和4字节的FCS,所以以太网帧 ...

  6. ZOL 3977. Pointers

    太久没有做 zoj,对 oj 来说,由于它高度的”黑盒性“(输入数据和答案完全保密),保护自信心是非常重要的.所以我先选择一道非常简单的题目刷起.本题目是一个相当简单的题目,难度系数和求 A+B 相当 ...

  7. perl IDE

    学习perl的网站 网上学习perl教程,可以参考下面2个网站: 1.http://www.runoob.com/perl/perl-tutorial.html 2.https://cn.perlma ...

  8. Day71Django基础

    Django框架基础一 python中的web框架    a:socket    b:路由跟视图函数匹配关系    c:模板渲染    django:  a: 用了别人的wsgiref   b:自己写 ...

  9. C# 反射获取属性类型及属性值,两个实体转换

    一.两个实体数据转换 /// <summary> /// 为属性赋值 /// </summary> /// <typeparam name="T"&g ...

  10. 学习excel的使用技巧复制一列文本成新列去重

    学习excel的使用技巧复制一列文本成新列去重 其实比较简单的技巧  知道了就会  不知道就比较麻烦 直接复制到一列 找到 数据选项 删除重复项