OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9289|回复: 24

小梅哥和你一起深入学习FPGA之点亮LED灯

[复制链接]

40

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2013-10-23
在线时间
94 小时
发表于 2014-10-23 16:08:25 | 显示全部楼层 |阅读模式

    在昨天更新的目录里面,并没有安排这个实验,第一个实验应该是独立按键的检测与消抖。可是,当小梅哥来做按键消抖的实验时,才发现没有做基本的输出设备,因此按键检测的结果无法直观的展示出来。也算是为后续实验做铺垫吧,第一个实验就安排成了点亮LED灯。

 

一、        实验目的

实现4LED灯的亮灭控制

 

二、        实验原理

LED灯的典型电路如下2-1所示,我们控制led灯的亮灭,实质就是去控制FPGAIO输给LED负极一个低电平或者高电平。从图中可知,我们给对应的led负极上一个低电平,就会有对应的电流通过 电阻,流过led灯,于是LED灯就会被点亮;当给led负极一个高电平时,led两端电压相等,因此没有电流流过,led则呈熄灭状态。


2-1 led灯典型电路

        

三、        硬件设计

本实验的硬件电路即如图2-1所示,读者一看即懂,因此本节内容略。

 

四、        架构设计

虽然本实验只是一个简单的点亮led灯实验,整个实验代码不过四五行,但是为了遵循小梅哥一直喜欢的那种模块化的设计理念,因此本设计还是将led的驱动做成子模块的形式。

本实验由两个模块组成,分别为led驱动模块和顶层例化模块,可能看过其它开发板资料的同学会觉得这样反而增加了系统的复杂程度,但是,小梅哥如此设计必定有我的道理,图4-1为本实验的模块组织结构


4-1 led实验模块组织结构图

由图可知本实验仅有n个输出端口,对应了nled灯(为了代码的可移植性,这里并没有将led的个数限定死,而是采用了参数化的设计,因此,在实际使用过程中,就可根据实际不同的需要,自由的调整led的个数)。在modelsim仿真过程中,所有信号必须要有复位初始值,因此复位信号(Rst_n)必不可少。可能读者这里会发现,与我昨天所写的端口命名规范有出入。如果按照我所出的规范中来命名的话,则应该将复位信号命名为Global_Rst,对于这个问题,暂时小梅哥不做深入解说,其实严格意义上来说,这里的这个Rst_n应该只能算是一个内部信号,该信号在实际工程应用中往往由锁相环产生。这里因为为了配合仿真,因此该信号就暂时被引出来,做了全局复位信号。详细的关于全局复位与内部复位信号的处理,小梅哥在后面涉及到锁相环的使用的实验中会详细解说。

 

端口说明

端口名

端口功能或意义

Rst_n

全局复位

Sig

LED控制输入,LED输出状态将于本信号的各位状态一致

Led

LED驱动输出Pin,驱动控制LED灯亮灭

4-1 led实验端口说明

五、        代码组织方式

                  本实验中,每个模块也就四五行的代码,因此谈不上代码组织方式,因此本节从略。

 

六、        关键代码解读

