用FPGA设计MP3个人数字播放机

时间:2019-05-13 14:12:04下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《用FPGA设计MP3个人数字播放机》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《用FPGA设计MP3个人数字播放机》。

第一篇:用FPGA设计MP3个人数字播放机

引 言

MPEG(活动影像专业人员组织)是为数字音频确定单一编码和解码(压缩/解压缩)方法于1988年建立的。1992年,国际标准组织(ISO)和国际电工委员会(IEC)为音频和视频编码建立了MPEG1(ISO/IEC11172)标准。这使得业内在处理新数字世纪出现的各种类型音频/视频媒体

时统一在单一格式上。

随着以数字形式存储和播放音乐的MPEG Audio Layer3(MP3)格式的发展,个人数字播放机市场开始出现巨大的发展机会。非压缩的音频磁轨的MP3数字文件只有原来磁轨大小的1/10。能保持74分钟数字音频录音时间的650Mbytes读写CD可以保持740分钟MP3压缩音频数据。数字播放机的一般解决方案是采用软件形式(如基于Windows或其他OS基础上的“Internet Audio Player”)或硬件形式(如“Portable MP3 Player”)。如Diamond Multimedia公司的Rio PMP300和Rio PMP500 MP3数字播放机分别采用Actel公司的A40MX04和A40MX09 FPGA实现其特殊应用功能。FPGA能满足整个系统的价格、功耗和性能要求。A40MX04提供547个逻辑模块,它们可配置做为组合逻辑或273个触发器和实现接口逻辑的69个I/O。A40MX04和A40MX09很容易满足48MHz速度要求。它们灵活的结构使系统设计人员能在每种MP3播放机

中最佳地实现各种功能。

MP3数字播放机系统要求

MP3播放机有两个基本工作模式:下载模式和播放模式。在下载模式中,在PC上运行的软件允许用户下载MP3文件到播入机中的闪存卡。一旦把所有文件下载完,播放机与PC断开,并通过耳机收听下载的音乐。MP3播放机有不同的播放选择控制,如播放、快进、快倒、停止/暂停、音量控制、随机播放和重复播放功能。

MP3播放机包含可输入到PC的软件。软件提供用户接口以便通过PC并行端口选择、定序和下载不同音乐的MP3文件到播放机。图1示出系统级框图。

通过并行端口下载音乐到播放机,其速率大约为每1MB编码音乐10秒。MP3播放机的小尺寸对所有元件的物理尺寸有严格限制。另外,MP3播放机是便携、电池供电装置,需要工作在大约180mW低功率下。这两个因素对功能设计的元件选择有很大的影响。

用FPGA实现MP3系统

图2示出Rio PMP500系统框图,其中A42MX09 FPGA做为接口FPGA,它包含CPU接口、带ECC(Error Correcting Code)支持的闪存和灵巧存储器接口、时钟产生逻辑、功能控制逻辑和

键功能检测逻辑单元。

A42MX09中的CPU I/F单元提供与系统CPU(NECD78P064GC微控制器,带集成LCD控制器)的通信通路。CPU运行在2.5MHz,控制整个系统的工作。对于任何所需要的操作,CPU唤醒系统并设置整个系统。CPU存取系统存储器和管理整个闪存的配置、编程和存取。CPU有一个到MP3处理器的接口。MP3从闪存读的数据由CPU写到MP3处理器。MP3处理器译码MP3数据并把数据送到DAC,以便模拟输出到耳机。

A42MX09中的灵巧存储器接口单元是连接灵巧存储器卡的接口。灵巧存储器卡是一个外部闪存,用来增加整个系统存储器以便在播放机中存储更多的歌曲。到灵巧存储器卡的信号接口非

常类似于闪存接口。

闪存接口单元用于控制闪存,闪存保存通过并行端口下载的MP3文件。另外,ECC用Hamming码函数实现。Hamming码是一种FEC(Forward Error Correction)工具,当所用数据通过噪声媒体时FEC能校正错误。原始数据具有额外的校验位附加在每个字组以生成一个码字。这些额外位用“Block Parity”机理计算。采用模2运算用数据位来生成矩阵G得到Hamming码字。这需要乘法功能,而用A42MX09中的逻辑模块的组合功能很容易实现乘法功能。

A42MX09中的时钟产生器从48MHz输入时钟产生驱动器件内部不同逻辑单元所需的不同时钟。时钟产生逻辑单元由触发器和组合逻辑构成分频器。A42MX09中的键盘检测单元用于改变播放机的设置。键盘接口单元一般由检测键盘阵列中连接点(根据按键)的逻辑单元构成并把按键转变为与该键相关的功能。根据按键检测执行适当的功能。阵列由寄存器、锁存器和组合逻辑

实现。

Rio MP3播放机的功率由MAX1M1705器件控制,而1705由FPGA功耗控制单元控制。MP3播放机一般由单节1.5V电池供电。电池最少应能维持12小时听所有下载的音乐。功率控制是Rio MP3播放机的一个显著的特点。功率控制器件有两种功率工作模式:PFM(脉冲频率调制)和

PWM(脉宽调制)模式。

PFM模式是低静态电流待机模式,此模式提供120mA总输出电流并降低静态功耗到500uW。PWM模式是高功耗模式,能提供高达450mA输出电流。当MP3播放机处于停机状态时,CPU编程写FPGA的一个寄存器,从而产生MODE信号置MAX1M器件进入PFM低功率模式。在PFM模式Rio MP3播放机功耗只有2mW~3mW。当MP3播放机工作时,MODE信号改变MAX1M器件到PWM模式。Rio MP3播放机工作状态时的总功率大约在180mW左右。

下一代MP3系统 下一代MP3系统将改变现在的系统,能提供更快的下载、更多的用于播放的音乐文件和更多的用户从接口/键面板选择。更快的下载可通过采用高速并行端口模式(见IEEE1284)或USB端口实现。采用高密度闪存连同本地SDRAM基歌曲高速缓冲存储器可提供更多音乐文件播放并可提供另外的选择,如快速播放、快进、慢播放、编程播放等。其他选择可包括红外收发器,可使用户从播放机到播放机来回发射数据或执行某些远程控制操作。整个系统可用一个FPGA实现,不需要CPU。在FPGA中的音频DAC控制器逻辑单元可提供I2C接口来控制音频DAC,音频DAC通过I2C接口取串行音频数据并变换为模拟音频提供给耳机。

其他新的压缩方法正在涌现,其中ATRAC3(Adaptive Transform Acoustic Coding—自适应变换声频编码)标准可压缩CD音乐数据10:1而又能保持CD音质。ATRAC3特点是:

1、通过频带分裂滤波器和MDCT(Modified Discrete Cosine Transforms—改进式离散余弦变换)

对信号分析获得的。

2、位率压缩。利用ATRAC3技术,能实现音乐信号的高效率压缩。

结语

利用FPGA实现MP3数字播放机的主要接口FPGA功能,可有效地满足系统的性能、功率、价

格和尺寸要求。

第二篇:基于FPGA的CDMA数字基带系统设计

摘 要

随着现代通信技术的发展,特别是移动通信技术的高速发展,CDMA技术越来越被人们所关注。而基于FPGA的CDMA数字基带系统正是一种新兴的具有很大可行性的技术。本文给出了CDMA数字基带收发系统的设计方案,并以Xilinx ISE 8.1为硬件开发平台,利用FPGA实现了4路信息信号的扩频、编码调制和解扩、解调、验证了初始方案的可行性。运用VHDL语言,实现对CDMA通讯系统的上行链路数字部分进行设计,对有关模块的编译,编译通过后的结果,以及使用Xilinx系列芯片通过仿真得到波形,证明了整个系统原理和设计提出的正确性。关键词:CDMA;数字基带;FPGA;Xilinx

目录

1.课程设计目的...............................................................................................................1 2.软、硬件环境介绍.....................................................................................................1 4.CDMA基带传输系统简介..........................................................................................2 5.CDMA基带系统设计....................................................................................................2

5.1 系统设计平台...............................................................................................................2 5.2 CDMA系统设计原理......................................................................................................2

6.系统总体设计...........................................3

6.1 CDMA的整体设计框图..................................................................................................3 6.2 利用VHDL语言编程实现的分频电路模块.................................................................4

7.本系统完成的功能.......................................4

7.1 Walsh码发生器............................................................................................................4 7.1.1 生成Walsh码调制(地址编码)的模块图...........................................................5 7.2 PN码、信息码发生器..................................................................................................5 7.2.1 生成PN扩频的模块图.............................................................................................5 7.3 调制与解调...................................................................................................................6

8.程序代码..............................................7

8.1 分频器模块...................................................................................................................7 8.2 PSK模块........................................................................................................................7 8.3串并转换模块................................................................................................................8

9.仿真调试与结果.........................................9 10.设计心得体会.........................................11 11.参考文献.............................................12

1.课程设计目的

《应用电子技术综合实训》是电子信息工程专业技术教育的重要实践教学环 节,对学生掌握基本理论、运用基本知识、训练基本技能和达到技术教育培养目标的要求有着十分重要的意义和作用。通过对具体应用电子电路的设计和开发过程的练习,加深学生对基础理论的理解,掌握设计电路、开发电路和实现电路的能力,能熟练应用开发软件。培养学生独立思考、解决实际工程问题的能力,为专业理论知识的学习和专业技能训练打好坚实的基础。

2.软、硬件环境介绍

1.软件环境:Windows XP操作系统、Xilinx ISE8.1 EDA集成开发环境; 2.硬件环境:个人计算机一台

3.Xilinx ISE8.1 EDA集成开发环境介绍:

ISE的全称为Integrated Software Environment,即“集成软件环境”,是Xilinx公司的硬件设计工具。相对容易使用的、首屈一指的PLD设计环境。ISE将先进的技术与灵活性、易使用性的图形界面结合在一起,能在最短的时间,以最少的努力,达到最佳的硬件设计。

Xilinx公司的ISE开发设计软件的工程设计流程,具体分为五个步骤:即输入(Design Entry)、综合(Synthesis)、实现(Implementation)、验证(Verification)、下载(Download)。4.Xilinx公司介绍:

