数控文前言江苏

本科毕业论文(设计)

题目:出租车计费器的仿真及NiosII的设计

学院:自动化工程学院

专业:电子信息科学与技术

班级:2004级2班

姓名:逄金波

指导教师:章平

2016年6月8日

出租车计费器的仿真及NiosII的设计

TheSimulationofTaxiFeeCalculator

andDesignofNiosII 摘 要

本文描述了QuartusII进行数字系统设计的一般方法,介绍了ROM的及数据的填充.本文在参考现有VHDL数字系统设计的大量文献后,进行了出租车计费器,转向灯及音乐盒的系统集成.利用可编程逻辑阵列FPGA实现了出租车计费器系统,同时实现了转向灯的模拟,将乐曲存进ROM,当司机劳累的时候可以欣赏一曲音乐.方案利用QuartusⅡ开发工具在ALTERACyclone系列EP1C6器件上进行了实现.本文还对SoPC的设计进行了探讨,设计了NiosII系统,并基于该系统对循环点亮LED灯的程序进行了仿真.

关 键 词出租车计费器音乐盒转向灯场可编程门阵列片上可编程系统

Abstract

Thisarticledescribesthegeneralmeanstodesigndigitalsystem,illustratingtheuseofSingalTap.Aftermuchreference,theauthordidthesystemintegrationfortaxifeecalculator,lightorturnsandmusicbooks.ThetaxifeecalculatorisrealizedusingFPGAAlso,lightorturnsissimulated,withamusicROMforstoringthefamouelody"liangzhu".Whenthetaxidriverwasexhausted,he/shecanlistentothemusicforfun.QuartusIIdevelopmenttoolwasusedinthisissueandAlteraCycloneserialdeviceswasusedtorealizethewholesystem.TheauthoralsoexplorethedesignofSoPCanddesignedasystemofNiosII.TheprogramoflightingseveralLEDsissimulatedbasedinthissystem.

KeywordsTaxiFeeCalculatorMusicBoxLightorTurnsFPGASoPC 目录

前言1

第1章设计思路及原理2

1.1研究意义2

1.2总体设计任务2

1.3设计思路及原理2

1.3.1出租车计费器总体框图2

1.3.2NiosII系统设计3

第2章出租车计费器及音乐盒设计4

2.1总体设计4

2.2计费器模块5

2.2.1模块JIFEI5

2.2.2模块X6

2.3转向灯模块9

2.3.1模块KONG9

2.3.2模块LFTA10

2.3.3模块RITA11

2.3.4误按键提示模块SPK12

2.4音乐盒模块12

2.4.1乐曲演奏顶层设计13

2.4.2NoteTabs模块14

2.4.3模块ToneTaba14

2.4.4Speakera模块15

2.4.5IP核MegacoreROM的16

第3章NiosII硬件设计与配置18

3.1设计准备18

3.1.1选定目标器件18

3.1.2开始建立NiosII嵌入式系统19

3.2加入组件20

3.2.1加入NiosIICPUCore20

3.2.2加入JTAGUART21

3.2.3加入定时器Timer22

3.2.4加入输入键I/O口23

3.2.5加入8个发光管I/O口24

3.2.6加入2个7段数码管I/O输出口24

3.2.7加入Avalon三态总线桥24

3.2.8加入外部Flash25

3.2.9加入系统ID组件26

3.2.10加入EPCSSerialFlashController组件26

3.2.11加入外部SRAM组件27

3.3NiosII系统生成前设置28

3.3.1地址自动分配设置28

3.3.2复位地址和程序运行区域设置28

3.3.3系统文件生成29

3.4NiosII硬件系统生成30

3.4.1加入原理图模块30

3.4.2编译31

3.5NiosII硬件配置32

3.5.1向FPGA下载配置文件32

第4章NiosIIIDE软件设计与调试33

4.1NiosIIIDE中的C程序设计33

4.1.1进入集成开发环境IDE33

4.1.2建立C软件开发工程33

4.2NiosIIIDE软件编译与运行35

4.2.1编译运行C程序35

4.2.2观察运行结果36

结束语37

谢辞38

框图

具体设计目标为:开始时,按下启动键,车费显示数码管显示"0700",表示起步价7.00元,同时,里程显示数码管显示不断线性累加的数据.在这里,用时钟计数器来计算里程数:正常车速下,每来两个时钟,里程计数数加1,加速状态下,每来一个时钟,里程计数数加1(假设出租车只设有两种速度,正常车速和加速行驶车速,加速时出租车匀速运动).当里程累加到3.00公里时,车费每公里加2.2元,当车费累加到20.00元时,车费每公里加3.3元(假定出租车计费标准是这样的).

按下暂停键,里程数,车费数锁定,当再次按下暂停键,使暂停键无效时,重新计费.按下停止键,里程数,车费数归零.此时系统复位,使停止键无效,则系统重新运作起来.按下和弹起加速键,选择正常状态和加速状态.

使用两个按键分别控制左转向灯和右转向灯.按下左转向按键时,左边三个LED灯做流水灯,依次循环亮起.同理,按下右转向按键时,右边三个LED灯做流水灯,依次循环亮起.同时按下左右两个转向按键时,警示LED灯亮起,提示出错.

当按下播放键时,小扬声器传出动人的旋律——"梁祝",弹起播放键时,暂停播放.

1.3.2NiosII系统设计

设计NiosII时,利用SOPCBuilder进行,流程如图1.2示.

NiosII系统设计,要进行两步工作:先一个NiosII软核,再基于该软核设计一个C程序,在该内核上进行调试.

第2章出租车计费器及音乐盒设计

2.1总体设计

