OpenEdv-开源电子网

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

明德扬FPGA项目实践1位闪烁灯设计

[复制链接]

31

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2018-7-19
在线时间
8 小时
发表于 2018-11-7 09:23:23 | 显示全部楼层 |阅读模式
1 项目背景
      LED(Light Emitting Diode),发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。





      上板效果图如下图所示:







      其中clk、rst_n是输入信号,led是输出信号,并且三个信号都是1比特的,根据这些信息,我们补充输入输出端口定义。代码如下:


3.2  信号设计
      我们再分析一下功能需求,LED灯的变化规律是暗1秒,亮N秒,其中N的变化是:1,2,3,---,9秒,然后再次循环。从现象转化成信号,其实就是信号led=1持续1秒,然后led=0持续N秒,其中N的变化是:1,2,3,---,9秒。波形示意图如下:


      上图就是led信号的变化波形图。在第1次时,led=1并持续1秒,然后led=0并持续1秒,共2秒时间;在第2次时,led=1并持续1秒,然后led=0并持续2秒,共3秒时间;以此类推,第9次时,led=1并持续1秒,然后led=0并持续9秒,共10秒时间。然后又再次重复。
      由波形图可知,我们需要1个计数器用来计算时间,如2秒、3秒等。本工程的工作时钟是50MHz,即周期为20ns,计数器计数到2_000_000_000/20=100_000_000个,我们就能知道2秒时间到了。以此类推,在第2次时,数到150_000_000个,就知道了3秒时间到。第9次时,数到500_000_000个,就表示10秒时间到。另外,由于该计数器是不停地计数,永远不停止的,可以认为加1条件一直有效,可写成:assignadd_cnt==1。综上所述,结合变量法,该计数器的代码如下。





      其中x表示该计数器cnt0要数的个数。该值如何定义,后面再思考。
      再次观察波形图,我们发现有第1次,第2次直到第9次的字,说明这还需要另外一个计数器来表示第几次。该计数器表示次数,自然是一次完成了就加1,因为加1条件可为end_cnt0。该计数器一共要数9次。所以代码为:



      有了两个计数器,我们来思考输出信号led的变化。概括起来,led有两种变化点:变0和变1。变0的原因都是计数到1秒时间,也就是cnt0数到1_000_000_000/20=50_000_000个时,led变0。变1的原因,都是计数时间到了,即end_cnt0。所以led信号的代码如下:



      最后我们再来思考变量x,我们在讨论计数器cnt0的时候,曾经说过“计数器计数到2_000_000_000/20=100_000_000个,我们就能知道2秒时间到了。以类类推,在第2次时,数到150_000_000个,就知道了3秒时间到。第9次时,数到500_000_000个,就表示10秒时间到。”可以看到,cnt0要数多少个是跟第几次有关系的。第1次,数100_000_000个,第2次数150_000_000个。也就是与cnt1有关。因此x的代码如下:



      此次,主体程序已经完成。接下来是将module补充完整。
3.3  信号定义
      接下来定义信号类型。
      cnt0是用always产生的信号,因此类型为reg。cnt0计数的最大值为500_000_000,需要用29根线表示,即位宽是29位。


       因此代码如下:


      add_cnt0和end_cnt0都是用assign方式设计的,因此类型为wire。并且其值是0或者1,1个线表示即可。因此代码如下:


​
      cnt1是用always产生的信号,因此类型为reg。cnt1计数的最大值为8,需要用4根线表示,即位宽是4位。因此代码如下:


​      add_cnt1和end_cnt1都是用assign方式设计的,因此类型为wire。并且其值是0或者1,1根线表示即可。因此代码如下:




​      led是用always方式设计的,因此类型为reg。并且其值是0或者1,1根线表示即可。因此代码如下:


      x是用always方式设计的,因此类型为reg。并且其值是最大是500_000_000,需要29根线表示即可。因此代码如下:


​      至此,整个代码的设计工作已经完成。下一步是新建工程和上板查看现象。
4    综合与上板4.1 新建工程
      首先在d盘中创建名为“my_led”的工程文件夹,将写的代码命名为“my_led.v”,顶层模块名为“my_led”




​      然后打开Quartus Ⅱ,点击File下拉列表中的New Project Wzard...新建工程选项:


​      3.再出现的界面中直接点击Next。


​      4.之后出现的是工程文件夹、工程名、顶层模块名设置界面。按照之前的命名进行填写,然后点击Next,在出现的界面再点击next。




​      5.之后是文件添加界面。添加之前写的“my_led.v”文件,点击右侧的“Add”按钮,之后文件会在下方显示出来,之后点击“Next”


      器件型号选择界面。选择Cyclone ⅣE,在芯片型号选择处选择EP4CE15F23C8,然后点击“Next”。​


      EDA工具界面。直接点击“Next”​


​      8.之后出现的界面,点击“Finish”。


​4.2  综合
      1.新建工程步骤完成后,就会出现以下界面。选中要编译的文件,点击编译按钮。
​


      2.编译成功后会出现一下界面


4.3  配置管脚


​      在菜单栏中,选中Assignments,然后选择Pin Planner,就会弹出配置管脚的窗口。


​      在配置窗口最下方中的location一列,参考下表中最右两列配置好FPGA管脚。


​      配置完成后,关闭Pin Planner,软件自动会保存管脚配置信息。
4.4   再次综合​


      在菜单栏中,选中Processing,然后选择Start Compilation,再次对整个工程进行编译和综合。​



      出现上面的界面,就说明编译综合成功。
4.5   连接开发板
      图中,下载器接入电脑USB接口,电源接入电源,然后摁下下方蓝色开关。


​4.6   上板
      1.单击以下界面中的。


​      2.会出现如下界面,点击add file添加.sof文件,点击“Start”,会在“Progress”出显示进度。


​       3.进度条中提示成功后,即可在开发板上观察到相应的现象。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-7-8 00:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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