EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
大侠好,欢迎来到FPGA技术江湖。本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,让电子、信息、通信类专业学生、初入职场小白及打算进阶提升的职业开发者都可以有系统性学习的机会。 系统性的掌握技术开发以及相关要求,对个人就业以及职业发展都有着潜在的帮助,希望对大家有所帮助。本次带来Vivado系列,本篇为FPGA零基础学习之Vivado-LED流水灯实验。话不多说,上货。 8 r- ], f; X$ a* R' ^
' @# F& h; Q3 V$ EFPGA零基础学习之Vivado-LED流水灯实验 * T) B- ~3 I% r7 X1 Z% k8 c
- I& w; ]2 t; ~4 d/ q 6 _3 ?0 k1 } W2 i
( p% }5 j7 q8 }6 c- f6 [, p" S* B
流水灯是大多数学习者接触到的第一个实验,也是非常经典的一个实验,在此,我们一起学习一下流水灯。 . s" u8 U/ T7 j. J7 n# r
LED,又名发光二极管。LED灯工作电流很小(有的仅零点几毫安即可发光),抗冲击和抗震性能好,可靠性高,寿命长。由于这些优点,LED灯被广泛用在仪器仪表中作指示灯、液晶屏背光源等诸多领域。 & B- n& D& W7 u8 v# u
发光二极管与普通二极管一样具有单向导电性。给它加上阳极正向电压后,通过5mA左右的电流就可以使二极管发光。通过二极管的电流越大,发出的光亮度越强。不过我们一般将电流限定在3~20mA之间,否则电流过大就会烧坏二极管。 " X; M0 e# N. s, ~. x
在我们的开发板上有四个LED,设计逻辑为:FPGA 输出高电平时,LED 点亮;FPGA 输出低电平时,LED 熄灭。
, z( K( E& ~ h: U/ T
0 ^; g! L7 f4 Q; w+ i
4 C) B% G4 {( V& i% ~# D3 G' W% ~9 N5 {% c- c' G3 j% H; M
, r2 r: X# v+ Y
* p4 ?7 v1 V" l7 h2 m5 T7 v
本次设计框架如上图。
& Z D& B+ z# I$ k & ]1 v" m, z1 {4 A% F6 f- A
管脚说明: 4 G4 h" P2 v9 v# [5 |& o4 Y
& i' ?. i, r2 w4 W" |0 N" L3 Q
; B. @9 O0 ]7 a) T6 J
设计代码如下: * y+ r7 S' | S: d
$ y1 ^# }& p- U
5 \( O* {6 x6 l" f6 y( a/ c: P2 u
, U! M, | @! l3 {; T- P. P
4 p7 C' Y0 ^ j& ^. vparameter 可以定义一个参数(默认是32 位)。在写代码时,对于某些数字,设计者经常利用定义参数的方式进行编写,方便修改,也方便阅读。
) K' V$ E1 A; q0 o- O: o% @
其中计数器,需要计数到1s所需的次数,时间到了之后,LED灯切换点亮。按照此规则,实现LED的循环点亮。
; j. R( q @0 ^ J& I. W, y- t
在verilog 中,“{}”( 大括号)的第一个特殊作用为位拼接。{a,b}相当于将a 和b 拼接为一个整体,并且是高位为a,低位为b。当led 输出为4’b0001 时,第一个led 点亮;经过1 秒钟,输出4’b0010 时,第二个led 点亮;经过1 秒钟,输出4’b0100 时,第三个led 点亮;经过1 秒钟,输出4’b1000 时,第四个led 点亮;经过1 秒钟,输出4’b0001 时,第一个led 点亮······按照上述的过程周而复始,就形成了流水灯。 & R1 Q! D! b. R# v# O; @
不难发现,led 的输出,一直为3 个0,1 个1。并且1 的位置每1 秒钟移动一次,从头到尾,然后又到头。这种现象可以利用移位的思想进行实现。即:led[3]<=led[2]; led[2]<=led[1];led[1]<=led[0]; led[0]<=led[3];如果将被赋值的组成一个整体,那就是led,赋值的组成一个整体就是{led[2:0], led[3]}。
% |( Z( n" |5 h: @+ i0 d0 U8 e* A3 ~
仿真代码: , g! g8 R7 y! P/ x- N! ~; F- h
) d, Q; d9 t7 Y3 ]$ _( w8 {
1 T9 x2 z( z1 U s
0 w! i* z/ x) m G- @: Q) j
& t, _$ Q. g; L% e
$stop 是一个系统任务,功能为将仿真工具的仿真停止。运行分析综合后,打开RTL 仿真。
6 {3 s/ d5 I% A
1 c3 B# Z4 I! g. z/ }" h; j+ d* } b( s8 r. v
( n, ]* ] k8 e9 E. @6 h8 t
点击Run Simulation,打开仿真器。可以看到如图所示波形。
u. K- E* F( U. N2 ^
3 K* X/ h {2 _6 V
$ r) j$ @# ~/ W; N% `$ R; X1 y
9 F. @9 L7 S8 w& T+ S+ X
7 |! U: {: w4 w! n
由于我们设计的流水灯是每1 秒钟流动一个,在上述的仿真中,led 数值是不会变化的。如果仿真几秒钟的话,仿真的时间会比较长。在此不建议仿真几秒钟的时长,有可能会导致电脑卡住。
2 z C; s3 i) {* I3 W
3 m, b3 p4 l9 G% [: H# M( @3 h仿真时,可以将t 的值,改成一个较小值。例如:10。然后在此编译仿真。改的时候我们可以在仿真文件中加入一句话:
* I0 {# E; h+ d6 d1 @% S9 \
& _& ?: Q! u9 B
3 h6 m4 O4 V! I, w, x
- T% S6 M: w# T' [0 k( \
修改后我们重新运行仿真工具,可以看到如图所示波形:
' h& | D1 l% R, }, Z
8 O* t. l3 h" ^3 i( _' ~
5 o/ j! X' S- |0 s1 U
, u# `( Y7 F! ?/ `( w% y& _0 u
这样我们可以清楚的看到输出变化的过程。另外,我们这样做还有一个省事的地方,就是我们下板不需要再修改t的参数。 " ~6 _) n- g$ g) C
* u3 ?" B8 N# v( Z接下来我们分配引脚,生成下板文件。 % L' \5 o3 A4 n2 E. x. i y# C$ T
( n: s# M$ O. w* C3 H6 L
3 ~6 p4 _4 `0 T. [( Y% \" e1 C( f9 m$ ?% |' k/ C. B0 Y& G
分配好之后,点击Generate Bitstream。 . S% b9 ?( `4 m2 d6 m5 E8 ]6 U2 e) N
2 Y* G9 i7 b& D E' O
8 R# f | n; a8 \: y
8 o( X6 b1 u% M0 o; {% [3 n
生成完成之后,点击open Hardware Manager。下板即可。
5 i& g" w6 i" U. Y6 T/ K1 m+ F+ x% m! ~2 I$ o
7 x. z% p `6 ~% `
|