在QuartusII中,利用原理图方法,设计一个出租车计费器及音乐盒系统,分为计费器模块,转向灯模块和音乐盒模块,总体设计图如图2.1示.QuaartusII中,原理图方法体现出了系统电路连接的直观性,本设计采用从底向下的设计方法.本系统的输入部分为计费器的四个按键:启动键START,停止键STOP,暂停键PAUSU,停止键STOP,音乐盒的播放按键PLAY,转向灯的两个按键:左转向键LEFT,右转向键RIGHT[5].同时,外部时钟DACLK选16或64Hz,DISPLAY_CLK选1024Hz,clk_12M选接12MHz的时钟,CLK8Hz接8Hz.X模块输出部分aqian,abai,ashi,age对应接四个4-7译码器,表示车费,单位为0.01元,bqian,bbai,bshi,bge4-7译码器,代表里程.REAR_L输出接6个LED灯,SPK接报错LED灯,songer模块输出接SPK扬声器,high接LED,点亮时表示音调为高.

本设计的核心为JIFEI模块,X模块的作用是将里程数和车费译码.

图2.1计费器总体设计图

2.2计费器模块

2.2.1模块JIFEI

计费模块如图2.2示,JIFEI模块起到计数器的作用,根据启动键START,停止键STOP,暂停键PAUSU,停止键STOP的按下与否,进行里程数和车费数的累加,将之分别送CHEFEI[12..0]和LUC[12..0]输出.

输入端口START,STOP,PAUSE,JS分别为汽车启动,停止,暂停,加速按键.操作方法是:先使STOP键置高电平,再按下START键置高电平,再按下PAUSE键暂停,按加速键JS,低电平加速,高电平正常速度.

效果为:STOP键置高电平,按下START键置高电平后,数码管8-5显示"0700"数字,表示起步价,按下PAUSE键置高电平,不使能暂停信号,数码管4-1开始显示累加的里程数.当跑完3km后,数码管8-5开始显示累加的车费.此时,按下PAUSE键置低电平,数码管8-1停止变化,直到PAUSE键置高电平.任何时刻按下STOP键,则数码管8-1全清零.

生成该symbol的VHDL程序为:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

USEIEEE.STD_LOGIC_UNSIGNED.ALL,

ENTITYJIFEIIS

PORT(CLK,START,STOP,PAUSE,JS:INSTD_LOGIC,

CHEFEI,LUC:OUTINTEGERRANGE0TO8000),--13位二进制数

ENDJIFEI,

ARCHITECTURERTLOFJIFEIIS

BEGIN

PROCESS(CLK,START,STOP,PAUSE,JS)

VARIABLEA,B:STD_LOGIC,

VARIABLEAA:INTEGERRANGE0TO100,

VARIABLECHF,LC:INTEGERRANGE0TO8000,

VARIABLENUM:INTEGERRANGE0TO9,

BEGIN

