电脑桌面
添加盘古文库-分享文档发现价值到电脑桌面
安装后可以在桌面快捷访问

fpga流水灯实验报告

来源:火烈鸟作者:开心麻花2025-10-111

fpga流水灯实验报告(精选5篇)

fpga流水灯实验报告 第1篇

单片机流水灯实验

一、任务

让8个LED灯轮流亮起来,实现流水灯的功能。

二、思路

让接在P0.0口的LED灯亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的LED灯熄灭,就要把P0.0口的电平变为高电平就可以了。要实现流水灯功能,只要将8个LED灯依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。

我们应该注意一点,由于单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。

三、步骤

1、用proteus画电路图。如下图:

2、用keil建工程。

1)运行keil C51软件,点击Project菜单新建项目,选择为AT89C52的单片机型号。然后单击File选择New新建程序文件,保存成.c 文件,右击Source Group1添加入程序文件。2)用C语言编写程序代码如下:

#include void delay(unsigned char tmp);code unsigned char tmpled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void main(void){ unsigned char i;while(1){ for(i=0;i<8;i++){

P0=tmpled[i];

delay(50);} } }

void delay(unsigned char tmp){ unsigned char i,j;i=tmp;while(i){ i--;j=255;{

j--;} } } 3)右击Target 1打开设置,Output菜单下勾选上create hex file。

4)调试运行程序后,在proteus中双击单片机,添加hex文件,运行看到流水的的效果。

四、实验中遇到的问题。

1、用proteus仿真时候,发现错误:

error variable not found parsing property resistance of RN1-Rnvalue expected for RN1-R(n=1~8)而且led灯亮度十分微弱。可能是接入的电阻太大了。

检查电路图发现排阻的值为RX8,修改为220(自己选择)后。错误便没有了,同时,led灯的亮度也增强了。

2、关于延时函数。

延时的时间计算不太明白。

3、P0=0xfe;是对单片机P0口的8个I/O口同时进行操作,0x后的数使用十六进制表示,fe转换为二进制是1111 1110,则P0.0为低电平,对应的led灯亮,其他7个led灯灭。

fpga流水灯实验报告 第2篇

设计课题:

多功能流水灯

专业班级:

学生姓名:

指导教师:

设计时间:

题目 多功能流水灯

一、课程设计目的

1、掌握数字系统的设计方法和测试方法。

二、课程设计题目(问题)描述和要求

设计一个四模式三路彩灯(红、绿、黄三种颜色)显示系统。该系统的显示模式由外部输入Z、Y控制,要求开机自动置入初态后便按规定模式循环运行。设各路彩灯均为8个(红灯序号为r1-r8,绿灯序号为g1-g8,黄灯序号为y1-y8),各模式规定如下: XY=00时,系统的显示模式在以下六个节拍间循环:

第一节拍,依次点亮奇号红灯(r1亮→r1、r3亮→r1、r3、r5亮→r1、r3、r5、r7亮),其余灯均灭。

第二节拍,依次点亮偶号红灯,其余灯均灭。第三节拍,依次点亮奇号绿灯,其余灯均灭。第四节拍,依次点亮偶号绿灯,其余灯均灭。第五节拍,依次点亮奇号黄灯,其余灯均灭。第六节拍,依次点亮偶号黄灯,其余灯均灭。XY=01时,系统的显示在第一、二节拍间循环。XY=10时,系统的显示在第三、四节拍间循环。XY=11时,系统的显示在第五、六节拍间循环。

三、系统分析与设计

根据课程设计题目问题描述和要求,完成:

主要器件:

绘制电路原理图:确定选用的元件及其封装形式,完善电路。

原理图设计过程:进行电子电路设计时,首先要有一个设计方案,而将电路设计方案表达出来的最好方法就是画出清晰、正确的电路原理图。根据设计需要选择出元器件,并把所选用的元器件和相互之间的连接关系明确地列出,直观地表达出设计概念。

电路原理图的基本组成是电子元器件符号和连接导线,电子元器件符号包含了该元器件的功能,连接导线则包含了元器件的电气连接信息,所以电路原理图设计的质量好坏直接影响到PCB印制电路板的设计质量。