Xilinx(赛灵思)是全球领先的可编程逻辑完整解决方案的供应商。Xilinx研发、制造并销售范围广泛的高级集成电路、软件设计工具以及作为预定义系统级功能的IP(Intellectual Property)核。客户使用Xilinx及其合作伙伴的自动化软件工具和IP核对器件进行编程,从而完成特定的逻辑操作。Xilinx公司成立于 1984年,Xilinx首创了现场可编程逻辑阵列(FPGA)这一创新性的技术,并于1985年首次推出商业化产品。眼下Xilinx满足了全世界对 FPGA产品一半以上的需求。Xilinx产品线还包括复杂可编程逻辑器件(CPLD)。在某些控制应用方面CPLD通常比FPGA速度快,但其提供的逻辑资源较少。Xilinx可编程逻辑解决方案缩短了电子设备制造商开发产品的时间并加快了产品面市的速度,从而减小 了制造商的风险。与采用传统方法如固定逻辑门阵列相比,利用Xilinx可编程器件,客户可以更快地设计和验证他们的电路。而且,由于Xilinx器件是只需要进行编程的标准部件,客户不需要象采用固定逻辑芯片时那样等待样品或者付出巨额成本。Xilinx产品已经被广泛应用于从无线电话基站到DVD播放机的数字电子应用技术中。

4.CDMA基带传输系统简介

CDMA(Code Division Multiple Access)是在数字通信技术的分支扩频通信的基础上发展起来的一项技术。它主要用于利用相互正交(或者尽可能正交)的不同编码分配给不同用户调制信号,实现多用户同时使用同一频率接入系统和网络的通信。本文针对 CDMA 码分多址技术设计1个4路用户传输系统 , 省去了载波调制部分 , 把 CDMA扩频系统中传输的信号简化为数字基带信号 , 并做出一个与之相应的扩频编码调制收发系统,系统采用Walsh 函数正交码作为地址码调制原数据信号 , 选用m序列作为扩频的伪随机码。

5.CDMA基带系统设计

5.1 系统设计平台

开发工具软件采用Xilinx公 司 的 EDA 工 具Xilinx ISE。利用 ISE中提供的编程语言设计方法和图形设计方法实现系统各部分的功能。

5.2 CDMA系统设计原理

CDMA技术基于扩频通信的基本原理,将要传送的具有一定信号带宽的信息数据,用一个带宽远大于信号带宽的高速伪随机编码信号去调制它,使原信息数据信号的带宽被大大扩频,再经载波调制后发射出去。接收端则使用完全相同的伪随机码,与接收的带宽信号做相关处

理,把宽带信号变换成信息数据的窄带信号(解扩)实现数据通信。这种扩频通信的明显特点是采用编码调制、频谱扩频和相关处理技术。使用扩频编码调 制易于保密也可供多用户使用。另外,对信息数据的频谱扩展,使功率谱密度明显降低,既不容易被别人发现又不容易干扰别人。CDMA通信多址干扰的大小决定于扩频编码间的互相关值,如果该值非常小乃至可以忽略,那么接收调解输出结果就只有原数据信号和噪声。所以CDMA可在同一载波频率上同时传送多个用户的信息、数据、实现多址通信。编码之间的互相关值越小,多址通信用户就越多。

6.系统总体设计

6.1 CDMA的整体设计框图

整体框图如图 1 所示。

说明:图 1 中“→”表示信号是1路, “→”表示信号是 4路。触发时钟 : 该收发系统受同步时钟控制,在全局时钟的基础上进行分频,详见表1。

表 1 触发时钟分频

图1 CDMA基带收发系统概念框图 6.2 利用VHDL语言编程实现的分频电路模块

图2.实现的多分频模块图

7.本系统完成的功能

本收发系统主要由调制器和解调器两部分组成。它们完成的功能如下:(a)调制器:内嵌于编码器中的信息信号发生器产生的 4 路输入信号,经 Walsh 调制、PN 扩频、基带求和与并串变换成为 1 路信号,完成调制。

(b)解调器:接收端将收到的 1 路信号首先进行串并变换,在取得同步的基础上进行 PN 解扩和 Walsh 解调,恢复出 4 路输入信息。

7.1 Walsh码发生器

Walsh函数是一种非正弦的完备正交函数集。由于它采用的是数字系统,比较适合于用来表达和处理数字信号。考虑到是数字基带系统 , 本系统采用的 Walsh 码组应为:

W1={1,1,1,1};W2={1,0,1,0};W3={1,1,0,0};W4={1,0,0,1}。

该发生器利用 ISE 编程实现较简单,在 Walsh码时钟(全局时钟的 24 分频)的控制下,每出现一次时钟跳变事件,输出端以4为周期依次输出1111,1010,1100和1001的码序列。

沃尔什(Walsh)码是正交码,经常被用作码分多址系统的地址码,Walsh码产生模块作为扩频传输的地址码,并且具有检测使用中的两路Walsh码是否正交 的功能。本设计中使用Walsh,存储在发射端数据寄存器中,扩频过程中根据 Walsh码的地址控制信号。抽取两路 Walsh 码分别对两路消息码进行扩频。接收端截获串行的数字信息流后,从接收端的数据寄存器中取出 Walsh 码对接收信号进行解扩。Walsh 码电路的设计思路运用了译码的原理来实现。

7.1.1 生成Walsh码调制(地址编码)的模块图

Walsh 码调制所生成的模块图为图3所示。

图3 Walsh码调制模块图

Walsh 码调制的仿真图为图 4所示。

图4 Walsh码调制仿真结果图

7.2 PN码、信息码发生器

利用7个D触发器相互级联实现周期为 127 的 PN 序列。具体构成依据 m 序列特征多项式 , 由 ISE提供图形设计方法实现。PN 码时钟为全局时钟的 3 分频。信息码的产生则只需在信息码时钟的控制下 , 从同样的级联中引出 4 路信号作为信息码 , 信息码时钟为全局时钟的 96 分频。

7.2.1 生成PN扩频的模块图

由 PN 扩频所生成的模块图为图5所示。

图5 PN 扩频所生成的模块图

7.3 调制与解调

在数字基带系统中,Walsh 码调制可以简单地用同或门来实现,而PN扩频则可通过简单的异或门实现。在实现 Walsh 码解调与解扩时 ,PN 解扩只需在接收端加 1 异或门。下面着重介绍一下 Wlash 码解调的方法———相关检测。

相关检测原理举例解释(见表 2)。

表2相关原理检测举例解释

Walsh调制码即原信息码与Walsh 码同或 , 所得 4 路码统计所得 1 的个数并转化成相应 3 比特并行码 , 例如表中 Walsh编码的第 1 列转化为010,第2列为100。在接收端则根据传递来的接收信息逐路进行相关检测。相关检测 规则列于表 3 中。

表3 相关检测规则 8.程序代码

8.1 分频器模块

module clk_div(clk_in,rst_n,clk_out);parameter cnt_top=10;clk_in/clk_out=cnt_top; parameter width=4;parameter duty=50;input clk_in;input rst_n;output clk_out;reg clk_out;reg [width-1:0]cnt;always@(posedge clk_in or negedge rst_n)begin if(!rst_n)cnt<=0;else if(cnt==(cnt_top-1))cnt<=0;else cnt<=cnt+1'b1;end always@(posedge clk_in or negedge rst_n)begin if(!rst_n)clk_out<=0;else if(cnt<(cnt_top*duty)/100)clk_out<=1;else clk_out<=0;end endmodule 8.2 PSK模块

module pskmod(clk,rst,seq,in,out);input clk,rst,seq;input [7:0] in;output [7:0] out;reg [7:0] out;always @(posedge clk or negedge rst)begin if(!rst)out=0;else begin if(seq)out=in;else out=~in;end end endmodule 8.3串并转换模块

module ser2par2(clk,rst,in,out,flag);//serial to parallel input clk,rst;input in;output flag;output [3:0]out;reg [3:0]out;reg [1:0]cnt;reg flag;always @(posedge clk or negedge rst)begin if(!rst)begin out=0;end else begin case(cnt)2'b00:out[0]=in;2'b01:out[1]=in;2'b10:out[2]=in;2'b11:out[3]=in;default:out[0]=in;endcase end end always @(posedge clk or negedge rst)begin if(!rst)flag=0;else begin cnt=cnt+1;if(cnt==2'b11)flag=1;else flag=0;end end endmodule 9.仿真调试与结果

点击processes框下的modelsim simulator中Simulation Behavioral Model,调用Modelsim对模块进行仿真。(注,同一时刻仅能有一个modelsim打开)。双击后调用modelsim,在弹出的modelsim界面中,已有部分仿真结果,如图6所示。

图6 软件仿真界面

在transcript框中输入“restart”,在弹出的对话框中选ok。各端口信号 清空,如图7所示。

图7 清空端口信号 在transcript框中输入命令,run 10us。仿真运行10us。查看仿真功能。验证程序设计正确性。由于数字信号不易查看输出信号的变化,因而可在输出波形窗口对应信号上单击右键,选择format->analog(automatic), 得到模拟信号波形进行观察,如图8所示。

图8 波形仿真结果

10.设计心得体会

通过这次课程设计,我深刻的体会到企业局域网建设是一项涉及面广、技术复杂、周期比较长的系统工程。它既是建设一个集计算机网络与各类信息的搜集、传递、处理、加工为一体的信息枢纽中心,又是一项为企业的生产、经营、产品开发及领导决策服务的综合工程。设计一个好的局域网需要有清晰的思维和整体布局的能力,总体说来还是一个比较难的工作。

在这次课程设计过程中,通过查找相关书籍和相关资料,也使得自己增长了不少知识。从这次课设我充分认识到自己相关网络知识的缺乏,虽然也用了很长时间但设计方案还是缺乏一定的可行性。在这次课程设计过程中我也认真阅读了相关书籍,对局域网有了一定的了解,所以说这次课设我还是收获不小。11.参考文献

[1]李栋.多进制扩频系统的关键技术的研究[D].西安:西安电子科技大学出版社,2001.[2]胡兵.自适应阵在码分多址(CDMA)中的应用[D].西安 :西北工业大学,2001.[3] 李畅怡.基于扩展频谱和CDMA的数字视频移动通信研究[D].长沙 :湖南大学,2001.[4] 常娥.突发性扩频信号的同步技术研究[D].大连 :大连理工大学,2003.[6] R.C.Dixon, Spread Spectrum Systems[M].New York: John Wiley & Sons, 1976.[5] 邬民莺.IS-95 CDMA 前向链路的研究与仿真[D].大连 :大连海事大学出版社 , 2003.

第三篇:FPGA可调数字时钟实验报告

浙江大学城市学院

实验报告纸

一、实验要求

1、用vhdl编程,实现10进制计数器

2、用vhdl编程,实现60进制计数器

3、用vhdl编程,实现数字时钟,时、分、秒、毫秒分别显示在数码管上。

4、实现可调数字时钟的程序设计,用按键实现时、分、秒、毫秒的调整。

二、实验原理

用VHDL,行为级描述语言实现实验要求。思路如下:

1、分频部分:由50MHZ分频实现1ms的技术,需要对50MHZ采取500000分频。

2、计数部分:采用低级影响高级的想法,类似进位加1的思路。对8个寄存器进行计数,同步数码管输出。