IF(CLK'EVENTANDCLK等于'1')THEN

IF(STOP等于'0')THEN

CHF:等于0,

NUM:等于0,

B:等于'1',

AA:等于0,

LC:等于0,

ELSIF(START等于'0')THEN

B:等于'0',

CHF:等于700,

LC:等于0,

ELSIF(START等于'1'ANDJS等于'1'ANDPAUSE等于'1')THEN

IF(B等于'0')THEN

NUM:等于NUM+1,

ENDIF,

IF(NUM等于9)THEN

LC:等于LC+5,

NUM:等于0,

AA:等于AA+5,

ENDIF,

ELSIF(START等于'1'ANDJS等于'0'ANDPAUSE等于'1')THEN

LC:等于LC+1,

AA:等于AA+1,

ENDIF,

IF(AA>,等于100)THEN

A:等于'1',

AA:等于0,

ELSE

A:等于'0',

ENDIF,

IF(LC<,300)THEN

NULL,

ELSIF(CHF<,2000ANDA等于'1')THEN

CHF:等于CHF+220,

ELSIF(CHF>,等于2000ANDA等于'1')THEN

CHF:等于CHF+330,

ENDIF,

ENDIF,

CHEFEI<,等于CHF,

LUC<,等于LC,

ENDPROCESS,

ENDRTL,

2.2.2模块X

该模块把车费和路程分别转化为4位十进制数,这八个四位十进制数直接接到八个带有4-7译码器的数码管上,显示出里程和车费.

具体实现是,模块X内定义一个变量COMB1,将COMB1和ASCORE不断比较,当两者不等时,COMB1A,COMB1B,COMB1C,COMB1D作为四位十进制数进行累加,记录比较次数,当两者相等时,COMB1A,COMB1B,COMB1C和COMB1D分别记录下了ASCORE的个位,十位,百位和千位.本质就是将JIFEI模块计算的车费做除十处理,提取出来车费的个位,十位,百位和千位.同理,对BSCORE的处理原理相同.daclk的频率要比clk的频率高得多,这样才保证将ASCORE,BSCORE准确及时的输出八个四位十进制数,如图2.3示.

图2.3转换模块X

生成该symbol的VHDL程序为:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

USEIEEE.STD_LOGIC_UNSIGNED.ALL,

ENTITYXIS

PORT(DACLK:INSTD_LOGIC,

ASCORE,BSCORE:ININTEGERRANGE0TO8000,

AGE,ASHI,ABAI,AQIAN,BGE,BSHI,BBAI,BQIAN:OUTSTD_LOGIC_VECTOR(3DOWNTO0)),

ENDX,

ARCHITECTURERTLOFXIS

BEGIN

PROCESS(DACLK,ASCORE)

VARIABLECOMB1:INTEGERRANGE0TO8000,

VARIABLECOMB1A,COMB1B,COMB1C,COMB1D:STD_LOGIC_VECTOR(3DOWNTO0),

BEGIN

IF(DACLK'EVENTANDDACLK等于'1')THEN

IF(COMB1<,ASCORE)THEN

IF(COMB1A等于9ANDCOMB1B等于9ANDCOMB1C等于9)THEN

COMB1A:等于"0000",

COMB1B:等于"0000",

COMB1C:等于"0000",

COMB1D:等于COMB1D+1,

COMB1:等于COMB1+1,

ELSIF(COMB1A等于9ANDCOMB1B等于9)THEN

COMB1A:等于"0000",

COMB1B:等于"0000",

COMB1:等于COMB1+1,

COMB1C:等于COMB1C+1,

ELSIF(COMB1A等于9)THEN

COMB1A:等于"0000",

COMB1B:等于COMB1B+1,

COMB1:等于COMB1+1,

ELSE

COMB1A:等于COMB1A+1,

COMB1:等于COMB1+1,

ENDIF,

ELSE

ASHI<,等于COMB1B,

AGE<,等于COMB1A,

ABAI<,等于COMB1C,

AQIAN<,等于COMB1D,

COMB1:等于0,

COMB1A:等于"0000",

COMB1B:等于"0000",

COMB1C:等于"0000",

COMB1D:等于"0000",

ENDIF,

ENDIF,

ENDPROCESS,

PROCESS(DACLK,BSCORE)

VARIABLECOMB2:INTEGERRANGE0TO8000,

VARIABLECOMB2A,COMB2B,COMB2C,COMB2D:STD_LOGIC_VECTOR(3DOWNTO0),

BEGIN

IF(DACLK 'EVENTANDDACLK等于'1')THEN

IF(COMB2<,BSCORE)THEN

IF(COMB2A等于9ANDCOMB2B等于9ANDCOMB2C等于9)THEN

COMB2A:等于"0000",

COMB2B:等于"0000",

COMB2C:等于"0000",

COMB2D:等于COMB2D+1,

COMB2:等于COMB2+1,

ELSIF(COMB2A等于9ANDCOMB2B等于9)THEN

COMB2A:等于"0000",

COMB2B:等于"0000",

COMB2C:等于COMB2C+1,

ELSIF(COMB2A等于9)THEN

COMB2A:等于"0000",

COMB2B:等于COMB2B+1,

COMB2:等于COMB2+1,

ELSE

COMB2A:等于COMB2A+1,

COMB2:等于COMB2+1,

ENDIF,

ELSE

BSHI<,等于COMB2B,

BGE<,等于COMB2A,

BBAI<,等于COMB2C,

BQIAN<,等于COMB2D,

COMB2:等于0,

COMB2A:等于"0000",

COMB2B:等于"0000",

COMB2C:等于"0000",

COMB2D:等于"0000",

ENDIF,

ENDIF,

ENDPROCESS,

ENDRTL,

2.3转向灯模块

转向灯模块REAL_L的功能为,用6只LED发光二极管模拟6盏汽车尾灯(汽车尾部左,右各3盏),用两个开关作为转弯控制信号(一个开关控制右转弯,另一个控制左转弯),生成的symbol,如图2.4示.

图2.4转向灯模块REAL_L

本例采用层次化设计方法,将real_l尾灯系统例化为symbol,加入出租车系统.

其底层设计如图2.5示.

图2.5转向灯模块底层设计图

2.3.1模块KONG

模块KONG如图2.6示.此模块为整个程序的控制模块.当左转时,LFT信号有效,当右转时,RIT信号有效.

图2.6控制模块KONG

生成该symbol的VHDL源代码为:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

ENTITYKONGIS

PORT(LEFT,RIGHT:INSTD_LOGIC,

LFT,RIT,LR:OUTSTD_LOGIC),

ENDKONG,

ARCHITECTUREKONG_ARCOFKONGIS

BEGIN

PROCESS(LEFT,RIGHT)

VARIABLEA:STD_LOGIC_VECTOR(1DOWNTO0),

BEGIN

A:等于LEFT&,RIGHT,

CASEAIS

WHEN"00"等于>,LFT<,等于'0',

RIT<,等于'0',

LR<,等于'0',

WHEN"01"等于>,LFT<,等于'0',

RIT<,等于'1',

LR<,等于'0',

WHEN"10"等于>,LFT<,等于'1',

RIT<,等于'0',

LR<,等于'0',

WHENOTHERS等于>,LFT<,等于'1',

RIT<,等于'1',

LR<,等于'1',

ENDCASE,

ENDPROCESS,

ENDKONG_ARC,

2.3.2模块LFTA

模块LFTA如图2.7所示.该模块的功能为当左转时控制左边的三盏灯,当左右转信号都有效时,输出为全"1".

图2.7左转向控制块

生成该模块的VHDL源代码为:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

ENTITYLFTAIS

PORT(EN,CLK,LR:INSTD_LOGIC,

L2,L1,L0:OUTSTD_LOGIC),

ENDLFTA,

ARCHITECTURELFT_ARCOFLFTAIS

BEGIN

PROCESS(CLK,EN,LR)

VARIABLETMP:STD_LOGIC_VECTOR(2DOWNTO0),

BEGIN

IFLR等于'1'THEN

TMP:等于"111",

ELSIFEN等于'0'THEN

TMP:等于"000",

ELSIFCLK'EVENTANDCLK等于'1'THEN

IFTMP等于"000"THEN

TMP:等于"001",

ELSE

TMP:等于TMP(1DOWNTO0)&,'0',

ENDIF,

ENDIF,

L2<,等于TMP(2),

L1<,等于TMP(1),

L0<,等于TMP(0),

ENDPROCESS,

ENDLFT_ARC,

2.3.3模块RITA

此模块功能为控制右边的3盏灯,与模块LFTA类似,如图2.8示.

图2.8右转向控制块

生成该模块的VHDL源程序为:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

ENTITYRITAIS

PORT(EN,CLK,LR:INSTD_LOGIC,

R2,R1,R0:OUTSTD_LOGIC),

ENDRITA,

ARCHITECTURERIT_ARCOFRITAIS

BEGIN

PROCESS(CLK,EN,LR)

VARIABLETMP:STD_LOGIC_VECTOR(2DOWNTO0),

BEGIN

IFLR等于'1'THEN

TMP:等于"111",

ELSIFEN等于'0'THEN

TMP:等于"000",

ELSIFCLK'EVENTANDCLK等于'1'THEN

IFTMP等于"000"THEN

TMP:等于"100",

ELSE

TMP:等于'0'&,TMP(2DOWNTO1),

ENDIF,

ENDIF,

R2<,等于TMP(2),

R1<,等于TMP(1),

R0<,等于TMP(0),

ENDPROCESS,

ENDRIT_ARC,

2.3.4误按键提示模块SPK

该模块如图2.9所示.当误同时按下左转向键和右转向键,该模块以时钟daclk的频率周期性的发出啸声.当添加了SONGER模块后,由于占用了spk,所以,该输出接到一个灯上,用闪烁来发出警示,代表同时按下两个转向键.

图2.9误按键提示模块

生成该symbol的VHDL代码为:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

ENTITYSPKIS

PORT(LC,IN1:INSTD_LOGIC,

OUT1:OUTSTD_LOGIC),

ENDENTITYSPK,

ARCHITECTUREONEOFSPKIS

BEGIN

PROCESS(LC,IN1)

BEGIN

IFLC等于'1'THENOUT1<,等于IN1,

ELSEOUT1<,等于'0',

ENDIF,

ENDPROCESS,

ENDONE,

2.4音乐盒模块

该模块实质上是一个设计用数控分频器设计的硬件乐曲演奏电路[6].本系统有三个模块构成,如图2.10示为顶层设计图,其内部有三个功能模块:TONGTABA.VHD,NOTETAB.VHD,SSPEERA.VHD.

本模块原理为:组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能够连续演奏的两个基本要素.Songer模块中的U1类似于弹琴人的手指,U2类似于琴键,U3类似与琴弦或音调发生器.

图2.10乐曲演奏模块

2.4.1乐曲演奏顶层设计

顶层用VHDL编写,三个底层文件用端口映射的关系来定义模块的连接.

Songer模块VHDL源代码如下:

LIBRARYIEEE,--硬件演奏电路顶层设计

USEIEEE.STD_LOGIC_1164.ALL,

ENTITYSongerIS

PORT(CLK12MHZ:INSTD_LOGIC,--音调频率信号

CLK8HZ:INSTD_LOGIC,--节拍频率信号

CODE1:OUTSTD_LOGIC_VECTOR(3DOWNTO0),--简谱码输出显示

HIGH1:OUTSTD_LOGIC,--高8度指示

PLAY:INSTD_LOGIC,--enabletoplaythemusicliangzhu,

SPKOUT:OUTSTD_LOGIC),--声音输出

END,

ARCHITECTUREoneOFSongerIS

COMPONENTNoteTabs

PORT(clk:INSTD_LOGIC,

enable:INSTD_LOGIC,--08521

ToneIndex:OUTSTD_LOGIC_VECTOR(3DOWNTO0)),

ENDCOMPONENT,

COMPONENTToneTaba

PORT(Index:INSTD_LOGIC_VECTOR(3DOWNTO0),

CODE:OUTSTD_LOGIC_VECTOR(3DOWNTO0),

HIGH:OUTSTD_LOGIC,

Tone:OUTSTD_LOGIC_VECTOR(10DOWNTO0)),


ENDCOMPONENT,

COMPONENTSpeakera

PORT(clk:INSTD_LOGIC,

ENABLE:INSTD_LOGIC,--2016,5,21

Tone:INSTD_LOGIC_VECTOR(10DOWNTO0),

SpkS:OUTSTD_LOGIC),

ENDCOMPONENT,

SIGNALTone:STD_LOGIC_VECTOR(10DOWNTO0),

SIGNALToneIndex:STD_LOGIC_VECTOR(3DOWNTO0),

BEGIN

u1:NoteTabsPORTMAP(clk等于>,CLK8 HZ,ENABLE等于>,PLAY,ToneIndex等于>,ToneIndex),

u2:ToneTabaPORTMAP(Index等于>,ToneIndex,Tone等于>,Tone,CODE等于>,CODE1,HIGH等于>,HIGH1),

u3:SpeakeraPORTMAP(clk等于>,CLK12MHZ,Tone等于>,Tone,ENABLE等于>,PLAY,SpkS等于>,SPKOUT),

END,

2.4.2NoteTabs模块

音符的频率从该模块获得,这是一个数控分频器.内设一个8位二进制计数器,作为音符数据ROM的地址发生器.这个计数器频率选4Hz,即每个计数值停留时间为0.25秒,恰为全音符设为1秒时,四四拍的4分音符持续时间.随着NoteTabs的计数器按4Hz的速率作加法计数时,即随地址增加时,"梁祝"乐曲自然演奏起来了[10].

NoteTabs模块的VHDL源程序为:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

USEIEEE.STD_LOGIC_UNSIGNED.ALL,

ENTITYNoteTabsIS

PORT(clk:INSTD_LOGIC,

enable:INSTD_LOGIC,--08521

ToneIndex:OUTSTD_LOGIC_VECTOR(3DOWNTO0)),

END,

ARCHITECTUREoneOFNoteTabsIS

COMPONENTMUSIC--音符数据ROM

PORT(address:INSTD_LOGIC_VECTOR(7DOWNTO0),

clock:INSTD_LOGIC,

clken:INSTD_LOGIC,--2016,MAY21

q:OUTSTD_LOGIC_VECTOR(3DOWNTO0)),

ENDCOMPONENT,

SIGNALCounter:STD_LOGIC_VECTOR(7DOWNTO0),

BEGIN

CNT8:PROCESS(clk,Counter)

BEGIN

IFCounter等于138THENCounter<,等于"00000000",

ELSIF(clk'EVENTANDclk等于'1')THENCounter<,等于Counter+1,ENDIF,

ENDPROCESS,

u1:MUSICPORTMAP(address等于>,Counter,clken等于>,enable,q等于>,ToneIndex,clock等于>,clk),

END,

2.4.3模块ToneTaba

该模块的功能是为Speakera提供决定所发音符的分频预置数,此数在Speakera输入口停留的时间即为此音符的节拍值[5].模块ToneTaba是乐曲简谱码对应的分频预置数查表电路,其中设置了"梁祝"乐曲全部音符所对应的分频预置数,共13个,每一音符的停留时间由ToneTaba的clk决定.这13个值输出由Index[3..0]表示.

ToneTaba的VHDL源代码为:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

ENTITYToneTabaIS

PORT(Index:INSTD_LOGIC_VECTOR(3DOWNTO0),

CODE:OUTSTD_LOGIC_VECTOR(3DOWNTO0),

HIGH:OUTSTD_LOGIC,

Tone:OUTSTD_LOGIC_VECTOR(10DOWNTO0)),

END,

ARCHITECTUREoneOFToneTabaIS

BEGIN

Search:PROCESS(Index)

BEGIN

CASEIndexIS--译码电路,查表方式,控制音调的预置数

WHEN"0000"等于>,Tone<,等于"11111111111",CODE<,等于"0000",HIGH<,等于'0',--2047

WHEN"0001"等于>,Tone<,等于"01100000101",CODE<,等于"0001",HIGH<,等于'0',--773,

WHEN"0010"等于>,Tone<,等于"01110010000",CODE<,等于"0010",HIGH<,等于'0',--912,

WHEN"0011"等于>,Tone<,等于"10000001100",CODE<,等于"0011",HIGH<,等于'0',--1036,

WHEN"0101"等于>,Tone<,等于"10010101101",CODE<,等于"0101",HIGH<,等于'0',--1197,

WHEN"0110"等于>,Tone<,等于"10100001010",CODE<,等于"0110",HIGH<,等于'0',--1290,

WHEN"0111"等于>,Tone<,等于"10101011100",CODE<,等于"0111",HIGH<,等于'0',--1372,

WHEN"1000"等于>,Tone<,等于"10110000010",CODE<,等于"0001",HIGH<,等于'1',--1410,

WHEN"1001"等于>,Tone<,等于"10111001000",CODE<,等于"0010",HIGH<,等于'1',--1480,

WHEN"1010"等于>,Tone<,等于"11000000110",CODE<,等于"0011",HIGH<,等于'1',--1542,

WHEN"1100"等于>,Tone<,等于"11001010110",CODE<,等于"0101",HIGH<,等于'1',--1622,

WHEN"1101"等于>,Tone<,等于"11010000100",CODE<,等于"0110",HIGH<,等于'1',--1668,

WHEN"1111"等于>,Tone<,等于"11011000000",CODE<,等于"0001",HIGH<,等于'1',--1728,

WHENOTHERS等于>,NULL,

ENDCASE,

ENDPROCESS,

END,

2.4.4Speakera模块

音符的频率可由Speakera获得,这是一个数控分频器.有其clk端输入一具有较高频率的信号,通过Speakera分频后,由SPKOUT输出,由于直接从数控分频器的输出信号是脉宽极窄的脉冲式信号,为了有利于驱动扬声器,另加一个D触发器以均衡其占空比,这时频率为原来的一半.

SPKOUT的输出频率将决定每个音符的音调,这样,分频计数器的预置值Tone[10..0]与SPKOUT的输出频率有了对应关系.

其VHDL源代码如下:

LIBRARYIEEE,

USEIEEE.STD_LOGIC_1164.ALL,

USEIEEE.STD_LOGIC_UNSIGNED.ALL,

ENTITYSpeakeraIS

PORT(clk:INSTD_LOGIC,

Tone:INSTD_LOGIC_VECTOR(10DOWNTO0),

ENABLE:INSTD_LOGIC,--2016,5,21,选通信号,高电平时,音乐播

--低电平时,暂停.

SpkS:OUTSTD_LOGIC),

END,

ARCHITECTUREoneOFSpeakeraIS

SIGNALPreCLK,FullSpkS:STD_LOGIC,

BEGIN

DivideCLK:PROCESS(clk)

VARIABLECount4:STD_LOGIC_VECTOR(3DOWNTO0),

BEGIN

PreCLK<,等于'0',--将CLK进行16分频,PreCLK为CLK的16分频

IFCount4>,11THENPreCLK<,等于'1',Count4:等于"0000",

ELSIFclk'EVENTANDclk等于'1'THENCount4:等于Count4+1,

ENDIF,

ENDPROCESS,

GenSpkS:PROCESS(PreCLK,Tone)--11位可预置计数器

VARIABLECount11:STD_LOGIC_VECTOR(10DOWNTO0),

BEGIN

IFPreCLK'EVENTANDPreCLK等于'1'THEN

IFCount11等于16#7FF#THENCo unt11:等于Tone,FullSpkS<,等于'1',

ELSECount11:等于Count11+1,FullSpkS<,等于'0',ENDIF,

ENDIF,

ENDPROCESS,

DelaySpkS:PROCESS(FullSpkS,ENABLE)--将输出再2分频,展宽脉冲,使扬声器有足够功率发音

VARIABLECount2:STD_LOGIC,

BEGIN

IFENABLE等于'0'THENSpkS<,等于'0',

ELSIFFullSpkS'EVENTANDFullSpkS等于'1'THENCount2:等于NOTCount2,

IFCount2等于'1'THENSpkS<,等于'1',

ELSESpkS<,等于'0',ENDIF,

ENDIF,

ENDPROCESS,

END,

2.4.5IP核MegacoreROM的

在QuartusII界面下,单击Tools菜单下的MegaWizardPlug-InManager,在弹出的对话框中按默认选择CreataNew..,单击Next.选择MemoryComplier中的ROM:1-PORT,在右边填入要保存的路径和名称[7].如E:\pang\TAXI\TAXI\music.Vhd.如图2.11示.

图2.11ROM的界面

依次选中所要显示的项,最后,单击Finish,完成操作.

音符数据表LIANGZHU.MIF的制作方法,按以下步骤:打开QuartusII软件界面,单击FILENEWOTHERemoryInitializationFile,在弹出的对话框填入字长和每个字的宽度.效果如图2.12示.

图2.12音符数据表的创建与填充

第3章NiosII硬件设计与配置

本部分通过一个片上可编程系统(SOPC)的,设计了一个NiosII软核,并下载到试验箱上,为C程序的调试提供平台.

3.1设计准备

启动QuartusII7.1,利用菜单选择File等于>,NewProjectWizard,单击Next,按提示输入工程存放路径,工程名,设计顶层文件名,如图3.1示.单击Finish完成.

图3.1新建工程Nios32

3.1.1选定目标器件

选择器件为Family选Cyclone,Availabledevice选EP1CQ240C8,如图3.2示,单击OK.

图3.2确定配置器件EP1C6

3.1.2开始建立NiosII嵌入式系统

由选择QuartusII的菜单Tools等于>,SOPCBuilder,即弹出一个如图3.3的窗口,在窗口中键如系统名,如:Nios2,并选择目标文件的硬件描述语言表达方式,Verilog或VHDL.本例中选择VHDL,点击OK.此后将弹出空白的SOPCbuilder组件窗[9].

图3.3启动SoPCBuilder,新建系统Nios2

3.2加入组件

3.2.1加入NiosIICPUCore

首先是从左边栏中选择加入CPU核NiosIIProcessor.选择SOPCBuilder的组件选择栏中的"SystemComponents"→"NiosIIProcessoror",点击鼠标右键,选择"AddNewNiosIIProcessor等",打开添加NiosII对话框(图3.4).由图3.4可见,NiosIICPU核有4种结构可以选择,有不同的配置,功能和资源耗用情况,在此点击选择NiosII/s,再点击Next,进入窗口Caches选择窗,确认设定instructioncachesize为4kbytes,再点击JTAGDebugModule栏,选择SelecttheJTAGTargetConnectionDownloadLevel3(图3.5),最后点击Finish按钮完成NiosIICPUCore的添加过程,随后SOPCBuilder的界面就会改变(图3.6).在图1-8中可以看到,niosII作为一个CPUCore组件已经加入SOPC系统.更改组件名称的方法是选中"CPU_0",右键选择"Rename",更改组件名称为"cpu".

图3.4NiosII/sCPU模式

图3.5选择JTAG的调试模式

注意,加入组件的更改和取名很重要,许多组件名此系统的工作软件,C程序中都会出现,而且大小写有关系.

图3.6加入了NiosII的SOPC窗口

3.2.2加入JTAGUART

从左侧组件InterfaceProtocols栏下的Serial中选择的JTAGUART加入,接受弹出窗口中的所有默认设置(图1-9),再点击Simulation页,选择CreateModelSimaliastoopenawindowshowingoutputasASCIItext,点击Finish,完成设置,并改名为jtag_uart..

图3.7组件JTAGUART设置

3.2.3加入定时器Timer

在组件选择栏中选择"Peripherals"→"MicrocontrollerPeripherals"→"IntervalTimer"加入SOPC系统的内部定时器.一切都按照默认配置(图3.8),点击Finish完成加入.更改组件名称为"sys_clk_timer.".(此定时器可用于此后在上运行的C程序中的某些软件函数进行速度定时).

图3.8组件Timer设置窗

3.2.4加入输入键I/O口

在这里,一般需要加入用于按键的PIO,PIO就是通用I/O口.在组件选择栏中选择"Peripherals"→"MicrocontrollerPeripherals"→"PIO(ParallelI/O)"加入.选择为4位,以对应4个按键,并选择"Input"输入模式(图3.9).点击"Next"进行输入选项设置.在此窗中选择产生中断请求(IRQ),为双边沿触发,边沿模式(图3.10),点击"Finish"完成加入.更改组件名称为"button_pio".

图3-9组件PIO输入口设置窗

图3.10输入方式设置窗

3.2.5加入8个发光管I/O口

在组件选择栏中选择"Peripherals"→"MicrocontrollerPeripherals"→"PIO"加入,选择默认8位,以对应8个LED,并确认"Output"输出模式(图3.11).点击"Finish"完成加入.更改组件名称为"led_pio".

图3.11加入8个输出PIO口

3.2.6加入2个7段数码管I/O输出口

在组件选择栏中选择"Peripherals"→"MicrocontrollerPeripherals"→"PIO"加入.选择为16位,以对应4个已经在电路被译码的7段数码管,并改成"Output"输出模式.点击"Finish"完成加入.更改组件名称为seven_seg_pio.

3.2.7加入Avalon三态总线桥

NiosIICPU与SRAM,SDRAM,Flash,自组件相接都需要Avalon三态总线桥.在组件选择栏中选择"BridgesandAdapters"→"MemoryMapped"→"Avalon-MMTristateBridge",加入,在设置窗中(图3.12)确认选择Registered.点击"Finish"完成加入.更改组件名称为"ext_mem".

图3.12加入Avalon总线3态桥设置

3.2.8加入外部Flash

在NiosII中,加入Flash.在组件选择栏中选择"MemoryandMemoryControllers"→"Flash"→"FlashMemory(CommonFlashInterface)",加入FlashROM组件.在弹出的参数设置窗中(图3.13),在"Attributes"栏中首先选择地址线宽度Addresswidth为23,和数据线宽度Datawidth为8,此后Presets栏自动选择"Custom",在"Timing"栏,设置niosII对Flash的读写时序,此后选择默认设置(图3.14).点击"Finish"完成加入.更改组件名称为"ext_flash".

图3.13加入外部Flash组件的设置窗

图3.14设置对外部Flash读写时序

3.2.9加入系统ID组件

在组件选择栏中选择"Peripherals"→"DebugandPerformance"→"SystemIDPeripheral",加入此组件(图3.15).此组件名不可改.

图3.15加入系统ID组件

3.2.10加入EPCSSerialFlashController组件

EPCSSerialFlashController可用于NiosII处理器对EPClash存储器的读写访问,可以通过此控制器将SOF文件和CPU运行的软件一并存于EPCS器件中,以便大大简化硬件系统组成结构.在组件选择栏中选择"MemoryandMemoryControllers"→"Flash"→"EPCSSerialFlashController",点击"Finish"完成加入此组件(图3.16).此组件名不可改.

图3.1 6EPCSSerialFlashController组件

3.2.11加入外部SRAM组件

在组件选择栏中选择"MemoryandMemoryControllers"→"SRAM"→"IDT71V416SRAM",对弹出的选择窗确认选择存储量为1024kB,点击"Finish"完成加入此组件(图3.17).组件名可改为ext_sram.

图317加入SRAM组件

至此已完成本项实验的全部组件的加入工作.图3.18就是本系统的NiosII基本元件安装设置完成的界面.

图3.18NiosII组件窗

3.3NiosII系统生成前设置

3.3.1地址自动分配设置

为了保证所有组件的地址安排是合法的,如图3.19所示,选择菜单System中的Auto-AssignBaseAddresses项,对各组件地址进行自动分配.

图3.19地址自动分配设置

3.3.2复位地址和程序运行区域设置

为了点击Next,进入如图3.20的NiosII处理器配置窗.选择ext_flash作为复位程序区域:ResetAddress,选择ext_sram作为外部存储单元中的软件运行的存储地址区域:ExceptionAddress.

图3.20NiosII处理器配置窗

设置完成后可注意到下方的信息栏中已没有早先指出的大量错误提示.此时保证所有组件的地址安排是合法的.点击SystemGeneration,进入系统生成控制页.

3.3.3系统文件生成

系统生成控制页如图3.21所示.在该页将最终生成NiosII系统的VHDL文件,以及对应的硬件仿真文件.点击Generate.生成过程如图3.22所示.

图3.21NiosII系统生成窗

注意如图3.23所示信息栏中出现"等SUCCESS:SYSTEMGENERATIONCOMPLETED",则可点击Exit按钮,退出系统生成窗.

3.4NiosII硬件系统生成

按上述步骤设计的CPU,适合较大系统,当只是验证很小性能时,可采用all模式.CPU最小系统的,如图3.22示.

图3.22NiosII最小系统

3.4.1加入原理图模块

新建一个原理图,在此原理图编辑窗的空白处双击,将弹出图3.23所示的元件"Symbol"窗,点击左侧的元件库栏中的Project项,选择刚才生成好的"Nios2_SYSTM"模块,再点击下方的OK,即可将此元件调入原理图编辑窗中.

将调入的模块于图中的引脚连好,并仔细核对每一引脚都对接正确,包括外部存储器的地址线,数据线,读写控制线,片选线,各类I/O口线,复位线,如图3.24示.

图3.23NiosII系统生成窗

图3.24连上Nios2_Systm模块

3.4.2编译

以上的所有准备工作完成后,就可以进行全程编译了,即进行分析,综合,适配和输出文件装配,并对结果进行时序分析,给出编译报告.

选择菜单Processing(StartCompilation,启动全程编译.结果发现前期工作没有错误,图3.25所示的窗口将给出了编译结果,从右栏可以看到FPGA的资源利用情况.

图3.25编译成功

至此,NiosII嵌入式系统的硬件设计部分已全部完成,以下将开始为此系统进行的软件设计和调试.如果发现软件工作情况不能完全满足设计要求,还可以回过头来修正或彻底更改硬件设计,这真实SOPC的优势所在.

3.5NiosII硬件配置

本步骤是与3.4相连的,主要完成NiosII硬件系统在FPGA中的下载及配置.

3.5.1向FPGA下载配置文件

本实验使用康芯公司的GW48-SOPC实验系统,下载前连接好下载通信线,打开电源,确认实验系统所有开关和跳线处于默认设置位置.用10芯通信线将实验系统左侧的"ByterblasterII"接口与适配板上的JTAGPort口相连,将实验系统左侧的跳线短路帽接插"ByBtII"端,编程电压选择跳线短路帽插3.3V(此电压接错不会损坏系统).按动实验系统左下角的电路模式控制键,选择模式5(在上方的数码管会显示5字),

FPGA的主要端口是用标准信号名PIOx标注的,具体引脚号在引脚锁定时参考试验箱配套的实验讲义.本试验中,引脚锁定为:CLK接PIN179,clk0,RESET接PIN240,键8,LED[7..0]分别接PIN12,PIN8,PIN7,PIN6,PIN4,PIN3,PIN2,PIN1.锁定引脚号后,再编译一次.

开始下载配置文件,在FPGA中建立NiosII硬件环境.打开QuartusII,再打开3.4实验的工程,选择菜单Tools(Programmer,弹出图3.26所示窗口,首先选择接口模式,对于Mode栏确认选择JTAG模式.在HardwareSetup按钮右侧看到ByteBlasterII[LPT1]字样.加入配置文件nios32.sof,点击Start按钮,下载该文件.

该NiosII系统是低电平复位,高电平正常工作,所以在下载了SOF文件后,要将实验系统的键8置于高电平.

图3.26下载窗口

至此,已经完成了NiosII硬件的,并配置到Altera的Cyclone系列EP1C6Q208C器件上,为C程序的调试提供了硬件平台.

第4章NiosIIIDE软件设计与调试

4.1NiosIIIDE中的C程序设计

4.1.1进入集成开发环境IDE

再次进入图3-18所示的SOPCBuilder窗,进入SystemGeneraiom页,点击NiosIIIDE按钮(图3.27),或选择菜单Tools(NiosIIIDE,进入IDE环境.

图3.27点击NiosIIIDE按纽,进入集成开发环境

4.1.2建立C软件开发工程

进入的IDE环境窗口的左栏是各工程的工程名和相关的应用文件名,中间是选中的某一文件的内容,及其编辑环境,右栏是对应文件中关键项目名称.

为了新建一个开发软件的工程项目,选择菜单File的New->,Project.,在弹出的如图3.28所示的窗口中选择C/C++Application,并按Next按钮,在于继而弹出的窗口(图3.29)中选择现成的实例"Hello_Led"作为实验程序,并在工程名栏默认当前软件实例工程名,并确认在.SelectTargetHardware栏中的ptf文件来自当前SOPCBuilderSystem的硬件设计文件和处理器名:CPU.ptf,和CPU名:"CPU0".

图3.28选择C/C++应用

图3.29在示例库中选择一个C程序实例

点击Finish后即进入如图3-29所示的IDE环境,在左栏已能看见新建的工程:hello_led_1,双击下方的程序名hello_led.c,在中栏即能看见此源程序代码(图3.30).

图3.30进入NiosIIIDE窗口

4.2NiosIIIDE软件编译与运行

4.2.1编译运行C程序

在左边的"C/C++Projects"页一栏中,右键点击需要运行的工程名:"hello_led_1",将出现图所示下拉选择框,选择RunAs后出现另一下拉栏,此栏有3个选择项:第一个选项功能是编译并向FPGA中的NiosIICPU下载和全速运行该工程中C程序,第二个选项功能是编译并在虚拟的NiosII中运行程序,第三个选项功能是使用第3方工具运行,在此选择第一项功能:RunAs->,NiosIIHardware..选中后将可能出现图3.31所示的窗口,选择OK,表示对新改的程序存盘.

图3.31编译,下载并在NiosIICPU中全速运行该示例

4.2.2观察运行结果

在如果一切无误,最后在下方的console信息窗将出现如图3-32所示信息,表示已将程序下载到NiosII系统,并已运行.注意,如果有问题可以再下载一次.一般出现的问题有多种:如没有将当前硬件工程中的SOF文件配制进FPGA,没有为复位信号设置正确电平,没有设定正确的系统时钟输入频率,没有设置好正确的下载接口模式,没有对实验系统选择正确的电路模式(模式5),等等.

调试时,出现以下信息,如图3.32示.

图3.32调试信息窗口

正确结果应如图3.33示.

图3.33C程序下载成功,启动运行

预期结果是,程序运行后可以在实验系统上的上排8个发光管上发现它们在从左至右,从右至左跳动发亮,跳动的速度由语句while(i<,400000)中的数值决定.本项成功地仿真通过了预期目标.

至此,NiosII的软件调试已经完成,本章详细探讨了软件设计与调试的流程.

结束语

通过三个多月的毕业设计,我系统地掌握了VHDL数字系统的设计方法,对QuartusII软件熟练应用.同时,能够熟练使用GW48EDA试验箱及SOPC实验 箱.在着手实验的过程中,我查阅了大量资料,还有上论坛交流,成功仿真了出租车计费器和转向灯模块,同时加入了梁祝乐曲发生模块,增加了对人的关怀.在系统设计方面,增加了系统集成能力.即将开发好的模块,直接在系统中调用,省去了从底层一步步开发的时间及精力,加快了设计进度.

在做SOPC时,SOPC硬件及软件设计的一般方法及流程,SOPC,并完成复杂,实用的系统.

通过这次的毕业设计,我的实验能力和分析问题,解决问题的能力得到了很大的提升,了解了团队工作的重要性.并对Modelsim等软件有了初步的认识,为以后研究生阶段的学习做好了充分的准备.

感谢高阳同学,在学习QuartusII之初,跟他交流,我进步很快.

PD78F0034单片机的出租车计费器的设计与实现,国外电子元器件,2004,(8)

4.吴冬梅,吴延海等,基于CPLD/FPGA的出租车计费器,电子技术应用,2004,(11)

王振江,VHDL数字系统设计与实践,北京,机械工业出版社,2003

6.潘松,黄继业,EDA实用技术教程(第二版),北京,科学出版社,2003

7.康芯公司,新SOPC_EDA实验讲义,杭州,2007

8.徐欣等,基于FPGA的嵌入式系统设计,机械工业出版社,2005

9.潘松,王国栋,VHDL实用教程,电子科技大学出版社,2001

10.张亮,罗小巧等,基于FPGA的乐曲演奏器的设计,电子技术

11.王锁萍,电子设计自动化教程,电子科技大学出版社,2000

12.任晓东,文博,CPLD/FPGA高级应用开发指南,电子工业出版社,2003

13.胡振华,VHDL与FPGA设计,中国铁道出版社,2003

14.宋万杰,罗丰等,CPLD技术及其应用,西安电子科技大学出版社,2000

15.刘常澍赵雅兴数字电路与FPGA人民邮电出版社

青岛大学本科生毕业论文(设计)

青岛大学本科生毕业论文(设计)

青岛大学本科生毕业论文(设计)

青岛大学本科生毕业论文(设计)

1

青岛大学本科生毕业论文(设计)

3

FPGA

控制器

左,右转向按键

启动键,停止键

加速键,暂停键

转向灯LED显示

里程显示

车费显示

播放,暂停

播放乐曲

SOPCBuilder

配置处理器

选择配置外设

生成

软件开发

C语言头文件

自定义库文件

外设驱动

硬件开发

EDIF网络表

HDL源文件

测试平台

第三方软件

操作系统

调试程序

GNUPro

(编写源程序)

编译/连接

下载调试

FPGA

QuartusII

设计输入

综合和适配

编程配置

类似论文

12电信文指导书,数控文前言电信

目录12电信专业毕业设计(论文)安排进度表2毕业设计的指导教师与设计题目安排原则212电信毕业论文指导老师安排312电信毕业论文题目3毕。
更新日期:2024-5-15 浏览量:69724 点赞量:15950

机械系毕业文前言江苏

食品工程系2007届毕业设计(论文)撰写要求及相关工作安排1 毕业设计(论文)格式,书写规范及上交材料要求 1 1撰写格式: 具体要。
更新日期:2024-5-22 浏览量:68866 点赞量:15270

12电信文指导书,数控文前言电信

目录 12电信专业毕业设计(论文)安排进度表2 毕业设计的指导教师与设计题目安排原则2 12电信毕业论文指导老师安排3 12电信毕业。
更新日期:2024-4-28 浏览量:58908 点赞量:13720

焊接文前言江苏

论文题目:格力家用空调的运行与维修年级:08供热1班院系:机电工程与自动化学院学生姓名:张红涛指导教师:李景丽20。
更新日期:2024-5-11 浏览量:66540 点赞量:14505

硕士文前言厦门,厦门大学本科毕业文规范

上海海洋大学本科学生毕业设计报告(论文)撰写规范(2016年8月30日校办编号〔2016〕278号)为加强本科实践教学环节,保证本科毕业设计(论文)质。
更新日期:2024-4-24 浏览量:60100 点赞量:14461

环保文发表江苏

中国科学院城市环境研究所 副研究员/助理研究员岗位招聘启事 根据工作需要,中国科学院城市环境研究所现面向海内外诚聘以下研究领。
更新日期:2024-2-13 浏览量:29863 点赞量:7044

机械文模板江苏

附件二:南京工业大学2016届本科生优秀毕业设计(论文)名单序号学院论文题目学生姓名班级指导教师1化工学院氧化石墨烯膜的制备。
更新日期:2024-3-4 浏览量:7754 点赞量:2525