绘制原理图的两大原则:首先应该保证整个电路原理图的连线正确,信号流向清晰,便于阅读分析和修改;其次应该做到元器件的整体布局合理、美观、实用。

在Protel中绘制电路原理图的步骤: 启动原理图编辑器,新建电路原理图文件。

设置原理图的相关参数,如图纸的大小、版面及环境参数等。加载元件库,在图纸上放置需要的各种元器件。编辑元器件的属性,并对元器件进行合理的布局调整。使用导线或网络标签对所有的元器件进行电气意义上的连接。对电路原理图进行整体的编辑、调整。保存文档,打印输出。

绘制元件库:为绘制原理图做补充。有些元件在系统库文件里可能找不到,我们可以自己动手绘制一个能表示实际元件的图形,并将其添加到原理图中。建议大家从一开始就建立一个属于自己的元件库,以后每设计一次电路,当遇到没有的原件时,就往库里添加一个元件,日积月累,自己的元件库就会充实起来,以后绘制原理图时就会非常方便。

绘制PCB封装:也是为设计原理图做补充。原理图上的元件仅仅是一个元件代号,我们可以随意改变其模样,但是PCB封装绝对不能随意改动。所谓封装,就是元件在PCB上的实际焊接点,如果焊接点与元件对应不上,那么这块板子就没用了。

对原理图进行编译:执行【项目管理】→【Compile Document ADAC.SCHDOC】,编译原理图文件。根据Massage面板中的错误和警告提示,修改原理图,直至编译通过,生成网络表。

在PCB编辑器中,执行【设计】→【层堆栈管理器】命令,选择PCB板层结构;执行【设计】→【PCB板形状】→【重定义PCB板形状】定义PCB的外观尺寸,设置PCB文件的编辑环境。

设置PCB的电气边界:在PCB编辑器中,单击【Keep-Out Layer】标签,执行【放置】→【禁止布线区】→【导线】设置PCB的电气边界。

更新PCB文件:在原理图编辑器内,执行【设计】→【Update PCB Document ADAC.PCBDOC】命令,生成【工程变化订单(ECO)】,在对话框内单击“使变化生效”按钮,再单击“执行变化”按钮,将网络表和元件封装载入到PCB文件中。

设置布线规则:在PCB编辑器中,选择【设计】→【规则】命令,在弹出的【PCB规则和约束编辑器】对话框中,重点进行元件间距、导线间距、导线宽度、焊盘大小、孔径大小等规则设置。

原件布局:自动布局(执行【工具】→【放置元件】→【自动布局】命令)和手工布局相结合,摆放元件到适当位置。

布线:计算机自动布线(执行【自动布线】→【全部对象】命令,并选择布线策略)或手工布线。

DRC(Design Rule Check设计规则检查)校验和违规项修改:执行【工具】→【设计规则检查】命令,在弹出的【设计规则检查器】对话框中,分别设置【Report Options】和【Rules To Check】文件夹下的相关选项,然后单击“运行设计规则检查”按钮,运行批处理DRC。

敷铜:执行【放置】→【覆铜】命令,在弹出的对话框中设置覆铜属性,包括填充模式、导线宽度、网格尺寸、连接网络及删除死铜等。

文件保存,输出打印:保存、打印各种报表文件及PCB制作文件。

2、将打印好的电路图纸通过高温印刷到已给的覆铜板上,再将电路板通过腐蚀制作成线路板,将线路板打孔。1)把图纸印刷到覆铜板上

四.系统调试过程中出现的主要问题

现有的元件库中没有设计所需的芯片元件库。为了解决这个问题,我上网寻找解决方案,并向老师请教,发现可以自己创建一个集成元件库。首先启动 protel dxp,在菜单中点击file—new—library--schematic library。新建一个原理图库文件。点击菜单file—save,为原理图库文件取个名字,然后自己选要用的图形和引脚,画至成功之后放置到sheet1.SchDoc文件中。

五.系统运行报告与结论 Pcb图如图所示