3、数码管输出部分:用一个拨码开关控制显示,当sw0=0时,四位数码管显示秒、毫秒的计数。当sw0=1时,四位数码管显示时、分得计数。

4、调整部分:分别用四个按键控制时、分、秒、毫秒的数值。先由一个开关控制计数暂停,然后,当按键按下一次,对应的数码管相对之前的数值加1,,通过按键实现时间控制,最后开关控制恢复计数,完成时间调整。

5、整个实现过程由一个文件实现。

三、实验过程

各个引脚说明: Clk:50MHZ SW:数码管切换,SW=’0’时,数码管显示为秒,毫秒。SW=’1’时,数码管显示为时,分。

SW1:暂停与启动。SW1=’0’时,时钟启动,SW=’1’时,时钟暂停。

SW2:时钟调整接通按钮,当SW2=’0’时,不进行调整,当SW=’1’时,通过按键调整时间。

KEY0: 毫秒调整,按一次实现+1功能 KEY1:秒调整,按一次实现+1功能

浙江大学城市学院 实 验 报 告 纸

KEY2:分调整,按一次实现+1功能 KEY3:时调整,按一次实现+1功能 Q0;第一个数码管 Q1;第二个数码管 Q2: 第三个数码管 Q3: 第四个数码管

1、源代码如下:

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity paobiao is port(clk,sw,key0,key1,key2,key3,sw1,sw2:in std_logic;

q0:out std_logic_vector(6 downto 0);

q1:out std_logic_vector(6 downto 0);

q2:out std_logic_vector(6 downto 0);

q3:out std_logic_vector(6 downto 0));end paobiao;architecture behave of paobiao is signal cntt1 :integer range 0 to 10;signal cntt2 :integer range 0 to 10;signal cntt3 :integer range 0 to 10;signal cntt4 :integer range 0 to 6;signal cntt5 :integer range 0 to 10;signal cntt6 :integer range 0 to 10;signal cntt7 :integer range 0 to 10;signal cntt8 :integer range 0 to 6;浙江大学城市学院 实 验 报 告 纸

signal cntttt1 :integer range 0 to 10;signal cntttt2 :integer range 0 to 10;signal cntttt3 :integer range 0 to 10;signal cntttt4 :integer range 0 to 6;signal cntttt5 :integer range 0 to 10;signal cntttt6 :integer range 0 to 10;signal cntttt7 :integer range 0 to 10;signal cntttt8 :integer range 0 to 6;

begin

process(clk)--,key0,key1,key2,key3)

variable cnt :integer range 0 to 500000;

--variable cnt9 :integer range 0 to 3000000000;

variable cnt1 :integer range 0 to 10;

variable cnt2 :integer range 0 to 10;

variable cnt3 :integer range 0 to 10;

variable cnt4 :integer range 0 to 6;

variable cnt5 :integer range 0 to 10;

variable cnt6 :integer range 0 to 10;

variable cnt7 :integer range 0 to 10;

variable cnt8:integer range 0 to 6;