module LED_Driver #(parameter Width = 1)/*定义位宽参数*/
						(Rst_n,Sig,Led);/*定义模块端口*/

	input 	Rst_n;
	input 	[Width-1:0] Sig;
	
	output 	[Width-1:0] Led;
	
	assign Led = (Rst_n)?Sig:{Width{1'b1}};/*复位输出全1,否则按照Sig的值输出*/
	
endmodule
[/mw_shl_code]


以上为LED驱动模块的代码,第1行定义了一个参数“Width”,即位宽,因此在例化(调用)此模块时,根据实际需要给Width赋予不同的值,则可实现不同的LED位宽的设置。第47行为输入输出端口定义,具体信号含义见表4-1。第9行为LED输出赋值语句,有关该代码的含义,请读者自行阅读夏宇闻老师的《Verilog数字系统设计教程》一书。小梅哥精力和时间实在太有限,没办法一一帮大家补充Verilog的知识,望见谅。总之,该语句实现了当复位信号为低电平时(系统处于复位状态),所有LED全部熄灭;当复位信号为高电平(系统正常工作)时,led输出对应的Sig信号各位的状态。

module LED_TOP(Rst_n,Led);

	
	input Rst_n;
	
	output [3:0] Led;
	
	LED_Driver 
	#(	/*参数例化*/
		.Width (4)
	)
	LED_Driver_inst(/*端口例化*/
		.Rst_n(Rst_n),
		.Sig(4'b1001),/*OFF ON ON OFF*/
		.Led(Led)
	);

endmodule
[/mw_shl_code]
	
 

以上为LED实验的顶层模块,其中将位宽参数例化为了4,即4LED。因为没有其他模块提供Sig信号,因此直接将该信号赋值为4’b1001。则如果下载到实验板上,会看到4led灯分别处于“灭 灭”的状态。

  

七、        测试平台设计

本实验主要对LED的输出和输入与复位的关系进行测试仿真,通过仿真,即可验证设计的正确性和合理性。相关testbench的代码如下:

`timescale 1ns/1ns

module LED_Driver_tb;
	
	reg 	Rst_n;
	reg 	[3:0] Sig;
	
	wire 	[3:0] Led;
	
	LED_Driver 
	#(	/*参数例化*/
		.Width (4)
	)
	LED_Driver_inst(/*端口例化*/
		.Rst_n(Rst_n),
		.Sig(Sig),/*OFF ON ON OFF*/
		.Led(Led)
	);
	
	initial begin
		Rst_n = 0;
		Sig = 4'b1010;
		#100;
		Rst_n = 1;
		#40 Sig = 4'b0001;
		#40 Sig = 4'b0010;
		#40 Sig = 4'b0011;
		#40 Sig = 4'b0100;
		#40 Sig = 4'b0101;
		#40 Sig = 4'b0110;
		#40 Sig = 4'b0111;
		#40 Sig = 4'b1000;
		#40 Sig = 4'b1001;
		#40 Sig = 4'b1010;
		#40 Sig = 4'b1011;
		#40 Sig = 4'b1100;
		#40 Sig = 4'b1101;
		#40 Sig = 4'b1110;
		#40 Sig = 4'b1111;
		#40;	
		$stop;
	end
	
endmodule


[/mw_shl_code]
	

    testbench中可以看出,初始值给Sig赋了一个初始值,系统处于复位状态,100ns后,复位过程结束,系统进入正常工作状态,Sig信号每隔一定时间变化一次。因此,只需要观察Led信号与Sig信号的关系,即可验证设计的正确与否。

 

八、        仿真分析

由上图仿真结果可知,当复位信号为低电平时,Led输出全部为1,则所有LED熄灭,当复位信号为高电平时,则Led输出与Sig信号一致,证明设计正确无误。对于顶层模块,仿真没有什么太大的实际意义,因此不做仿真。

九、        下板验证

手头暂无开发板,板级验证略。

 

十、        总结

         可能很多初学FPGA,又看过其它一些资料的同学会对小梅哥的这种组织方式感觉不太习惯,认为本来一个代码模块就能搞定的事儿被我硬生生拆成了两个,增加了系统的复杂性。其实,我这里主要是强调了一种建模的思想,我们所做的模块一定要具有灵活性和通用性,当其它设计中需要用到该外设时,只需要关心其内部端口就行了,在顶层例化时只需要将对应信号接到该端口上就能实现功能了,不用再专门为了特定应用再写一次。目前系统简单,可能大家还看不出这种方式的优势,随着以后的设计越来越复杂,大家就能很明显的看到这种设计方式的优势所在了。

http://xiaomeige.taobao.com。做最用心的FPGA学习板和教程资料
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 2014-10-23 17:25:44 | 显示全部楼层
你应该从零开始写,平台的搭建,开发的流程,Quarter 跟Modelsim的使用等等,不然的话,没有FPGA基础的人,看你现在写的文章就像是看天书一样
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

40

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2013-10-23
在线时间
94 小时
 楼主| 发表于 2014-10-23 19:02:26 | 显示全部楼层
回复【2楼】mzwhhwj:
---------------------------------
工程量太大,而且发图片这个东西,你也知道,在论坛上很麻烦的。我打算文档写完后出一套视频,通过视频讲解来让更多的入门者快速掌握。精力有限,时间也不多,确实很纠结
http://xiaomeige.taobao.com。做最用心的FPGA学习板和教程资料
回复 支持 反对

使用道具 举报

11

主题

1041

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3696
金钱
3696
注册时间
2011-5-23
在线时间
2008 小时
发表于 2014-10-23 19:35:05 | 显示全部楼层
 呵呵,第一次写的LED代码就一行
[mw_shl_code=c,true]assign led = in;[/mw_shl_code]
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2014-10-23 20:00:25 | 显示全部楼层
建议梅哥出个入门手册,这样对新手来说还是比较受欢迎的,像原子哥的就不错,很适合初学者,楼主不妨试下,不过写文档这东西就是费脑子,和写代码一样蛋疼
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

40

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2013-10-23
在线时间
94 小时
 楼主| 发表于 2014-10-23 21:03:59 | 显示全部楼层
回复【5楼】Badu_Space:
---------------------------------
好的,我准备一下,争取本周内出来。或者直接出两个视频
http://xiaomeige.taobao.com。做最用心的FPGA学习板和教程资料
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-10-23 22:59:44 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 2014-10-24 10:10:41 | 显示全部楼层

       我也跟着楼主重新学习下FPGA,再做些补充。Verilog是硬件描述语言,也就是用它来写的代码,其实是在描述出来硬件来,用不是很正确的说话可以说是用Verilog写出来的是硬件电路。具体是什么硬件电路,我们是可以用RTL网表来看的。就楼主的代码,我用Quartus 综合RTL网表给大家看看就知道他这里具体是什么怎样的硬件电路来实现点亮LED灯的。上图


可以看到楼主的LED_Driver模块的电路其实就是4通信的二选一选择器。数电学的还可以的同学们一眼就可以看出工作原理来。Rst_n低电平,选通4‘hF和LED[3..0],也就是二进制LED[3..0]的电平都为1111,LED不会被点亮。Rst_n为高电平里,选能Sig[3..0]跟Led[3..0],LED的输出电平就是Sig的电平。这里Verilog就用到很简单的代码就可以描述出来一个4通道的二选一选择器,如果Rst_n,Sig,Led这些信号都具体的分配到FPGA的实际管脚上去,然后再把代码下载到FPGA芯片上,那么FPGA就变成了一块4通道的二选一选择器芯片,没错,这样我们就设计出了一块数字IC。
     

已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

40

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
921
金钱
921
注册时间
2013-10-23
在线时间
94 小时
 楼主| 发表于 2014-10-24 12:47:54 | 显示全部楼层
回复【8楼】mzwhhwj:
---------------------------------
这个方式不错,我们可以一起学习,一起分享,一个人力量太有限了
http://xiaomeige.taobao.com。做最用心的FPGA学习板和教程资料
回复 支持 反对

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 2014-10-24 13:03:24 | 显示全部楼层
回复【9楼】小梅哥:
---------------------------------
我看Verilog的代码都要结合RTL来看,因为Verilog代码都是零散的,只看代码很难理出来头绪来。可以加我QQ:53762017
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

9

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2014-9-25
在线时间
23 小时
发表于 2014-10-24 21:15:48 | 显示全部楼层
梅老板  你太给你啦
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-10-24 22:58:05 | 显示全部楼层
谢谢分享。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2015-3-19
在线时间
0 小时
发表于 2016-3-15 22:03:49 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2015-3-19
在线时间
0 小时
发表于 2016-3-15 22:04:59 | 显示全部楼层
哈哈,感谢煤老板的精彩讲解
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-30
在线时间
1 小时
发表于 2016-3-30 10:02:07 | 显示全部楼层
12312312312312312312312
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
41
金钱
41
注册时间
2016-3-20
在线时间
5 小时
发表于 2016-3-31 16:29:20 | 显示全部楼层
thanksgiving
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2016-4-20 13:28:59 | 显示全部楼层
您是那个红遍21IC上的笑么小梅哥吗?
回复 支持 反对

使用道具 举报

10

主题

64

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3105
金钱
3105
注册时间
2012-3-12
在线时间
261 小时
发表于 2016-8-22 08:56:56 | 显示全部楼层
mark!!
回复 支持 反对

使用道具 举报

1

主题

80

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2860
金钱
2860
注册时间
2015-3-29
在线时间
284 小时
发表于 2016-9-2 00:19:34 | 显示全部楼层
期待......
回复 支持 反对

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-8-30
在线时间
3 小时
发表于 2016-9-13 09:26:04 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2015-10-8
在线时间
36 小时
发表于 2016-9-23 11:28:12 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2014-11-11
在线时间
11 小时
发表于 2016-11-13 18:53:48 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-11-12
在线时间
1 小时
发表于 2017-3-22 05:29:57 | 显示全部楼层
谢谢小梅哥
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2017-10-23
在线时间
20 小时
发表于 2017-10-23 15:12:13 | 显示全部楼层
啊撒的发的说法
回复 支持 反对

使用道具 举报

1

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
350
金钱
350
注册时间
2015-3-19
在线时间
105 小时
发表于 2019-5-22 15:28:54 | 显示全部楼层
OK GOOD THANK
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 11:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表