腐蚀好的电路板如图所示

六.总结

1、打开PCB编辑软件Proteus 7.4 的ARES。

在Proteus ISIS 编辑环境下,选择“Tools”--“ Netlist to ARES ” 或是单击工具栏中的图标按钮,即可进入PCB设计软件ARES界面。当然也可直接运行Proteus 7.4 ARES 软件进入其编辑界面。

放置焊盘

在编辑界面中应根据元件的引脚间距放置焊盘及元件所占空间的大小画元件的边框。

在ARES

侧工具栏中的或图标用于放置焊盘,这时在对象选择器中列出了所有焊盘的外径和内径的尺寸,我们选择S/C-70-30(其中S表示正方形焊盘,C表示圆形焊盘,70为焊盘的外径尺寸,30为内径的尺寸即钻孔直径)如下图:

如果列表中没有该尺寸的焊盘,可单击列表上的图标新建焊盘,在弹出的对话框中输入焊盘的名称及选择焊盘的形状后点击确定,如下图:

在接着弹出的对话框中设置好焊盘参数后单击确定即可完成焊盘的新建,如下图:

现在我们开始放置焊盘,将第一个焊盘放在原点处(即X=0;Y=0),如下图:

2、分配引脚编号

右键单击某一个焊盘,在弹出的下拉列表中选择“Edit Properties / 编辑属性”项,在弹出的“Edit Single Pin/编辑引脚”对话框中按下图进行设置。按照同样的方法可完成其它焊盘的设置。

3、添加元件边框

完成了焊盘放置,接着需要根据元件的实际大小添加边框。单击左侧工具栏中的并将左下

图标,层,在编辑区内按照实际尺寸画一个元件边框,如下图

4、放置封装原点

点击左侧工具栏中的图标,在左侧列表框中选择“ORIGIN”,单击第一个焊盘,确定为封装的原点。如下图:

5、放置元件“REF”

在左侧列表框中选择“REFERENCE”,在元件边框中单击添加“REF”。如下图:

6、保存元件封装

单击右键并拖动鼠标指针,将整个设计完成的封装选中,然后选择“Library / 库” “Makepackage / 创建封装”菜单项,弹出创建封装对话框,按下图进行设置即可。

对电子工艺的理论有了初步的系统了解。我们了解到了测试普通元件与电路元件的技巧、印制电路板图的设计制作与工艺流程作用等。这些知识不仅在课堂上有效,对以后的电子工艺课的学习有很大的指导意义,在日常生活中更是有着现实意义。二.对自己的动手能力是个很大的锻炼。实践出真知,纵观古今,所有发明创造无一不是在实践中得到检验的。没有足够的动手能力,就奢谈在未来的科研尤其是实验研究中有所成就。在实习中,我锻炼了自己动手技巧,提高了自己解决问题的能力。

七.参考书目

1、Protel 2004电路设计入门与应用

2、Protel dxp

fpga流水灯实验报告 第3篇

关键词:LDPC,译码器,流水线,FPGA

0 引言

LDPC码已被广泛应用于深空通信、光纤通信、卫星数字视频和音频广播等领域[1]。在加性高斯白噪声信道环境下, BPSK调制时, 归一化最小和译码算法能很好地平衡译码性能和算法复杂度, 易于硬件实现[2], 且常以流水线的形式出现在译码器的设计中。本文针对LDPC译码器提出一种新的设计思路, 将流水线思想应用到译码器的整体设计中, 设计出可以多帧并行且结构简单的译码器, 最后通过仿真对其性能进行验证。

1 归一化最小和译码算法的流水线化

归一化最小和译码算法分为两步迭代, 即变量节点运算 (VNP) 与校验节点运算 (CNP) 。

VNP:

CNP:

式中:M (n) 表示H矩阵中第n列中1的所有位置;N (m) 表示H矩阵中第m行中1的所有位置;M (n) m表示从M (n) 中去掉第m行那个1之后的子集;N (m) n表示从N (m) 中去掉第n列那个1之后的子集;Pn表示第n列对应的接收到的初始电平值;qnm表示本次迭代中第n列第m行那个1对应的变量节点运算结果;rmn表示本次迭代中第m列第n行那个1对应的校验节点运算结果;α为归一化因子。初始化时先进行VNP运算, 此时的rmn均为0。每次进行VNP运算时可同时计算本次迭代的判决结果:

如果Qn≥0, 则令第n列判决码字xn=0, 否则xn=1。若x=[x1, x2, …, xn]满足HxT=0, 则停止迭代, 将x作为译码输出, 否则继续迭代, 直到满足HxT=0或达到最大迭代次数为止。

图1是对三输入VNP进行流水线化的一个实例, 其中“扩位补零”是为了防止加法结果溢出, 通过补零的方式增加输入数据的整数位;“截位”将绝对值超出原有位数范围的数据转化为原有位数下的极值;“添位”将判决码字xn附加在数据的末尾, 便于在CNP运算时计算HxT对应各行的结果。

图2是对四输入CNP进行流水线化的一个实例, 其中“相乘比较”结果的符号位为2个输入数据符号位的异或值, 数据位为2个输入数据数据位中的较小者。为了便于硬件实现将α定[3]为0.75, 即0.5+0.25, 因此“乘以α”可以用移位相加来实现。同时CNP还应将四个输入的末位取出并进行异或运算, 得出HxT对应本行的结果。

2 基于FPGA的流水线式译码器的结构设计

VNP与CNP的运算结果同时也是彼此的输入数据, 将二者首尾相连就构成了一个流水线环路, 如图3所示。如果以图1和图2的方法为例, VNP是6级流水线, 那么在VNP中可容纳6帧数据, 在CNP中可容纳3帧数据, 两个RAM各1帧, 那么在环路中总共可以实现11帧数据的循环并行处理。

图4是根据一个简单的LDPC码的校验矩阵画出的结构图, 其中寄存器组“M”的位置与H矩阵中1的位置对应, “M”阵列将多个流水线环路交织在一起就构成了整个译码器。“M”由两个容量为2的RAM组成, 容量为2是为了避免读写地址冲突, 读写方式如图5中左图所示。

不过这种全并行结构却不适用于较长的LDPC码, 如果给一个1 008×504的H矩阵中的每行与每列都配备一个CNP或VNP, 硬件资源的消耗量是很大的[4]。QC-LDPC码可以解决这个问题。

图6所示是一个24×12的校验基矩阵, 其中每个数字代表一个42×42的子矩阵, 这些子矩阵都是由单位阵循环右移得到的, 数字的大小表示单位阵循环右移的位数。此时译码器的结构就要与基矩阵相对应, 即部分并行结构, 译码器的并行处理能力将体现在单帧内部, VNP或CNP可以同时对多列或多行进行循环处理。但VNP与CNP不能同时对同一帧数据进行处理, 因为那样会带来诸多问题[5], 解决的方法是让译码器对两帧数据并行译码, VNP对第一帧处理的同时CNP对第二帧进行处理, 然后依次交替。每两帧为一轮, 当两帧都译码成功或达到最大迭代次数时, 才进行下一轮译码。

寄存器组“M”的位置与基矩阵中的数字对应, “M”由两个容量为42的RAM构成, 读写方式如图5中右图所示, 图中实线与虚线交替存在, 在每轮译码中每个RAM始终与同一帧数据对应。以基矩阵中数字“17”对应的“M”为例, 该列的VNP与该行的CNP对此“M”的读地址时序如图7所示。若VNP为6级流水线, 那么VNP对“M”的写地址永远比读地址滞后6, CNP亦如此。