begin if(clk'event and clk='1')then

if(sw1='0')then if(cnt>=2)then

cnt:=0;

cnt1:=cnt1+1;浙江大学城市学院 实 验 报 告 纸

if(cnt1=10)then

cnt1:=0;

cnt2:=cnt2+1;

if(cnt2=10)then

cnt1:=0;

cnt2:=0;

cnt3:=cnt3+1;

if(cnt3=10)then

cnt1:=0;

cnt2:=0;

cnt3:=0;

cnt4:=cnt4+1;

if(cnt4=6)then

cnt1:=0;

cnt2:=0;

cnt3:=0;

cnt4:=0;

cnt5:=cnt5+1;

if(cnt5=10)then

cnt5:=0;

cnt6:=cnt6+1;

if(cnt6=6)then

cnt5:=0;

cnt6:=0;

cnt7:=cnt7+1;

if(cnt7=4)then

cnt5:=0;

cnt6:=0;

cnt7:=0;浙江大学城市学院 实 验 报 告 纸

cnt8:=cnt8+1;

if(cnt8=3)then

cnt5:=0;

cnt6:=0;

cnt7:=0;

cnt8:=0;

end if;

end if;

end if;

end if;

end if;

end if;

end if;

end if;

else cnt:=cnt+1;

end if;

if(sw2='0')then

cntt1<=cnt1;

cntt2<=cnt2;

cntt3<=cnt3;

cntt4<=cnt4;

cntt5<=cnt5;

cntt6<=cnt6;

cntt7<=cnt7;

cntt8<=cnt8;

else

cnt1:=cntttt1;

cnt2:=cntttt2;

cnt3:=cntttt3;浙江大学城市学院 实 验 报 告 纸

cnt4:=cntttt4;

cnt5:=cntttt5;

cnt6:=cntttt6;

cnt7:=cntttt7;

cnt8:=cntttt8;

cntt1<=cnt1;

cntt2<=cnt2;

cntt3<=cnt3;

cntt4<=cnt4;

cntt5<=cnt5;

cntt6<=cnt6;

cntt7<=cnt7;

cntt8<=cnt8;

end if;

end if;end if;end process;

process(key0)variable cnttt1 :integer range 0 to 10;variable cnttt2 :integer range 0 to 10;begin if(key0'event and key0='0')then

cnttt1:=cnttt1+1;

if(cnttt1=10)then

cnttt1:=0;

cnttt2:=cnttt2+1;

if(cnttt2=10)then 浙江大学城市学院 实 验 报 告 纸

cnttt2:=0;

end if;

end if;

cntttt1<=cnttt1;

cntttt2<=cnttt2;end if;

end process;process(key1)variable cnttt3 :integer range 0 to 10;variable cnttt4 :integer range 0 to 10;begin if(key1'event and key1='0')then

cnttt3:=cnttt3+1;

if(cnttt3=10)then

cnttt3:=0;

cnttt4:=cnttt4+1;

if(cnttt4=6)then

cnttt4:=0;

end if;

end if;cntttt3<=cnttt3;

cntttt4<=cnttt4;end if;end process;process(key2)variable cnttt5 :integer range 0 to 10;variable cnttt6 :integer range 0 to 10;begin

if(key2'event and key2='0')then 浙江大学城市学院 实 验 报 告 纸

cnttt5:=cnttt5+1;

if(cnttt5=10)then

cnttt5:=0;

cnttt6:=cnttt6+1;

if(cnttt6=6)then

cnttt6:=0;

end if;

end if;cntttt5<=cnttt5;

cntttt6<=cnttt6;

end if;end process;process(key3)variable cnttt7 :integer range 0 to 10;variable cnttt8 :integer range 0 to 10;begin

if(key3'event and key3='0')then

cnttt7:=cnttt7+1;

if(cnttt7=4)then

cnttt7:=0;

cnttt8:=cnttt8+1;

if(cnttt8=3)then

cnttt8:=0;

end if;

end if;

cntttt7<=cnttt7;

cntttt8<=cnttt8;

end if;浙江大学城市学院 实 验 报 告 纸

end process;

--end if;--end process;

process(cntt1,cntt5)

begin

if(sw='0')then

case cntt1 is

when 0=>q0<=“1000000”;

when 1=>q0<=“1111001”;

when 2=>q0<=“0100100”;

when 3=>q0<=“0110000”;

when 4=>q0<=“0011001”;

when 5=>q0<=“0010010”;

when 6=>q0<=“0000010”;

when 7=>q0<=“1011000”;

when 8=>q0<=“0000000”;

when 9=>q0<=“0010000”;

when others=>q0<=NULL;end case;else

case cntt5 is

when 0=>q0<=“1000000”;

when 1=>q0<=“1111001”;

when 2=>q0<=“0100100”;

when 3=>q0<=“0110000”;

when 4=>q0<=“0011001”;

when 5=>q0<=“0010010”;

when 6=>q0<=“0000010”;

浙江大学城市学院 实 验 报 告 纸

when 7=>q0<=“1011000”;

when 8=>q0<=“0000000”;

when 9=>q0<=“0010000”;

when others=>q0<=NULL;end case;

end if;

end process;

process(cntt2,cntt6)

begin if(sw='0')then

case cntt2 is

when 0=>q1<=“1000000”;

when 1=>q1<=“1111001”;

when 2=>q1<=“0100100”;

when 3=>q1<=“0110000”;

when 4=>q1<=“0011001”;

when 5=>q1<=“0010010”;

when 6=>q1<=“0000010”;

when 7=>q1<=“1011000”;

when 8=>q1<=“0000000”;

when 9=>q1<=“0010000”;

when others=>q1<=NULL;end case;else

case cntt6 is

when 0=>q1<=“1000000”;

when 1=>q1<=“1111001”;

when 2=>q1<=“0100100”;浙江大学城市学院 实 验 报 告 纸

when 3=>q1<=“0110000”;

when 4=>q1<=“0011001”;

when 5=>q1<=“0010010”;

when 6=>q1<=“0000010”;

when 7=>q1<=“1011000”;

when 8=>q1<=“0000000”;

when 9=>q1<=“0010000”;

when others=>q1<=NULL;end case;end if;

end process;process(cntt3,cntt7)

begin

if(sw='0')then

case cntt3 is

when 0=>q2<=“1000000”;

when 1=>q2<=“1111001”;

when 2=>q2<=“0100100”;

when 3=>q2<=“0110000”;

when 4=>q2<=“0011001”;

when 5=>q2<=“0010010”;

when 6=>q2<=“0000010”;

when 7=>q2<=“1011000”;

when 8=>q2<=“0000000”;

when 9=>q2<=“0010000”;

when others=>q2<=NULL;end case;else

case cntt7 is 浙江大学城市学院 实 验 报 告 纸

when 0=>q2<=“1000000”;

when 1=>q2<=“1111001”;

when 2=>q2<=“0100100”;

when 3=>q2<=“0110000”;

when 4=>q2<=“0011001”;

when 5=>q2<=“0010010”;

when 6=>q2<=“0000010”;

when 7=>q2<=“1011000”;

when 8=>q2<=“0000000”;

when 9=>q2<=“0010000”;

when others=>q2<=NULL;end case;end if;

end process;

process(cntt4,cntt8)

begin if(sw='0')then

case cntt4 is

when 0=>q3<=“1000000”;

when 1=>q3<=“1111001”;

when 2=>q3<=“0100100”;

when 3=>q3<=“0110000”;

when 4=>q3<=“0011001”;

when 5=>q3<=“0010010”;

when others=>q3<=NULL;end case;else

case cntt8 is

when 0=>q3<=“1000000”;浙江大学城市学院 实 验 报 告 纸

when 1=>q3<=“1111001”;

when 2=>q3<=“0100100”;

when 3=>q3<=“0110000”;

when 4=>q3<=“0011001”;

when 5=>q3<=“0010010”;

when 6=>q3<=“0000010”;

--when 7=>q3<=“1011000”;--when 8=>q3<=“0000000”;--when 9=>q3<=“0010000”;

when others=>q3<=NULL;end case;end if;

end process;end behave;

2、原理图如下:

浙江大学城市学院 实 验 报 告 纸

3、功能仿真如下

1、秒、毫秒计数仿真

2、分、时计数仿真

注释:由于仿真时间限制,小时不能显示。注意SW由0变成1;

浙江大学城市学院 实 验 报 告 纸

3、暂停的仿真,数码管显示用秒,毫秒。

4、按键调整的仿真,主要仿真毫秒的仿真

四、实验结果

实验结果均完成所有要求,但有一个bug,在实现调整功能的时候,不能实时调整数码管暂停下来的数字,只能从之前调整过的数值起开始调整,不过能实现调整之后,开启时钟,时钟即在设定的时间开始跑。当然找到解决的方法,当由于思路和已经 写好的程序冲突性较大,所以此处不再修改。

五、心得体会

本次实验在分频的基础上进行拓展,同时应用数码管显示,开关和按键的控制,比较系统的做了一个实验,对自身的提高还是很有帮助的。

说到心得,此次实验告诉我一下经验:

1、在开始写程序之前最好先评估好自己的思路,简易画出想象中的原理图,再进行编程,对之后的修改有很大的帮助。

2、程序写长了,发现错得时候,修改比较麻烦,所有注意编程习惯很重要,适当的加一些注释,提高程序的可读性。

3、程序最好分模块写,比较清晰。

浙江大学城市学院 实 验 报 告 纸

第四篇:基于FPGA的数字电子时钟设计与实现(范文模版)

《数字电子技术》课程设计

设计题目:基于FPGA的数字电子时钟设计与实现

系 部: 电子与信息工程系 专业班级: 电子信息工程08秋(1)班 小组成员: 胡修远 学 号: 08031145 指导教师 : 陶亚雄 周丽婕

完成日期: 2012年 1 月

目录

一、所用设备与器材................................................1 1.1仪器设备...................................................1 二.系统方案......................................................1 2.1 设计思想..................................................1 2.1.1课题背景........................................1 2.1.2 Quartus II软件.................................3 2.2工作原理及系统框图.........................................8 三.软件方案......................................................9 3.1 程序流程图................................................9 3.1.1 24进制........................................9 3.1.2 10进制流程图.................................10 3.1.3 6进制........................................11 3.1.4 60进制.......................................11 3.1.5 from0to9......................................12 3.1.6 分频模块.......................................12 3.1.7 总流程图.......................................13 3.2 程序清单.................................................14 3.2.1头文件complete_clock程序......................14 3.2.2 counter24程序.................................15 3.2.3 counter60程序.................................15 3.2.4 from0to9程序..................................16 3.2.5 counter6程序..................................17 3.2.6 counter10程序.................................17 3.2.7 分频程序.......................................17 3.2.8 校时模块程序...................................18 四.调试及结果...................................................18

4.1 模块仿真.................................................18 4.1.1 counter10模块仿真.............................18 4.1.2 counter24模块仿真.............................19 4.1.3 counter60模块仿真.............................19 4.1.4 分频模块仿真...................................19 4.1.5 top_clock计时模块仿真.........................19 4.2 程序下载.................................................20 4.3分析运行结果..............................................21 4.3.1 设计总结.......................................21 4.3.2 心得体会.......................................21 4.3.3 致谢...........................................22

2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

一、所用设备与器材

1.1仪器设备

使用仪器设备有FPGA DE2-70开发板、PC机、信号发生器。

图1 FPGA DE2-70开发板图

二.系统方案

2.1 设计思想

利用数字电子技术、EDA设计方法、FPGA等技术,设计、仿真并实现一个基于FPGA的数字电子时钟基本功能,其基本组成框图如图1所示,振荡器采用ALTERA的DE2-70实验板的50MHz输出,分频器将50MHz的方波进行分频进而得到1Hz的标准秒脉冲,时、分、秒计时模块分别由二十四进制时计数器、六十进制分计数器和六十进制秒计数器完成,校时模块完成时和分的校正。扩展功能设计为倒计时功能,从59分55秒至59分59秒,每秒亮一盏灯报时。

2.1.1课题背景

20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力的推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能更进一步,产品更新换代的节奏也越来越快。

20世纪80年代末,出现了FPGA(Field Progrommable Gate Array),CAE和CAD技术的应用更为广泛,它们在PCB设计的原理图输入,自动布局布线及PCB分析,以及逻辑设计,逻辑仿真布尔综合和化简等方面担任了重要的角色,2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

为电子设计自动化必须解决的电路建模,标准文档及仿真测试奠定了基础。硬件描述语言是EDA技术的重要组成部分,VHDL是作为电子设计主流硬件的描述语言。本论文就是应用VHDL语言来实现秒表的电路设计。VHDL语言是标准硬件描述语言,它的特点就是能形式化抽样表示电路结构及行为,支持逻辑设计中层次领域的描述,借用了高级语言的精巧结构简化电路描述,具有电路模拟与验证及保证设计的正确性,支持电路由高层向底层的综合变换,便于文档管理,易于理解和设计重用。

EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。

利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程在计算机上自动处理完成。

现在对EDA的概念或范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA 技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。本文所指的EDA技术,主要针对电子电路设计、PCB设计和IC设计。EDA 设计可分为系统级、电路级和物理实现级。

用VHDL语言开发的流程:(1)文本编辑:用任何文本编辑器都可以进行,也可以用专用的HDL编辑环境。通常VHDL文件保存为.vhd文件。

(2)功能仿真:将文件调入HDL仿真软件进行功能仿真,检查逻辑功能是否正确(也叫前仿真,对简单的设计可以跳过这一步,只在布线完成以后,进行时序仿真)。

(3)逻辑综合:将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式和信号的连接关系。逻辑综合软件会生成.edf(edif)的EDA工业标准文件。

(4)布局布线:将.edf文件调入PLD厂家提供的软件中进行布线,即把设计好的逻辑安放到PLD/FPGA内。2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

3(5)编程下载:确认仿真无误后,将文件下载到芯片中。

本设计为一个多功能的数字钟,具有时、分、秒计数显示功能,以24小时的循环计数:具有校对功能。本设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在Quartus 工具软件下,采用自顶向下的设计方式,由各个基本模块共同构建了一个基本FPGA的数字钟。

系统主芯片采用EP2C70F896C6,有时钟模块、控制模块、计时模块、数据译码模块、显示以及报时模块组成。经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统能够完成时、分、秒的分别显示,由按键输入进行数字钟的校时、清零、启停功能。

随着电子技术的发展,数字电路朝着速度快、容量大、体积小、重量轻的方向发展。人们对时间计量的精度要求越来越高,钟表的数字化给人们生产生活带来了极大的方便。数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。

本次设计以数字电子为主,实现对时、分、秒数字显示的计时装置,周期为24小时,显示满刻度为23时59分59秒,并具有校时功能和报时功能的数字电子钟。课程设计所采用的开发平台:Quartus II是可编程片上系统的综合性设计环境,它支持CPLD和FPGA器件的开发。FPGA(Field Programmable Gate Array)现场可编程门阵列,内部主要由许多可编程逻辑模块组成,靠纵横交错的分布式可编程互连线连接起来,可构成极其复杂的逻辑电路。本次课程设计所采用的FPGA芯片 Cyclone II系列的EP2C70F896C6。

2.1.2 Quartus II软件

Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计程。Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。

Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。

Quartus II使用基本流程如下: 1.打开Quartus II软件,创建工程

a.点击工具栏File,利用创建工程向导(New Project Wizard)创建新工程。

图2 新建工程图

b.工程目录为c:altera71sp1quartus(路径中不能包含中文,不能建立在桌面上),工程名称以及顶层设计实体为counter10(以英文字母开头)。

图3 创建路径图

c.选择与开发板上芯片型号对应的器件。硬件选cycloneⅡ EP2C70F896C6。

图4 芯片选择图

d.进入第三方EDA工具选择窗口,在此可以选择使用第三方的EDA工具,如一些布局布线、综合、仿真软件。

e.确认无误后,单击Finsh完成工程创建。2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

f.工程创建成功后,在【Project Navigator】(资源管理窗口)显示当前工程的层次、文件和设计单元。

g.执行File—New—Design Files—verilog HDL File,建立原理图文件。

图5 原理图文件建立图

h.完成后点击File----save as,保存到c:altera71sp1quartus目录下。i.使用文本编辑器输入源码,完成原理图编译。

j.编译工程,执行Processing—start—start Analysis&Elaboration进行编译,分析检查输入文件是否有错误。2.创建仿真波形文件

a.点击New—Vector Waveform File—save as

图6 新建仿真波形文件图

b.在Name框图中右击鼠标,Insert—Insert Node or Bus—Node Finder—在Filter中选择Pinns:all,点击list,点击“》”将左侧列表中的内容移动到右侧列表中。2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

图7 插入管脚图

c.在CP上右击选择value,选择时钟脉冲信号clock(周期可自行设置)。EN和nCR都选择高电平(Forcing High)。

图8 输入信号赋值

d.选择Assignments—Settings设置—simulater settings—模式mode选择功能型Functional e.选择Processing—generate functional simulation netlist生成功能网表

图9 生成功能网表图

f.点击波形仿真的快捷键,进行波形的仿真。

g.分别给EN和nCR不同的电平信号,观察分析波形的变化。2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

图10 EN=1 nCR=1

图11 EN=0 nCR=1

图12 EN=1 nCR=0 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

图13 EN=0 nCR=0

图14 EN脉冲 nCR=1

2.2工作原理及系统框图

利用数字电子技术、EDA设计方法、FPGA等技术,设计、仿真并实现一个基于FPGA的数字电子时钟基本功能,其基本组成框图如图1所示,振荡器采用ALTERA的DE2-70实验板的50MHz输出,分频器将50MHz的方波进行分频进而得到1Hz的标准秒脉冲,时、分、秒计时模块分别由二十四进制时计数器、六十进制分计数器和六十进制秒计数器完成,校时模块完成时和分的校正。电子时钟扩展功能为倒计时流水灯。数字电子钟的电路组成框图片如下图: 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

多功能数字钟顶层模块振荡器校时电路倒计时模块分频器CP 1Hz时计数器(24进制)分计数器(60进制)秒计数器(60进制)时译码显示6计数器10计数器分译码显示6计数器10计数器分译码显示 图15 系统框图

1.数字钟电路系统由主体电路和扩展电路两大部分所组成。

2.数字电子时钟电路具有时、分、秒计时,秒计数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器按照“24进制”规律计数。

3.准确计时,以数字形式显示时、分、秒的时间,计数器的输出经译码器送显示器。

4.具有分、时校正功能,校正输入脉冲频率为1Hz 5.复位功能,时、分、秒计时清零。

6.扩展功能为:具有仿广播电台整点报时的功能,即每逢59分51秒、52秒、53秒、54秒、55秒及57秒,LED绿灯依此点亮,59分59秒时,LED红灯亮,形成倒计时流水灯报时。

三.软件方案

3.1 程序流程图

3.1.1 24进制

小时采用24进制计时,当CP↑,EN和nCR为高电平时计数,计数范围为[0,23],使能信号EN等于0时,计时器保持。当高位大于2或高位等于2且低位大于3时,计时器清零,否则继续计时。流程图见下图。2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

开始CP↑or nCR↓YnCR=0 ?YNNEN=0 ?YNNQH>2 or Q>23Y清零保持清零Q=Q+1 图16 24进制程序流程图

3.1.2 10进制流程图

当CP↑,EN和nCR为高电平时计数,计数范围为[0,9],使能信号EN等于0时,计时器保持。当计时到9的时候,计时器清零,否则继续计时。流程图见下图。

开始CP↑or nCR↓YnCR=0 ?YNNNEN=0 ?YQ=9 ?Y清零保持清零NQ=Q+1

图17 10进制流程图 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

3.1.3 6进制

当CP↑,EN和nCR为高电平时计数,计数范围为[0,5],使能信号EN等于0时,计时器保持。当计时到5的时候,计时器清零,否则继续计时。流程图见下图。

开始CP↑or nCR↓YnCR=0 ?YNNNNEN=0 ?YQ=5 ?Y清零保持清零Q=Q+1 图18 6进制流程图

3.1.4 60进制

分、秒采用60进制计时,当CP↑,EN和nCR为高电平时计数,计数范围为[0,59],使能信号EN等于0时,计时器保持。当个位等于9时向十位进位;当个位等于9十位等于5,计时器清零,否则继续计时。流程图见下图。

开始CP↑or nCR↓NnCR=0?NEN=0?Y个位Q1=9?NYQ2=Q2+1Q2=5?YQ1=9?NNN清零保持Q1=Q1+1Y清零Q1=Q1+1 图19 60进制流程图 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

3.1.5 from0to9

数码管有7段组成,分共阳极和共阴极,本次设计采用共阳极数码管。当输入为低电平时,数码管显示;当输入为高电平时,数码管不显示。用这样的方法输入不同的高低信号控制数码管的显示。

HEX=7'b0000001HEX=1001111HEX=b0010010HEX=7'b0000110HEX=7'b1001100开始Case DNHEX=7'b0100000HEX=7'b1111111HEX=7'b0001111HEX=7'b0000000HEX=7'b0000100显示7显示8显示9显示6YHEX=7'b0100100显示5显示0显示1显示2显示3显示4 图20 from0to9流程图

3.1.6 分频模块

开始50MHz方波10^2分频500KHz方波10^2分频5KHz方波10^2分频50Hz方波10^2分频0.5Hz方波

图21 分频模块流程图 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

3.1.7 总流程图

开始开始NCPCP↑↑or nCRor nCR↓↓Y分频模块YYNYAdjHrkey=1?AdjHrkey=1?NNN时低位时低位=9?=9?NYYAdjMinKey=1?AdjMinKey=1?YY低位清零高位进位低位清零高位进位N高位高位>2or>2or时时>23>23YNN分低位分低位=9=9??NN清零清零YY秒低位秒低位=9=9??NNNY低位清零高位进位低位清零高位进位YY低位计数低位计数低位计数低位计数YNY秒高位秒高位=5=5??低位清零高位进位低位清零高位进位低位计数低位计数NYY高位高位=5=5??NN秒高位清零,分低位进位秒高位清零,分低位进位高位计数高位计数清零清零Y高位计数高位计数N低位计数低位计数Y低位清零高位进位低位清零高位进位N分低位分低位=9=9??NN分高位分高位=5=5??YY高位计数高位计数Y分清零,时低位位进位分清零,时低位位进位低位清零高位进位低位清零高位进位Y时低位时低位=9=9??NNNNYY高位高位>2or>2or时时>23>23清零清零低位计数低位计数

图22 总流程图 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

3.2 程序清单

3.2.1头文件complete_clock程序

module complete_clock(HEX0,HEX1,HEX2,HEX3,HEX4,HEX5,_50MHzIn,_1Hz,_50Hz, _5KHz,_500KHz,AdjMinkey,AdjHrkey,nCR,Alarm,LED0,LED10,LED3,LED4,LED5,LED6,LED7,LED8,LED9);

output [7:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;output Alarm,_1Hz,_50Hz,_5KHz,_500KHz;output LED0;output LED10;output LED3;output LED4;output LED5;output LED6;output LED7;output LED8;output LED9;wire [7:0] HEX0,HEX1,HEX2,HEX3,HEX4,HEX5;input nCR,_50MHzIn;wire _1Hz,_50Hz,_5KHz,_500KHz;wire LED0;wire LED10;wire LED3;wire LED4;wire LED5;wire LED6;wire LED7;wire LED8;wire LED9;input AdjMinkey,AdjHrkey;wire [7:0] Second,Minute,Hour;Divided_Frequency C1(_5KHz,_500KHz,nCR,_50MHzIn);//调用分频模块,输入50MHz的频率,经两次分频后变为5KHz Divided_Frequency U0(_1Hz,_50Hz,nCR,_5KHz);//调用分频模块,输入5KHz的频率,经

两次分频后变为1Hz top_clock U1(Hour,Minute,Second,_1Hz,nCR,AdjMinkey,AdjHrkey);//调用校时模块,对时、分模块进行校时 baoshi U2(Alarm_Ring,Minute,Second,_50Hz,_5KHz);assign Alarm=Alarm_Ring;assign LED0=({Minute,Second}==16'h5951);//定义LED0为59分51秒时灯亮 assign LED10=({Minute,Second}==16'h5952);//定义LED10为59分52秒时灯亮 assign LED3=({Minute,Second}==16'h5953);//定义LED3为59分53秒时灯亮 assign LED4=({Minute,Second}==16'h5954);//定义LED4为59分54秒时灯亮 assign LED5=({Minute,Second}==16'h5955);//定义LED5为59分55秒时灯亮 assign LED6=({Minute,Second}==16'h5956);//定义LED6为59分56秒时灯亮 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

assign LED7=({Minute,Second}==16'h5957);//定义LED7为59分57秒时灯亮 assign LED8=({Minute,Second}==16'h5958);//定义LED8为59分58秒时灯亮 assign LED9=({Minute,Second}==16'h5959);//定义LED9为59分59秒时灯亮 from0to9 U10(HEX0,Second[3:0]);//个位秒调用译码 from0to9 U9(HEX1,Second[7:4]);//十位秒调用译码 from0to9 U3(HEX2,Minute[3:0]);//个位分调用译码 from0to9 U4(HEX3,Minute[7:4]);//个位分调用译码 from0to9 U5(HEX4,Hour[3:0]);//个位时调用译码 from0to9 U6(HEX5,Hour[7:4]);//十位时调用译码 endmodule 3.2.2 counter24程序

module counter24(CntH,CntL,nCR,EN,CP);input CP,nCR,EN;output [3:0] CntH,CntL;reg [3:0] CntH,CntL;always @(posedge CP or negedge nCR)begin if(~nCR){CntH,CntL}<=8'h00;//当nCR=0时,计时器清零

else if(~EN){CntH,CntL}<={CntH,CntL};//当EN=0时,停止计时,保持 else if((CntH>2)||(CntH>9)||((CntH==2)&&(CntL>=3))){CntH,CntL}<=8'h00;else if((CntH==2)&&(CntL<3))begin CntH<=CntH;CntL<=CntL+1'b1;end else if(CntL==9)begin CntH<=CntH+1'b1;CntL<=4'b0000;end else begin CntH<=CntH;CntL<=CntL+1'b1;end end Endmodule 3.2.3 counter60程序

module counter60(Q1,Q2,Q3,Q4,Q5,Q6,Cnt,Cnt1,Cnt24,nCR,EN,CP,LED,LED1,LED2);input CP,nCR,EN;output [7:0] Cnt;output [7:0] Cnt1;output [7:0] Cnt24;output [6:0] Q1;output [6:0] Q2;output [6:0] Q3;output [6:0] Q4;output [6:0] Q5;output [6:0] Q6;output LED;output LED1;output LED2;wire [7:0] Cnt;2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

wire [7:0] Cnt1;wire [7:0] Cnt24;wire [6:0] Q1;wire [6:0] Q2;wire [6:0] Q3;wire [6:0] Q4;wire [6:0] Q5;wire [6:0] Q6;wire LED;wire LED1;wire LED2;wire ENP;wire ENP1;wire ENP2;wire ENP3;counter10 UC0(Cnt[3:0],nCR,EN,CP);counter6 UC1(Cnt[7:4],nCR,ENP,CP);counter10 UC2(Cnt1[3:0],nCR,ENP1,CP);counter6 UC3(Cnt1[7:4],nCR,ENP2,CP);counter24 UC4(Cnt24[7:4],Cnt24[3:0],nCR,ENP3,CP);assign ENP=(Cnt[3:0]==4'h9);assign ENP1=(Cnt==8'h59);assign ENP2=((Cnt1[3:0]==4'h9)&&(Cnt==8'h59));assign ENP3=((Cnt1==8'h59)&&(Cnt==8'h59));assign LED=~CP;assign LED1=~CP;assign LED2=~CP;from0to9 UC5(Q1,Cnt[3:0]);from0to9 UC6(Q2,Cnt[7:4]);from0to9 UC7(Q3,Cnt1[3:0]);from0to9 UC8(Q4,Cnt1[7:4]);from0to9 UC9(Q5,Cnt24[3:0]);from0to9 UC10(Q6,Cnt24[7:4]);Endmodule 3.2.4 from0to9程序

module from0to9(HEX,D);output [6:0] HEX;input [3:0] D;reg [6:0] HEX;always @(D)begin case(D)4'd0:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000001;4'd1:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1001111;4'd2:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0010010;2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

4'd3:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000110;4'd4:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1001100;4'd5:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0100100;4'd6:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0100000;4'd7:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0001111;4'd8:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000000;4'd9:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b0000100;default:{HEX[0],HEX[1],HEX[2],HEX[3],HEX[4],HEX[5],HEX[6]}=7'b1111111;endcase end endmodule 3.2.5 counter6程序

module counter6(Q,nCR,EN,CP);input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always @(posedge CP or negedge nCR)begin if(~nCR)Q<=4'b0000;//当nCR=0时,计时器清零 else if(~EN)Q<=Q;//当EN=0时,停止计时,保持 else if(Q==4'b0101)Q<=4'b0000;else Q<=Q+1'b1;//计时器正常计时 end Endmodule 3.2.6 counter10程序

module counter10(Q,nCR,EN,CP);input CP,nCR,EN;output [3:0] Q;reg [3:0] Q;always @(posedge CP or negedge nCR)begin if(~nCR)Q<=4'b0000;//当nCR=0时,计时器清零 else if(~EN)Q<=Q;//当EN=0时,停止计时,保持 else if(Q==4'b1001)Q<=4'b0000;else Q<=Q+1'b1;//计时器正常计时 end Endmodule 3.2.7 分频程序

module Divided_Frequency(_1HzOut,nCR,_5kHzIN);input _5kHzIN,nCR;output _1HzOut;supply1 Vdd;//定义 Vdd 是高电平

wire [15:0] Q;//计时器的输出信号(中间变量)wire EN1,EN2,EN3;// 计时器的使能信号(中间变量)counter10 DU0(Q[3:0],nCR,Vdd,_5kHzIN);//调用十进制 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

counter10 DU1(Q[7:4],nCR,EN1,_5kHzIN);counter10 DU2(Q[11:8],nCR,EN2,_5kHzIN);counter10 DU3(Q[15:12],nCR,EN3,_5kHzIN);assign EN1=(Q[3:0]==4'h9);assign EN2=(Q[7:4]==4'h9)&(Q[3:0]==4'h9);assign EN3=(Q[11:8]==4'h9)&(Q[7:4]==4'h9)&(Q[3:0]==4'h9);assign _1HzOut=Q[15];//assign _500HzOut=Q[0];endmodule 3.2.8 校时模块程序

module top_clock(Second,Minute,Hour,_1Hz,nCR,AdjMinKey,AdjHrkey);input _1Hz,nCR,AdjMinKey,AdjHrkey;output [7:0] Second,Minute,Hour;wire [7:0] Hour,Minute,Second;supply1 Vdd;wire MinCP,HrCP;counter60 UT1(Second,nCR,Vdd,_1Hz);//调用counter60,对秒计时 counter60 UT2(Minute,nCR,Vdd,~MinCP);// 调用counter60,对分校时

counter24 UT3(Hour[7:4],Hour[3:0],nCR,Vdd,~HrCP);//调用counter24,对时校时 assign MinCP=AdjMinKey ? _1Hz:(Second==8'h59);//当MinCP=AdjMinKey时,执行校时,当MinCP≠AdjMinKey时,秒计时至59 时向分进位 assign HrCP=AdjHrkey?_1Hz:({Minute,Second}==16'h5959);//当HrCP=AdjHrkey时,执

行校时,当HrCP≠AdjHrkey时,分

秒计时至59分59秒时向时进位 Endmodule 四.调试及结果

4.1 模块仿真

4.1.1 counter10模块仿真

CP为时钟脉冲;当CP↑,EN和nCR为高电平时Q计数;Q的计数范围为[0,9]

图counter10仿真波形图 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

4.1.2 counter24模块仿真

CP为时钟脉冲;当CP↑,EN和nCR为高电平时Q计数;Q的计数范围为[0,23]

图24 counter24仿真波形图

4.1.3 counter60模块仿真

CP为时钟脉冲;当CP↑,EN和nCR为高电平时Q计数;Q的计数范围为[0,59]

图25 counter60仿真波形图

4.1.4 分频模块仿真

分频器是将输入的基本时钟信号分频为其他模块需要的5kHZ 和1HZ 的信号.其中CLK 输入为5kHZ , CLK2 输出1HZ 信号,分频实际也是用了计数器的原理。

图26 分频模块仿真波形图

4.1.5 top_clock计时模块仿真 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

当秒计时到59时,向分进一位,当秒计时到59且分计时到59时向时进一位。当时分秒计时到23’59’59时,计时器清零。

图27 top_clock计时模块仿真波形图

4.2 程序下载

图28 时测试校时,时至23 图29 时测试校时,时进位至00

图30 分测试校时分至59

图31 分测试校时,分进位至00 图32 59分52秒,LEDG1亮 图33 59分55秒,LEDG4亮 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

图34 59分57秒,LEDG6亮

图35 59分59秒,LEDR0亮

4.3分析运行结果

4.3.1 设计总结

本次大型作业我们所研究的课题是基于FPGA的数字电子时钟的设计与实现。时钟设计的方法是通过计时模块、分频模块、校时模块、译码显示模块和倒计时报时模块来构成该电子时钟。计时模块为时分秒计时,采用24进制计时。因此该模块中调用了24进制和60进制两个程序,其中60进制采用的是调用6进制和10进制的方法来实现。

分频模块输入一频率为50MHz的信号,经过四次10^2分频,将信号逐次分为500KHz、5KHz、50Hz直至0.5Hz。计时模块就由分频器分频出来的标准秒脉冲进行计时,时、分、秒计时模块分别由二十四进制时计数器、六十进制分计数器和六十进制秒计数器完成,校时模块完成时和分的校正。我们还进行了扩展功能设计——倒计时流水灯功能,从59分55秒至59分59秒,每秒亮一盏灯报时,55秒至58秒,依此亮绿灯,59秒亮红灯。

通过这两周的课程设计,我们熟悉了基于FPGA的数字电子时钟的设计与实现的整个流程,文本编辑,功能仿真,逻辑综合,布局布线,编程下载,每一步刚开始或多或少有些问题,但在我们不断努力学习补充修改后,最终圆满完成数字电子时钟的时、分、秒的计时和校时功能,复位功能,还设计实现了倒计时流水灯扩展功能。

4.3.2 心得体会

为期两周的大型作业,我们组顺利完成了基于FPGA的数字电子时钟设计与实现的课程设计。从刚开始对Verilog语言非常陌生,到最后接近熟练地掌握Verilog语言的程度,期间花费不少时间和精力,同时也收获了很多,学会了 2012.1

上海师范大学天华学院电信系数字集成器件与应用专业课程设计

使用Verilog语言编程仿真电路实验,掌握了可编程逻辑器件的应用开发技术,熟悉了一种EDA软件使用,掌握了Verilog设计方法,即分模块分层次的设计方法。

在设计的过程中,因为刚刚接触这种编程语言,我们也遇到了很多问题。但是我们没有放弃过,不断检查纠正错误。Verilog源程序的编写很容易出现错误,这就需要耐心的调试。因为很多情况下,一长串的错误往往是由一个不经意的小错误引起的。有时程序一直出错找不到原因的时候,我们也会去虚心向别的组的同学请教,或者和他们一起讨论问题,从中得到一些启发。

由于设备和时间的限制,我们还有一部分扩展内容没能够完成,即数字钟的整点蜂鸣报时功能。但本次设计实验已使我们对Verilog语言产生了浓厚的兴趣,在以后的学习生活中会主动去了解更多有关这方面的知识及其在实践中的应用。

这次大型作业,不仅让我们又掌握了一些新的知识,也提高了我们的动手能力和科学严谨的精神。其次也培养了我们自学的能力,遇到不明白的地方可以通过思考、查资料、与同学交流多种方式解决问题。这些对于我们以后的学习和工作都有极大的帮助。

4.3.3 致谢

最后,我们要感谢系里提供这一次的机会让我们学到更多知识,并且提供了这么好的学习条件,设备、学习环境、师资等方面都非常好。同时也要感谢周丽婕老师和陶亚雄老师两周以来耐心的指导,在我们遇到问题的时候,是她们悉心的指导帮助和不厌其烦的讲解下我们才得以顺利的完成这次的设计,我们再次表示由衷的感谢!

第五篇:个人FPGA学习心得

回想起自己学FPGA,已经有一段时间了,从开始的茫然,到

后来的疯狂看书,设计开发板,调电路,练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多,拿出来和大家分享,顺便介绍下自己的一点经验所得,希望对初学者有所帮助。

废话不说了,下面进入正题,学习FPGA我主要经历了这么几个阶段:

①、Verilog语言的学习,熟悉Verilog语言的各种语法。

②、FPGA的学习,熟悉QuartusII软件的各种功能,各种逻辑算法设计,接口模块(RS232,LCD,VGA,SPI,I2c等)的设计,时序分析,硬件优化等,自己开始设计简单的FPGA板子。

③、NiosII的学习,熟悉NiosII的开发流程,熟悉开发软件(SOPC,NiosII IDE),了解NiosII的基本结构,设计NiosII开发板,编写NiosII C语言程序,调试板子各模块功能。

先来说说第一个阶段,现在主要的硬件描述语言有VHDL,Verilog两种,在本科时老师一般教VHDL,不过现在

Verilog用的人越来越多,其更容易上手(与C语言语法比较类似),也更灵活,现在的IC设计基本都用Verilog。像systemC,systemVerilog之类的应该还在萌芽阶段,以后可能会有较大发展。鉴于以上原因我选择了Verilog作为我学习的硬件描述语言。

其实有C语言的基础,学起Verilog的语言很简单,关键要有并行的概念,所有的module,assign,always都是并行的,这一点与软件语言有明显不同。这里推荐几本评价比较好的学习Verilog的书籍:

①、《verilog 数字系统设计教程》,这本书对于入门是一本很好的书,通俗易懂,让人很快上手,它里面的例子也不错。但本书对于资源优化方面的编程没有多少涉及到。

②、《设计与验证Verilog HDL》,这本书虽然比较薄,但是相当精辟,讲解的也很深入,很多概念看了这本书有种豁然开朗的感觉,呵呵。

学习Verilog其实不用看很多书,基本的语法部分大家都一样,关键是要自己会灵活应用,多做练习。

Verilog语言学了一段时间,感觉自己可以编点东西,希望自己编的程序在板子上运行看看结果,下面就介绍我学习的第二个阶段。

刚开始我拿了实验室一块CPLD的开发板做练习,熟悉QuartusII的各种功能,比如IP的调用,各种约束设置,时序分析,Logiclock设计方法等,不过做到后面发现CPLD的资源不太够(没有内嵌的RAM、不能用SignalTapII,LE太少等),而实验室没有FPGA开发板,所以就萌生了自己做FPGA开发板的意图,刚好Cadence我也学的差不多了,就花了几天时间主要研究了FPGA配置电路的设计,在板子上做了Jtag和AS下载口,在做了几个用户按键和LED,其他的口全部引出作为IO口,电路比较简单,板子焊好后一调就通了(心里那个爽啊...)。我选的FPGA是cycloneII系列的EP2C5,资源比以前的FPGA多了好几倍,还有PLL,内嵌的RAM,可以试试SignalTapII,用内嵌的逻辑分析仪测试引脚波形,对于FPGA的调试,逻辑分析仪是至关重要的。利用这块板子我完成了项目中的几个主要功能:RS232通信,指令译码,配置DDS,AD数据高速缓存,电子开关状态设置等,在实践中学习起来真的比平时快很多,用到什么学什么动力更大。这个时候我主要看的数据有这几本感觉比较好:

①、《Altera FPGA/CPLD 设计(基础篇)》:讲解一些基本的FPGA设计技术,以及QuartusII中各个工具的用法(IP,RTL,SignalProbe,SignalTapII,Timing Closure Floorplan,chip Editor等),对于入门非常好。

②、《Altera FPGA/CPLD 设计(高级篇)》:讲解了一些高级工具的应用,LogicLock,时序约束很分析,设计优化,也讲述了一些硬件编程的思想,作为提高用。

③、《FPGA设计指南--器件,工具和流程》:这本书看了他的目录忍不住就买了,这本书讲述了FPGA设计的各个方面,虽然每个方面都是点到为止,但能让你有个整体的概念,了解FPGA的所有设计功能,了解FPGA开发的整个流程。

④、在这里也推荐几个学习FPGA比较好的论坛

http://www.xiexiebang.com,不过很多人一看到英语就不想看,其实上面的英文很简单,很多时候不敢看是因为对自己没信心或心静不下来看。不过官方网站上资料很多,刚开始可能会觉得资料安排的有点乱,不方便查找,以后有时间我列个资料的链接目录,整理一下,方便大家查找。

到这里,自己最FPGA的学习有一段时间了,练习了很多实例,自己也编写了不少程序,也有了一些项目经验,算是对FPGA有些了解了。在不断的学习中发现FPGA不仅可以做逻辑设计,算法设计等,还能做嵌入式开发,altera先后开发了Nios,NiosII两款FPGA的嵌入式软核,并有配套的软件,刚开始看到这些我真是心中突然豁然开朗,学习真的是无止境,又一个全新的领域摆在我面前,我决定学习NiosII,要学就要学最好。

刚开始入门是很痛苦的,嵌入式设计需要从硬件到驱动到软件全部熟悉,硬件系统问题还不是很大(以前做过单片机,DSP等MCU),处理器的架构心里还有点数,对于驱动和软件工程,刚开始学习真的很头痛。NiosII应该还算比较新的内容(应该是2004年出的),国内的书籍不算很多,网上这方面的资料也比较零碎,所以我就开始将Altera网站上这方面的资料系统的看一边,这里推荐几本网站上的handbook:

①、Embedded Design Handbook

②、Nios II Processor Reference Handbook

③、Nios II Software Developer's Handbook

④、Quartus II Handbook, Volume 4: SOPC Builder

⑤、Quartus II Handbook, Volume 5: Embedded Peripherals

看完这些handbook,总算基本明白整个架构,软硬件设计方法,驱动的编写等,感觉自己可以编一些嵌入式的程序了,不过虽然前面做的那块ep2c5的板子支持NiosII系统,不过对于嵌入式设计来说还是显得单薄了一点,没有SDRAM,Flash这两个比较基本的模块,Ep2C5内嵌的RAM太小,程序写不大,而且每次总要绞尽脑汁优化程序代码大小,很多时候优化了后函数功能会受到限制,不利于初学者,也不利于调试。所以到这里我有产生了自己做一块Nios开发板的想法(直接买比较贵,自己做便宜,而且还能锻炼自己,一举两得),通过借鉴其他开发板,选择自己开发板上需要包含什么模块,确定各个模块使用什么芯片,阅读各个芯片的datasheet,画出原理图并做出PCB图,这块板子我选的是Ep2c8Q208,比上一块资源又将近多了一倍,板子上还有以下模块:SDRAM,Flash,EPCS4,RS232,USB,VGA,PS2,AD,DA,LCD等,满足了一般开发板的配置要求。板子回来以后调试了四五天,(flash工作了,LCD显示了,RS232通了,USB通了,AD,DA工作了,SDRAM正常了...),真是每天都有惊喜,每个模块都编写了NiosII软件测试程序,调试硬件的时候对软件的运行也更熟悉了。在这次调试的过程中真的学到了很多,为此专门写了好几页调试笔记,下次拿出来和大家一起分享。现在硬件平台有了,NiosII也了解的差不多了,终于可以自己编写一些规模大一点的程序了。

学FPGA的一点心得

从去年开始学FPGA,以前一直做DSP,但因为项目的需要,在一个应用中只有FPGA才能解决问题,所以硬着头皮上FPGA,又因为结项目的时间比较紧,所以主要以解决问题为目的,说真的,项目做下来写了四千多行的代码,达到了设计目标,但对FPGA学习还不够系统,也正进一步的学习中.因为我是单干,没有团队,遇到问题只能在网上找资料,其难度可想而知,幸好以前用过CPLD,有一点基础,用的编程语言是VHDL,感觉AHDL写一点小程序还可以,但做复杂程序就有点费力了(应该是我的AHDL没学好),所以在做FPGA程序时我选择了比较简单的verilog语言。

由于没人指导,所以买了一个简单的FPGA开发板,是Cyclone的,开发板就是好,送了较多学习资料,用了一个星期的时间,学习了NIOSII的基本应用,当然,我的需要就是知道如何在NIOS里控制一个信号的高低电平变化就够了,其它全是C语言的东西,主要是熟悉了Quartus的开发平台,并用NIOS程序把要实现的主要代码用C写了一遍,通过了,但速度上不去。有这些知识做铺垫后,就开始了项目的设计。

项目要求将外部高速数据(40MB/s)进行存盘,并可以将存盘的数据在适当的时候原路返回(速度不变)。所以在硬件的设计上FPGA选择了EP2C35F484C8N,外部有128M的SDRAM做为数据的缓冲。所以FPGA的主要程序集中在ATAHOST控制器(实现UDMA读写)、SDRAM控制器(大容量循环缓冲)上,当然还包括一些其它的控制,如实时时钟,USB2.0芯片控制,RS232的通信及相应的通信协

议。

硬件完成后,大部分的时间都在写程序,感觉verilog跟C差不多,就将原来写成的C代码翻译了一下,每写一段代码就测试一下。起初并不知道在Quartus里还有逻辑分析仪的功能,所以程序出了问题只能使劲的分析代码,猜想问题可能出在哪里,万不得已时才做一下仿真(后来看很多有做程序都先做仿真,仿真通过后再下载到目标板里运行测试,但到现在我的仿真关还没过),所以做得很累。我感到这样做下去到时间结点肯定结了不了项目,就找FPGA的QQ群向高手们请教经验,知道了可以Quartus的逻辑分析仪来观察信号,哈哈,爽了(感谢感谢)。后面的程序找问题就容易多了,按照ATA协议、SDRAM手册、及各外围芯片手册一步步写下去,当然其中也遇到了各种各样的问题,但很快得到解决。一直到项目结束,都是用逻辑分析仪来找问题,没做过仿真(所以现在仿真关还没过)。

今年又用FPGA做了一些项目。简单说一下体会吧,归结起来就三个字:做、想、问。书读千遍,不如做一遍;看别人做百次,不如自己做一次;就是要实践。实践的动力一方面来自兴趣,别一方面来自己压力,我个人觉得后者更重要。有需求会容易形成压力,也就是说最好能在实际的项目开发中锻炼,而不是为了学习而学习。在做的过程中要多想,多想想问题出现的原因,问题解决后要多问几个为什么,这也是经验积累的过程,最好要写项目日志,把问题及原因、解决的办法都写进去。还要多问,遇到问题经历了痛苦的思索后还得不到解决就要问了,问搜索引擎,问网友,问同学同行,一篇文章、朋友们的点拨都可能帮助自己快

速解决问题。

FPGA入门心得及系列资料

不知道为什么自己每次接受一个新事物,总要花上那么长的一段时间。每个东西,总要经过从一点都不了解,到有点了知道,到最后才想知道要来学学,但每次学习时也总是走马观花。可能真的受中国的教育思想束缚的太严重了吧。以前的人读书,好像也没有什么目标,只是知道上课要认真听,考试要考好。这样就可以了。也从来没想过,我学这个到底有什么用呢。

但是上了大学后,一切都改变了。我们的学习也不再是为了考试而考试了。尤其是像我们学电子,假如仅仅是为考试的话,那你的大学完全可以过得很轻松,整天睡觉,游戏,照样可以考高分。那样毕业了,你说你的大学学习是不是等于0。到头来还是什么也不是。所以当你进入大学,当你选择了电子,就决定了你从此要为之付出。不管将来怎样,只要你朝着自己的方向走,一定会成功的。

现在说说FPGA的学习吧,或许,很多人刚接触FPGA时,可能还在为到底什么是CPLD,什么时FPGA,我到底要学习哪门语言而苦恼,不知大家是不是这样,但是我曾经就是这样,也到网上去找过,最后也终于找到了答案。因为那时身边的人都还没学过。其实CPLD,FPGA最大的区别也就是FPGA的程序必须由配置芯片经过上电后,将程序写入芯片中,也就是FPGA的内部存储器是相当于内存一样,一掉电就没了。而CPLD是像单片机一样,程序是存储存在内部中的,一上电就可以跑了。二者的功能差不多,但是FPGA的资源比CPLD更加丰富。在CPLD上可以实现的功能,在FPGA上基本都可以实现的。所以也不必去想太多什么是FPGA,CPLD了,只要弄懂了二者的内部结构就可以了。至于学什么语言吗,首先要看你们在校老师上课是用什么语言,就先那个语言吧,我们学校老师是用VHDL语言的,所以一开始我也是先学VHDL语言,而且学习资料比较多,但是在网上看到,好像公司里面用的比较多的是Verilog HDL语言,为了能看懂一些资料,现在也在学Verilog HDL语言,学习中发现,要是学过C语言的人,会发现Verilog HDL好像更加好理解。

一旦你开始了学习FPGA,那就要坚持下去,因为语言这东西,要是不一下子把它强记住,过不了两天就又忘了,书本的东西,一定要越快消化越好,这样你看别人的程序时就不会有什么语言障碍了。之后就是编写程序,模仿别人的模块,仿真实验,这步很重要,要不你就不会发现FPGA功能的强大,你也不知道到底仿真的结果和实际是不是有差别。当你成功时,你一定会感到成功的喜悦。

当你基本的程序都看得懂时,有完整地编个程序,而且在硬件上实验过时,那么祝贺你入门了,之后的道路就是不断的实践,跟学习单片机一样,只有不断的学习,不断的做东西,你的编程能力才会提高。

以上仅仅为作者本人的一点观点,本人现在还是一个电子白菜,只是苦于自己学习电子找不到捷径,不想还有更多的人跟我一样,在电子的道路中不断摸索,不断徘徊。

看过一个高手对FPGA的认识,自己对FPGA未来的发展更是看好,鉴定了学好的决心,FPGA在电子开发工作中已经上升到数字系统核心处理器,尽快掌握FPGA开发技术显得非常迫切。总结了一下: 传统的开发方式:一半固定,硬件CPU是不可编程的,另一半灵活是可编程的软件

FPGA新开发形式:两个部分都是可编程了,FPGA,它代表的就是硬件的编程。这两部分都可编程的一个结合点就是FPGA上的软核。另外可以根据需要通过外部单片机把合适的应用bit流写入到FPGA内,从而完成根据功能需要变更硬件。硬件可重构!

使计算机的能力越来越强,方法一:通过提高工艺来提高工作频率;方法二:通过优化系统体系,并行!

新学习思想: FPGA设计有点象围棋:易学难精 带着问题学习是最有效率的

时序性能的调整提高是FPGA开发能力的标志

多看书,但要注意,书当做字典,不是所有地方都去看。

目前,在FPGA上有三种类型开发方法和应用方向:a、逻辑类应用 b、软核类应用 c、DSP类应用。逻辑类应用我们接触的最早,也是FPGA最初的应用领域,大的应用上,一些数字IC设计可以在FPGA做前期的功能验证,在通信领域,FPGA做信号的编解码等等,小的应用上我们做的最多的实际是CPLD,完成信号的变换控制等等。软核应用是前几年才兴起,现在热门的开发应用方法,在原本需要FPGA结合CPU的地方有成本和灵活性优势。

FPGA的DSP应用是非常有潜力的,性能优势非常明显。开发方法是用Matlab的simulink中嵌入厂商的开发工具包,算法验证在Matlab simulink工具下完成,在开发工具包的支持下生成HDL模块或者直接生成FPGA下载配置文件,这个方向是FPGA应用最有挑战能力领域。Mathworks公司不久前也推出了独立于FPGA厂商的Simulink HDL Coder工具,使的Matlab在数字系统设计领域迈出了坚实的一步,把Simulink 模型和Stateflow框图生成位真(Bit-Ture)、周期精确(Cycle-Accurate)、可综合的Verilog和VHDL代码,为Matlab simulink用户提供了通往FPGA设计实现的直接通道。

看过很多FPGA相关的书,其中内容重复的不少,要看就看经典的。这些是从众多书中挑出来自己认为不错的书,望初学者能节省时间,重点阅读:

《verilog 数字系统设计教程》::针对初学者学习Verilog HDL硬件描述语言,语言是基础,首先要能建立一个语言与硬件对应起来的观念,不能按照C语言的套路。打好基础很重要。

《Altera FPGA/CPLD 设计(基础篇)》:介绍FPGA的基本概念,和QuartusII中软件的基本使用,包括一些内部自带工具软件使用。还有仿真软件ModelSim。

《Altera FPGA/CPLD 设计(高级篇)》:讲解一些高级应用,涉及到FPGA开发,高级调试要用到的,比如时序约束,LogicLock等。

《Nios II软件架构解析》:对Nios软核的低层的东西,比如中断、复位,HAL(硬件抽象层)、外设驱动进行横向解析,对Nios II IDE中的使用设置,软件开发技巧等进行纵向解析。

《FPGA应用开发实战技巧精粹》:都是技巧,难得!

《NiosII嵌入式软核SOPC设计原理及应用》:(就是全面)Nios II体系,Avalon总线,Nios II外设,SOPC硬件系统开发,软件开发等进行讲解。

刚才开始接触逻辑设计很多人会觉得很简单:因为verilog的语法不多,半天就可以把书看完了。但是很快许多人就发现这个想法是错误的,他们经常埋怨综合器怎么和自己的想法差别这么大:它竟然连用for循环写的一个计数器都不认识!

相信上一段的经历大部分人都曾有,原因是做逻辑设计的思维和做软件的很不相同,我们需要从电路的角度去考虑问题。

在这个过程中首先要明白的是软件设计和逻辑设计的不同,并理解什么是硬件意识。

软件代码的执行是一个顺序的过程,编绎以后的机器码放在存储器里,等着CPU一条一条的取指并执行;因此软件设计中经常会带有顺序处理的思维。而逻辑设计则不同,我们设计的是数字电路,它是由很多很多的与非门及D触发器构成的,上电之后所有与非门和D触发器都同时工作,不会因为A触发器的代码描述在B触发器之前A触发器就是先工作,事实上,RTL级代码的代码先后顺序在综合成网表文件后这种顺序就消失了,取代的是基本逻辑电路之间的互联关系描述;因此逻辑设计需要的是一种并发的思维,我们也需要用并发的思维去考虑电路的设计。

当然,我们设计的电路功能一般都有先后顺序的关系,如果这种顺序不能通过代码的先后顺序来实现,那么要怎么完成这一功能呢?在逻辑设计中,我们所说的先后顺序都是基于时间轴来实现:它的承载体就是时序逻辑,也就是那些触发器。

硬件意识的东西网上谈论的已经很多,这里就不再多说了。

其次就是要熟悉基本电路的设计。

基本的电路不是很多,也就是D触发器、计数器、移位寄存器、状态机、多路选择器、译码器等几种,所有复杂的电路都可由这些基本的电路构成。高手水平高的体现并不是他能写出一些很奇特的电路,相反,水平高是体现在他们总能将复杂的电路用这些很朴素的基本电路去描述。甚至,你会发现他们的代码基本上是由if...else、case这些语句构成的,朴素的让你觉得奇怪。

我认为,初学者在入门的时候,对于基本电路的设计应该固定化、标准化,每种电路该用什么样的代码描述,应该要固定、统一,尽量少一些花哨的东西。说来这里我举个例子。

以前有几个朋友因为仿真有问题请我帮忙找问题。他们的代码写的很乱,出现了很多种稀奇古怪的电路,一看头都大了,只好建议他们按照标准的电路重新写下代码。结果过了半天,他们就和我说问题不见了。

所以,高手们喜欢用简单的代码是有道理的,电路的标准化和规范化可以减少许多稀奇古怪的问题,问题少了他们也就能在别人加班的时候回家多睡回觉,呵呵。总之,简单的、朴素的就是最好的。

最后是代码的规范化。代码规范主要是代码书写、命名等规范。比如不能用TAB键空格、低电平有效信号命名时加_n(如rst_n等)、每行只能写一行代码等。这些东西网上也很多,这里只是强烈建议大家要严格遵守,像华为等公司如果代码不规范的话肯定是要打回去重写的。入门

结合一两个小项目把上面所说的事情都做好后,差不多就可以进入入门的阶段了(要求稍微严格了一点点,呵呵)。

入门阶段要学的有:设计时序;理解约束的原理及如何加约束。

先谈谈设计时序。

设计时序是进行逻辑设计的基本要求:时序是设计出来的,不是仿出来的,更不是凑出来的。

很多人在做逻辑设计时喜欢一上来就狂写代码,写到一半后发现信号间的时序出问题了,只好推倒重来;好不容易反复了几次之后,通过仿真软件看了下,差不多要对了,于是再凑一下时序,竟然对了!但这个做法除了设计周期长外,代码的质量也难以保证,往往存在很多冗余的逻辑,甚至有一些隐藏着较深的bug。

为什么会出现上面的问题呢?因为我们设计的是数字逻辑,而信号之间的逻辑关系往往是比较复杂的,在内部信号很多的情况下,仅凭拍下脑袋就写代码肯定是不能理清楚它们之前的复杂的关系,所以出错在所难免。

正确的做法是我们要先对整个设计有一些规划--时时刻刻都要有设计时序的思想。设计时序最重要的是做好方案,这里说的方案绝不是只是摆几个框图在那里。我们在做设计的时候需要做总体设计方案、逻辑详细设计方案。这两种方案包括了很多东西,逻辑总体方案主要是一级模块的划分及接口时序的定义,而逻辑详细方案就是代码的文字及图形描述!

对于入门者来说,接触的比较多的是逻辑详细设计方案。在这一级别的方案中,我们是要求的是至少要做到模块内部所有关键信号的时序都要先设计好,这里讲的设计时序主要就是画波形图,在一个操作周期内每个信号在每一个时钟周期该是什么样子就画成什么样子。

下载用FPGA设计MP3个人数字播放机word格式文档
下载用FPGA设计MP3个人数字播放机.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    数字锁相环的FPGA设计与实现-课设

    1.设计要求 利用MAX PLUSII软件工具,设计一个全数字锁相环路,通过它从19.2k的信号中提取同步信号。本地源时钟为11.0592MHz。 要求实现的功能: a当远端信号(方波)的占空比分别为1......

    用数字说话

    用数据说话、为发展服务 ——海原县2008年统计工作纪实 (篇 头) 切入画面:海原马铃署、小茴香、设施农业生产场面、新区建设、老城区改造及其它投资建设场面、工业企业生产场面......

    EDA实验指导 基于FPGA的数字电子钟设计(写写帮整理)

    FPGA实验指导及记录 实验四 基于FPGA的数字电子钟设计 1. 实验目的: (1) 掌握FPGA开发软件Quartus II在一个综合系统设计中的应用; (2) 掌握数字电子钟的基本工作原理。 2. 实验......

    FPGA抢答器设计报告

    Vb开办上海电力学院 课程设计报告 信息工程系 抢答器设计报告 一、 设计目的: 本课程的授课对象是电子科学与技术专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相......

    用verilog 进行FPGA设计阶段总结

    用verilog 进行FPGA设计第一阶段总结 2007-08-23 21:34 实习期间,老师叫我们做他的大课题中的一个小部分。这个部分主要是将A/D采集的数字信号利用一个函数进行插值恢复,以便后面......

    基于FPGA的数字频率计设计报告

    电子技术综合试验实验报告 班级:测控一班学号:2907101002 姓名:李大帅 指导老师:李颖 1 基于FPGA的数字频率计设计报告 一、 系统整体设计 设计要求: 1、被测输入信号:方......

    基于FPGA的交通灯控制器设计

    数字系统课程设计 基于FPGA的交通控制灯设计 姓名:学号:班级: 摘要 随着社会的发展,城市规模的不断扩大,城市交通成为制约城市发展的一大因素。人口和汽车日益增长,市区交......

    基于FPGA的红外遥控设计

    题目:红外遥控 学院:电子工程学院 专业:电子信息工程 学 号:200812601680 姓名:**** 指导教师:**** 2011 年 5月 23日 第一部分设计题目及要求 本次课程设计的题目及要求如下......