Steins;Lab

某团的自留研究所

小脚丫STEP FPGA开发板上手及初阶FPGA实验

由于项目原因,需要接触FPGA。入手了一块入门用的FPGA开发板,体会可编程逻辑器件的思想。

 

 

0 板卡信息

购买的开发板是STEP-MXO2-C

基本信息:

  1. 核心器件:Lattice LCMXO2-4000HC-4MG132
    • 132脚BGA封装,引脚间距0.5mm,芯片尺寸8mm x 8mm;
    • 上电瞬时启动,启动时间<1ms;
    • 4320个LUT资源, 96Kbit 用户闪存,92Kbit RAM;
    • 2+2路PLL+DLL;
    • 嵌入式功能块(硬核):一路SPI、一路定时器、2路I2C
    • 支持DDR/DDR2/LPDDR存储器;
    • 104个可热插拔I/O;
    • 内核电压2.5-3.3V;
  2. 板载资源:
    • 两位7段数码管;
    • 两个RGB三色LED;
    • 8路用户LED;
    • 4路拨码开关;
    • 4路按键;
  3. 36个用户可扩展I/O(其中包括一路SPI硬核接口和一路I2C硬核接口)
  4. 支持的开发工具Lattice Diamond
  5. 支持MICO32/8软核处理器
  6. 板上集成FPGA编程器
  7. 一路Micro USB接口
  8. 板卡尺寸52mm x 18mm

 

使用的开发工具为Lattice提供的 Diamond

http://www.latticesemi.com/en/Products/DesignSoftwareAndIP/FPGAandLDS/LatticeDiamond.aspx

 


1 FPGA预备

使用FPGA前,需要将它和之前一直使用的MCU对比一番。

FPGA(Field-Programmable Gate Array),即现场可编程门阵列

与单片机的简要区别

单片机硬件架构已经固定。CPU从时间上考虑,FPGA从空间上考虑,比如增加很多乘法器、加法器实现并行计算(比如不必等待同一个加法器多次执行)。IO口可自行配置。

 

FPGA特色汇总

  • 并行性,可以同时处理不同运算数据或任务。
  • 速度快,FPGA可对时钟倍频作系统时钟,加之并行性,可以达到较高的数据处理速度。
  • 丰富的片上硬件资源(逻辑单元和I/O管脚资源)。
  • 数字电路硬件开发无需投板,周期短,费用低,可重复编程。
  • 可嵌入CPU核,实现CPU和FPGA联合设计,协同处理。

 

一般流程

加法器、乘法器、寄存器、IO等等。

可以实现“软核”,甚至在其中搭建单片机核。

相关厂商

 

 

2 实验

本笔记以实验的形式学习FPGA开发。主要以Verilog语言进行开发。

值得指出的是,实验的价值并不在于其实验本身,而是在于通过实验体会FPGA设计与MCU设计得不同之处。

2.1 组合逻辑

2.1.1 38译码器

组合逻辑电路是数字电路的重要部分,电路的输出只与输入的当前状态相关的逻辑电路,常见的有选择器、比较器、译码器、编码器、编码转换等等。在本实验里以最常见的3-8译码器为例说明如何用Verilog实现。3-8译码器的真值表如下:

EDA工具解释:目前进入我国并具有广泛影响的EDA软件是系统设计软件辅助类和可编程芯片辅助设计软件:Protel、PSPICE、multiSIM10(原EWB的最新版本)、OrCAD、PCAD、、LSIIogic、MicroSim,ISE,modelsim等等。这些工具都有较强的功能,一般可用于几个方面,例如很多软件都可以进行电路设计与仿真,同时还可以进行PCB自动布局布线,可输出多种网表文件与第三方软件接口。

本文中使用的EDA工具即为Lattice提供的 Diamond软件。

图:Lattice提供的 Diamond软件

 

关于Verilog:Verilog(国际标准为IEEE 1364), 是一种专用来模型化电子系统的硬件描述语言(HDL),它通常被用于在寄存器传输级(RTL)抽象层面进行数字电路的设计和验证,它也被用于模拟电路和混合信号电路的验证,以及通用电路的设计。

具体的Verilog我将通过专门的“FPGA开发床头必备”的Verilog书籍学习,本文仅对实验内容进行叙述。

我们来看一下38译码器使用Verilog实现的代码:

该例程很好地体现了使用Verilog设计FPGA的思想:制定硬件的布线和逻辑策略,FPGA是可编程的硬件。

相关语法:

  1. begin end 将多条语句组成顺序块,类似c语言的{}
  2. case() endcae 是多分支选择语句,类似c语言的选择,但是每个分支各不相同,执行分支语句后即跳出

 

2.1.2 数码管

数码管是工程设计中使用很广的一种显示输出器件。一个7段数码管(如果包括右下的小点可以认为是8段)分别由a、b、c、d、e、f、g位段和表示小数点的dp位段组成。实际是由8个LED灯组成的,控制每个LED的点亮或熄灭实现数字显示。通常数码管分为共阳极数码管和共阴极数码管,结构如下图所示:

数码管所有的信号都连接到FPGA的管脚,作为输出信号控制。FPGA只要输出这些信号就能够控制数码管的那一段LED亮或者灭。这样我们可以通过开关来控制FPGA的输出。

事实上,操作数码管,就是要构建一个4-16译码器,真值表如图:

 

Verilog代码如下:

思路很简单,就是用4路输入来根据情况选择输出的状态;其中输出状态通过存储器的形式预先设置好。

 

Verilog相关语法:

  1. 用reg声明寄存器变量 reg [8:0] seg;
  2. 用reg生命存储器(寄存器组)reg [8:0] seg[15:0];
  3. 用存储器操作wire [8:0] a,b; assign a= seg[1]; assign b=seg[1][5:0];
  4. initial关键字 用于给寄存器或存储器初始化数据

 

在EDA设计工具中将FPGA的引脚(对应板子上的资源引脚)与内部逻辑引脚连接起来,也就是所说的管脚约束。这个方面每一家FPGA公司提供的工具链都不一样,但是对于FPGA开发的流程是大致相同的(见上流程图),这里不再赘述。

在我的开发板上下载完成后,实验结果如下:

图:根据拨码开关不同改变的数码管显示值。

 

2.2 时序逻辑

2.2.1 分频器

废话不多说,我们来看一下分频器Verilog代码

其中分频方法使用了“计数分频”,看以下代码:

这个和我们使用MCU时,根据时钟,使用计数法产生延迟或者生成PWM时是一个思想。

下图为模拟的信号

可以看到cnt_p和cnt_n差了半个时钟周期。可以将上升沿和下降沿激活的信号一起使用,产生50%占空比的“奇分频”方波(clk3)!

Verilog语法

  1. parameter定义参数,模块内范围有效,例化时可以通过参数传递更改参数
  2. localparam定义的参数不可传递更改
  3. 除法和取余数尽量少用,耗费资源且不稳定。
  4. Verilog中,左移相当于乘2,右移相当于除2取商(二进制乘除运算就是移位!)

 

关于赋值方式

阻塞赋值方式 =

在块内语句逐条进行赋值(理解成按照逻辑赋值),但是在时间上,这几个变量是同时改变的。

建议在组合逻辑中使用

非阻塞赋值方式 <=

块内语句同时执行,建议在时序逻辑中使用

 

2.2.2 流水灯设计

终于到了激动人心的流水灯环节了!流水灯简直是硬件开发的“Hello World!”

看一下我们设计流水灯的框架:

 

代码中,直接调用了之前的divide模块。可以理解成c语言中的调用函数。

首先使用分频器产生1Hz的信号,再以此信号当做我们本模块的“基准时钟”。在产生的1Hz的clk1h上升沿时出发逻辑,进行led移位。实验了循环移位功能

Verilog语法:

  1. {}  表达式为{A,B}  将AB连接起来,产生更大的向量
  2. {{}}  表达式为{B{A}} 将A重复B次

注意,这里也体现了思想,就是模块化可编程设计。divide分频器可以在以后的工程中直接拿过来用!

实验结果:

自此我们学会了使用板上的时钟产生分频的方法。也可以操作数码管自增。

 

 

2.3 按键消抖

相信所有实验过单片机学习的同学,都进行过按键处理的学习。

按键占用一个IO口,通过上拉/下拉与另一端相连。但是,物理世界是不稳定的,按键时会有无数的抖动,如果我们没有对抖动进行处理,那么将产生位置次数的按击效果,因此我们常常使用“延时消抖”和“周期消抖”的方法进行处理

2.3.1 延时消抖

延时消抖思路如下:

首先进行边沿检测,如果按下,立即触发计数器进行计数,一定时间后,还有下降,那么我们就认为按下了按键,进行信号输入。(相当于软件,这个模块进行检测,然后给予内部逻辑“是否按下”的逻辑信号)

 

2.3.2 周期消抖

周期消抖就是检测到变化后,隔一个周期(比如10ms)后再次检测,如果仍然是按下状态,则认为成功按下。

 

2.4 PWM与呼吸灯

PWM是我们非常熟悉的东西,FPGA产生PWM要怎么做?相信根据之前的时间,我们的思路已经有了。就是根据时钟进行计数、分频的同时,在指定时间进行输出的变化。但是,FPGA中有硬件的优势。下面看一下FPGA的PWM发生器方法:

解析如下:

需要一个三角波,一个比较器,即可产生PWM信号!

 

看一下PWM基本的实现:

就把我们MCU中实现的思路变成了一个硬件PWM模块!!!!

 

好,然后我们来讲PWM和LED灯组合产生呼吸灯:

代码中,是两个PWM发生器控制LED灯。综合后分配引脚,下载到FPGA中,实验结果如下:

 

2.5 状态机

状态机在数字电路设计中,是一个非常重要的组成部分,也是贯穿于整个设计最基本的世纪思想和设计方法。在现代数字电路设计中,状态机的实际对于系统的高速性、高可靠性、高稳定性都有决定性的作用。熟练掌握状态机的设计,是FPGA的Verilog设计的必备技能。

经过我在网络上的搜集,我认为,三段式写法模式很好理解,可以进行复用。三段式的状态机写法结构如下:

 

接下来我将使用板载资源进行实验。

我们打算做一个交通灯,对于本交通系统的状态机分解如下:

交通灯主路上绿灯持续22秒时间,黄灯4秒时间,红灯16秒时间;

交通灯支路上绿灯持续12秒时间,黄灯4秒时间,红灯26秒时间;

 

然后,我们利用板载资源对以上状态序列进行实验。

在最后,使用segment模块进行对数码管的操作,体现了模块思想。附数码管控制模块代码(之前我们做数码管实验生成的。)

最后综合下载到板上,效果如下:

状态1  主绿灯 从红灯 倒计时

状态2 主黄灯 从红灯

状态3 主红灯 从绿灯

状态4 主红灯 从黄灯(图略)

 

 

 

 

2.6 IP核例化

注:IP核使用在各家(Xilinx、Altera、Lattice)提供的工具链中,具体操作不尽相同。本节中,使用的Lattice提供的Diamond开发工具(我购买的FPGA开发板是Lattice的)。之后很可能使用的是Xilinx或Altera的产品。因此我们将理解重点放在IP核使用的一般流程上。

 

IP核,全称知识产权核(英语:intellectual property core),是指某一方提供的、形式为逻辑单元、芯片设计的可重用模块。调用IP核能避免重复劳动,大大减轻工程师的负担。

IP核分为软核、硬核和固核。软核通常是与工艺无关、具有寄存器传输级硬件描述语言描述的设计代码,可以进行后续设计。

 

通俗地说,IP核就是在我们使用厂商提供的开发工具时能直接拿来利用的模块,往往配以图形化界面进行例化和配置。

常见的IP核类型:

PLL配置

RAM

IO相关

乘法器加法器等算法核、滤波器

 

在Diamond中,我们进入IP核例化界面,如下:

选择我们需要使用的IP核。我们选择PLL进行探索:

从此可以使用图形化界面对这块PLL进行设置,包括输入的设置,PLL分频即功能设置,多PLL输出倍频设置。

设置完毕后,我们输出该IP核。

IP核被添加进我们的工程中。

注:我们之前用Verilog进行编程时,每个部分都写作module。我们引用的PLL的IP核,就是一个module,用来减轻我们工作量的可靠的module。

 

 

9
说点什么

avatar
5 Comment threads
4 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
5 Comment authors
树RSPtuanfandyRe'e Recent comment authors
  Subscribe  
最新 最旧 得票最多
提醒
树
游客

!!!

R
游客
R

博主在学习FPGA时,肯定也要学习VHDL。请问有什么优秀的VHDL的教程可以参考吗?

fandy
游客
fandy

催更

Re'e
游客
Re'e

博主这么喜欢Arduino,有没有考虑过参加泰雷兹杯Arduino竞赛?

匿名
游客
匿名

团长现在研究生啥方向啊