在译码器启动时各模块的读写地址的相对关系就已确定并被永久保持, 使得各条流水线环路按着正确的规则不停地运转下去。为实现“乒乓操作”, 本文将Pn寄存器的容量扩大一倍, 在译码器工作的同时把下一轮的初始值写入Pn寄存器的闲置区间。当本轮译码结束并且下一轮的初始值已被写入闲置区间时, 只需控制模块发出区间切换信号, 指示VNP将此刻Pn寄存器的读地址加或减84, 译码器就很自然地进入到下一轮的译码工作中, 而且这种切换可以随时进行, 不必顾及当时各模块读写地址的位置。控制模块在发出区间切换信号后立即将内部的周期性计数器归零并开始重新计数, 根据计数值在相应的时段上连续收集各个VNP与CNP得出的xn与HxT信息, 当所有的HxT信息均为0或达到最大迭代次数时将xn输出, 否则进入下一个计数周期。流水线式译码器的核心思想就是将整个译码过程流水线化, 并尽量避免对流水线的干预, 这样不仅可以实现多帧并行, 还省去了每轮译码之间的准备时间, 同时也让辅助模块的功能得到简化。

3 基于QuartusⅡ的仿真分析

本文采用CycloneⅢ系列EP3C120F780I7型号的FPGA芯片作为仿真平台, 使用QuartusⅡ9.0作为开发工具, 根据LDPC码长度的不同设计了两款译码器:码长为20 b的8帧并行短码译码器和码长为1 008 b的2帧并行长码译码器, 二者码率均为1 /2。译码器最高工作频率为117.65 MHz, 稳定工作频率取110 MHz。

利用Matlab将编码后的码字进行BPSK调制, 再通过AWGN信道, 接收端信噪比为4 d B, 最后进行取样量化得到初始值。初始值的量化位数[6]为8 b, 包括1 b符号位, 3 b整数位和4 b小数位。仿真前将初始值预先存入ROM中, 并在仿真开始时向INPUT_FIFO中顺序写入。

图8为短码译码器的仿真时序图, 图中judge1~judge10为10个CNP得出的HxT对应各行的结果, 在每个times区间里顺序输出本次迭代中各帧的HxT信息;times为迭代次数;signal为区间切换信号;checkout为译码完成信号, 由于在第6次迭代时8帧数据对应的各行judge均为零, 故checkout发出了一个高脉冲;answer为OUT_FIFO的输出, 即译码码字, 一轮译码后译码器串行输出8个20位数据。每次迭代需11个时钟周期, 假设每轮需20次迭代[7], 那么短码译码器的吞吐量为20×8×110 MHz/ (11×20) =80 Mb/s。

图9为长码译码器的仿真时序图, 一轮译码后译码器串行输出24个42 b数据, 即2帧码字的信息位。每次迭代需84个时钟周期, 假设每轮需20次迭代, 那么长码译码器吞吐量为1 008×110 MHz/ (84×20) =132 Mb/s。

表1为全编译后QuartusⅡ给出的硬件资源消耗情况。

综上可见, 与其他LDPC译码器相比[8,9,10], 在硬件资源消耗量大致相当的情况下, 流水线式译码器具有较为突出的吞吐量。当然, 本文设计的译码器仍有很大的优化空间, 比如可以将8帧数据分成两组分别进行判决和输出, 并在输出端对各组进行排序, 这样就能降低平均迭代次数, 进一步提高吞吐量。

4 结语

本文针对LDPC译码器提出一种新的设计思路, 将流水线思想应用到译码器的整体设计中, 并利用Verilog语言设计出可以多帧并行且结构简单的译码器, 其综合性能突出, 且具有很大的优化空间, 因此流水线式LDPC译码器具有很好的开发前景。

参考文献

[1]杨雪飞, 高俊.LDPC码在深空通信中的应用技术研究[J].现代电子技术, 2009, 32 (23) :33-34.

[2]孙汝杰.LDPC译码方法研究及应用[D].南京:南京理工大学, 2012.

[3]窦戈.基于CMMB标准的LDPC码译码研究与实现[D].南京:南京航空航天大学, 2011.

[4]江涛.QC-LDPC码设计和分层译码器的FPGA实现[D].南京:南京航空航天大学, 2011.

[5]袁瑞佳.LDPC码的高效编译码实现技术研究[D].西安:西安电子科技大学, 2012.

[6]吴斌, 杨波, 叶明.LDPC硬件实现中的数据量化位数选择及其性能仿真[J].信息通信, 2012 (2) :26-28.

[7]吉晋龙.LDPC码的高速编译码器设计及FPGA实现[D].西安:西安电子科技大学, 2013.

[8]杨建平, 陈庆春.IEEE802.16标准LDPC译码器设计和实现[J].通信技术, 2010, 43 (5) :18-19.

[9]王鹏, 陈咏恩.高速LDPC码分层译码器设计[J].小型微型计算机系统, 2009, 30 (11) :2294-2297.

fpga流水灯实验报告 第4篇

实验报告

名: 学

号: 学

院: 专

业: 班

级: 指导教师:

实验

1、流水灯实验

1.1实验要求

编程控制实验板上LED灯轮流点亮、熄灭,中间间隔一定时间。

1.2原理分析

实验主要考察对STM32F10X系列单片机GPIO的输出操作。

参阅数据手册可知,通过软件编程,GPIO可以配置成以下几种模式: ◇输入浮空 ◇输入上拉 ◇输入下拉 ◇模拟输入 ◇开漏输出 ◇推挽式输出

◇推挽式复用功能 ◇开漏式复用功能

根据实验要求,应该首先将GPIO配置为推挽输出模式。

由原理图可知,单片机GPIO输出信号经过74HC244缓冲器,连接LED灯。由于74HC244的OE1和OE2都接地,为相同电平,故A端电平与Y端电平相同且LED灯共阳,所以,如果要点亮LED,GPIO应输出低电平。反之,LED灯熄灭。

1.3程序分析

软件方面,在程序启动时,调用SystemInit()函数(见附录1),对系统时钟等关键部分进行初始化,然后再对GPIO进行配置。

GPIO配置函数为SZ_STM32_LEDInit()(见附录2),函数中首先使能GPIO时钟:

RCC_APB2PeriphClockCmd(GPIO_CLK[Led], ENABLE);然后配置GPIO输入输出模式:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 再配置GPIO端口翻转速度: GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 最后将配置好的参数写入寄存器,初始化完成: GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure)。

初始化完成后,程序循环点亮一个LED并熄灭其他LED,中间通过Delay()函数进行延时,达到流水灯的效果(程序完整代码见附录3)。

实验程序流程图如下:

硬件方面,根据实验指南,将实验板做如下连接:

1.3实验结果

实验

二、按键实验

2.1实验要求

利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯亮起。

2.2原理分析

实验主要考察对STM32F10X系列单片机GPIO外部中断功能的使用。

STM32F107VCT一共有5组GPIO,分别是PA[15:0]、PB[15:0]、PC[15:0]、PD[15:0]、PE[15:0]。STM32的所有GPIO都可以作为中断输入源,单片机通过复用的方式使其对处理器来说来自 GPIO 的一共有 16 个中断Px[15:0]。具体实现是PA[0]、PB[0]、PC[0]、PD[0]和PE[0]共享一个GPIO中断;PA[1]、PB[1]、PC[1]、PD[1]和PE[1]共享一个GPIO中断;……PA[15]、PB[15]、PC[15]、PD[15]和PE[15]共享一个GPIO中断。以下图片为以EXTI0为例的外部中断/事件线路映像:

要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在中断屏蔽寄存器的相应位写‘1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置‘1’。在挂起寄存器的对应位写’1’,将清除该中断请求。

要把IO口作为外部中断输入,有以下几个步骤:

(1)初始化 IO 口为输入。这一步设置要作为外部中断输入的IO口的状态,可以设置为上拉/下拉输入,也可以设置为浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。

(2)开启IO口复用时钟,设置IO口与中断线的映射关系。STM32的IO口与中断线的对应关系需要配置外部中断配置寄存器EXTICR,这样我们要先开启复用时钟,然后配置IO口与中断线的对应关系。才能把外部中断与中断线连接起来。

(3)开启与该IO口相对的线上中断/事件,设置触发条件。这一步,我们要配置中断产生的条件,STM32可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。这里根据自己的实际情况来配置。同时要开启中断线上的中断,这里需要注意的是:如果使用外部中断,并设置该中断的EMR位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置EMR位。

(4)配置中断分组(NVIC),并使能中断。这一步,我们就是配置中断的分组以及使能,对STM32的中断来说,只有配置了 NVIC 的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。

(5)编写中断服务函数。这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃。所以在开启了某个中断后,应为该中断编写服务函数。在中断服务函数里面编写要执行的中断后的操作,并很据情况判断是否要对中断产生的标志位进行清零。

由原理图可知,按键未按下时,GPIO读到的为高电平,按键按下后,IO口接地,产生一个电平跳变,所以外部中断触发方式应该设置为下降沿触发。

2.3程序分析

LED灯的点亮与实验一中相同,不过多赘述。程序首先对按键进行初始化,初始化函数为GPIO_KEY_Config()(见附录4),配置过程与实验一中GPIO配置基本一致。由于此处GPIO需要采集外界按键信号,故GPIO模式应该为调整为内部上拉电阻输入

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU。

然后执行GPIO中断初始化函数KEY_EXIT_Init()(见附录5),首先将连接按键的IO口与EXTI线链接到一起:

GPIO_EXTILineConfig(GPIO_KEY1_EXTI_PORT_SOURCE,GPIO_KEY1_EXTI_PIN_SOURCE);

然后将触发方式设置为下降沿触发并写入中断配置寄存器,并使能中断: EXTI_InitStructure.EXTI_Line = GPIO_KEY1_EXTI_LINE;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure)。

之后进行中断分组配置及中断优先级配置,函数为InterruptConfig()(见附录6)。配置过程较为复杂,涉及到抢占优先级和响应优先级的概念。程序首先将所有外部中断归为NVIC_PriorityGroup_2,即2位抢占优先级和2位响应优先级:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

然后将所有外部中断信号的抢占优先级规定为0、1、2,使其可以相互区别,并将配置好的参数写入对应寄存器中,完成配置:

NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY1_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY2_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = GPIO_KEY3_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_Init(&NVIC_InitStructure)。

初始化完成后,程序进入等待按键中断触发状态,一旦按键按下,则进入中断服务函数EXTI9_5_IRQHandler()(见附录7)中。在函数中对LED灯进行点亮、熄灭操作,并重置中断产生标志位。

实验流程图如下(主函数代码见附录8):

硬件连接方式如下图所示:

2.3实验结果

实验

三、定时器实验

3.1实验要求

利用STM32的通用定时器 TIM5 产生一个1S的中断,在中断函数中实现 LED1、LED2、LED3、LED4同时翻转的效果。

3.2原理分析

实验主要考察对STM32F10X系列单片机定时器的使用。

实验中使用的STM32F107单片机有多达10个定时器,包括:

◇多达4个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM 或脉冲计数的通道和增量编码器输入

◇1个16位带死区控制和紧急刹车,用于电机控制的 PWM 高级控制定时器

◇2个独立的看门狗定时器(独立的和窗口型的)

◇系统时间定时器:24 位自减型计数器

◇2个 16 位基本定时器用于驱动DAC

根据时钟树可知,系统时钟经过分频之后,进入TIM5的时钟模块入口,在经过预分频处理,才供给TIM5作时钟使用。预分频器的系数为:TIMx_PSC,当TIMx_PSC = 0时表示不分频,则TIM5定时器的时钟

用CK_CNT =模块入口时钟72MHz;当TIMx_PSC = 1时表示不分频,则TIM5定时器的时钟用CK_CNT=模块入口时钟36MHz;以此类推。公式为:CK_CNT =fCK_PSC/(PSC[15:0]+1),其中PSC最大为65535。

其次是TIM5计数器计数值的设置,TIM5计数器以CK_CNT为时钟计数,向下计数到0或向上计数到设定值(TIMx_ARR)则产生中断。以向上计数为例,从 0 开始计数到设定值TIMx_ARR 时产生中断。要产生一秒一次中断则要使计数器的值乘以预分频的值=系统时钟72MHz,其中计数器的值和预分频值都必须小于65535。我们使预分频值为7200,计数器值为10000,则7200 * 10000 = 72,000,000即72M。其中拆分方法很多35000*2000 = 72,000,000,只要注意计数器的值和预分频值都必须小于65535即可。当计数值溢出后,会改变计数溢出标志位,并产生定时器中断,实验中使用其产生中断来进行LED灯翻转。

3.3程序分析

LED初始化部分与实验一相同,完成初始化后,点亮所有LED灯。定时器配置函数为TIM5_Init()(见附录6)。配置函数首先使能计数器时钟:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); 然后自动装载计数值,计数从0开始:

TIM_TimeBaseStructure.TIM_Period =(1001); 并将计数器设置为向上计数:

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 最后写入计时器配置寄存器,完成配置:

TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure)。

配置完成后,还要对计数器溢出标志位进行清零,并打开溢出中断,使能计数器以开始计数。

TIM_ClearITPendingBit(TIM5, TIM_IT_Update);TIM_ITConfig(TIM5, TIM_IT_Update, ENABLE);TIM_Cmd(TIM5, ENABLE)。

定时器配置完成并使能后,计数器开始工作,当到达预设的计数值之后,产生中断信号。系统在进行相关配置后可以响应定时器产生的中断,中断配置函数为NVIC_Configuration()(见附录7)。函数首先将中断向量表首地址置于0x08000000:

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); 然后使能TIM5中断:

NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;最后将配置参数写入中断控制寄存器,完成配置: NVIC_Init(&NVIC_InitStructure)。

一旦中断产生,系统会对中断产生响应,暂停所有正在执行的低优先级任务且将任务信息和数据压入对应对战区,并进入中断服务函数TIM5_IRQHandler()(见附录8)中进行处理。

在中断服务函数中判断并清除了中断标志位,以便定时器下一次计数中断产生。函数中调用了LED_Spark()函数(见附录9),实现了LED的闪烁。

程序流程图如下:

硬件连接方式如下图所示:

实验

四、按键中断控制LED灯定时闪烁

4.1实验要求

综合实验一、二、三,利用STM32读取外部按键状态,按键按下一次产生一次外部中断在中断处理函数中使按键所对应的灯闪烁,闪烁间隔通过定时器定时控制。其中,SKEY1控制LED1以1S为间隔,闪烁3次,SKEY2控制LED2以2S为间隔闪烁3次,SKEY3控制LED3以3S为间隔,闪烁3次。

4.2原理分析

实验需要用到STM32的GPIO输入输出操作,GPIO外部中断和内部定时器中断。在以上三个实验中,对各个部分都已经进行过详尽的解释,这里不再赘述。此实验需要将以上实验做综合,并对时序进行调整。难点为,对GPIO外部中断和定时器内部中断的处理,即如何确定两种不同中断的优先级。

这里的使用的方法是,将所有按键外部中断置于中断分组2,即NVIC_PriorityGroup_2中。将所有按键中断抢占优先级置为0,即最高级别中断,响应优先级置分别置为1、2、3,相互区别。将定时器中断抢占优先级置为1,相应优先级社会中低于按键中断,使其可以被按键信号中断计时,并刷新LED闪烁状态。

4.3程序分析

这在程序初始化阶段,分别对LED、按键外部中断和定时器中断进行初始化。主函数如下:

单一对象流水线实验心得 第5篇

10物流 1013121054 陈黎红

本次电话机的流水线生产实验,也是我第一次见识到流水线这一生产方式,平时也只是听到过。流水线生产,即劳动对象按一定的工艺路线和统一的生产速度,连续不断地通过各个工作地,按顺序地进行加工并生产出产品的一种生产组织形式。

我们这次实验因为都是新手上路,虽然事先有熟悉过电话机的内部结构,但仍然搞得有些手忙脚乱。后边工序的人跑前边来帮忙,其他不参与的小组成员也来插一脚,现实的流水线生产肯定不会是这样子。但仍对流水线有了些基础的认识。

fpga流水灯实验报告

fpga流水灯实验报告(精选5篇)fpga流水灯实验报告 第1篇单片机流水灯实验一、任务让8个LED灯轮流亮起来,实现流水灯的功能。二、思路让接...
点击下载文档文档内容为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部