现代电子系统设计.docx

上传人:b****4 文档编号:5441586 上传时间:2022-12-16 格式:DOCX 页数:29 大小:2.88MB
下载 相关 举报
现代电子系统设计.docx_第1页
第1页 / 共29页
现代电子系统设计.docx_第2页
第2页 / 共29页
现代电子系统设计.docx_第3页
第3页 / 共29页
现代电子系统设计.docx_第4页
第4页 / 共29页
现代电子系统设计.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

现代电子系统设计.docx

《现代电子系统设计.docx》由会员分享,可在线阅读,更多相关《现代电子系统设计.docx(29页珍藏版)》请在冰豆网上搜索。

现代电子系统设计.docx

现代电子系统设计

一:

智能交通控制器

设计要求

试设计民族大道与南湖大道十字路口的智能交通控制器,控制车辆的示意图如图1所示。

A信号B信号

C信号D信号

交通信号灯的控制顺利A——B——C——D----A,信号灯有红绿黄三色(红灯禁止通行;绿灯允许通行;黄灯警示,绿灯切换为红灯时,亮黄灯3秒)为错开早晚上下班高峰,信号灯采取分时控制,其中控制的时间表为:

时间段

A信号灯

B信号灯

C信号灯

D信号灯

7:

30~9:

00

1分钟

45秒

1分钟

15秒

9:

00~17:

00

30秒

30秒

30秒

30秒

17:

00~19:

00

45秒

20秒

1分钟

1分钟

19:

00~7:

00

20秒

20秒

20秒

20秒

要求:

1)采用VerilogHDL设计

2)设计报告应包含RTL图,时序仿真结果图等

3)FPGA硬件平台推荐使用DE2

 

(1)设计思路

要南湖大道和民族大道构成的十字路口的四个方向交通灯的控制系统,根据要求,分为四个时间段,但是由于上班时和下班时是车流通量的高峰期,所以要给控制系统加时间控制,可根据时间段执行路段的流通时间长短。

在7:

30~9:

00时间段内,当A信号灯为绿灯时,这是车辆允许直行或左转,而其他三个方向的信号灯均为红灯,禁止通行。

当A信号灯的数码管显示绿灯倒计时,其他方向的数码管也显示着红灯倒计时。

60s倒计时完毕后,A信号灯由绿灯转为黄灯,进入3s的黄灯倒计时,其他方向交通灯继续保持着红灯状态,3s之后A信号灯黄灯倒计时完毕转为红灯,B信号灯由红灯转为绿灯,并开始45s倒计时,同上,当B信号灯转为黄灯时,黄灯又进入3s的倒计时,在黄灯倒计时结束后,C信号灯由红色转为绿色。

重复之前的步骤,交通灯由A-B-C-D-A完成一个循环,然后在另外的三个时间段内,分别对应着信号灯在红绿灯运行的时间状态完成同样的循环步骤。

(2)设计方案

总体上分为四个大模块,即:

分频模块,数字钟模块、控制模块、译码显示模块。

设计图

分频模块

由于所用的开发板中的晶振是50MHz,将它分频为1Hz,使其能供应时钟应用。

程序如下

 

 

打包后的

 

数字钟设计

24进制计数器

24进制仿真图

60进制计数器的设计方法类似24进制计数器,不同的地方在于,60进制的设计思想是当计数到59时,置数清零,产生进位输出;而24进制的高低4位的清零和进位需要考虑个位计数到9和整个计满到23。

由于本次要求在复位后,是7:

30,所以分钟在复位后应该是30。

在仿真无误后,进行打包

 

60进制仿真图

24小时的时钟完成

数字钟仿真

控制模块

在四个路口分别在四个不同的时间段内控制交通灯的循环状况,以达到道路上路人和车辆的正常通行的目的。

这里我们需要在每个路口放置三个LED灯和两个七段数码管,三个LED灯分别表示红绿黄三个不同的显示状态,数码管用来进行倒计时切换红绿黄灯的正常工作。

当sk1,sk2为00时就是7:

30到9:

00这个时间段。

当sk1,sk2为01时为9:

00到17:

00。

当sk1,sk2为10时为第三个时间段。

当sk1,sk2为11时为第四个时间段。

控制时间模块

时间模块

控制状态模块

always@(posedgesysclk_1Hzornegedgereset)

begin

if(!

reset)//有清零,灯都灭

begin

light_select<=12'b000000000000;

light_status<=3'd0;

enable<=0;

end

else

if(enable==0)//使能端为0则执行

begin

enable<=1;//使能端变1,下面只执行一次

case(light_status)//控制状态跳转

0:

begin//状态A

light_long<=aaaa;//灯亮的时间60s

light_select<=12'b001100100100;//控制灯亮

light_status<=3'd1;//交给下一个状态

end

1:

begin//黄灯闪烁

light_long<=eeee;//黄灯亮的时间3s

light_select<=12'b010100100100;//控制黄灯亮

light_status<=3'd2;//交给下一个状态

end

2:

begin//状态B

light_long<=bbbb;//灯亮的时间

light_select<=12'b100001100100;//控制灯亮

light_status<=3'd3;//交给下一个状态

end

3:

begin//黄灯闪烁

light_long<=eeee;//黄灯亮的时间

light_select<=12'b100010100100;//控制黄灯亮

light_status<=3'd4;//交给下一个状态

end

4:

begin//状态C

light_long<=cccc;//灯亮的时间

light_select<=12'b100100001100;

light_status<=3'd5;//交给下一个状态

end

5:

begin//黄灯闪烁

light_long<=eeee;//黄灯亮的时间

light_select<=12'b100100010100;//控制黄灯亮

light_status<=3'd6;//交给下一个状态

end

6:

begin//状态D

light_long<=dddd;//灯亮的时间

light_select<=12'b100100100001;

light_status<=3'd7;//交给下一个状态

end

7:

begin//黄灯闪烁

light_long<=eeee;//黄灯亮的时间10s

light_select<=12'b100100100010;//控制黄灯亮

light_status<=3'd0;//交给下一个状态

end

defaultlight_select<=12'b000000000000;

endcase

end

else

if(light_long==0)//一个灯倒计时完,使能端变0

enable<=0;

else

if(light_long[3:

0]==0)//如果个位为0

begin

light_long[3:

0]<=4'd9;//则个位重新赋值9

light_long[7:

4]<=light_long[7:

4]-1;

end//且十位减1

else//否则个位值减1

light_long[3:

0]<=light_long[3:

0]-1;

end

assigndout_1s=light_long[3:

0];//倒计时低四位就是输出个位

assigndout_10s=light_long[7:

4];//倒计时高四位就是输出十位

endmodule

控制各灯亮灭程序:

always@(y_flickerorlight_sel)

begin

colour[11]=light_sel[11];//A红灯传送

colour[9]=light_sel[9];//A绿灯传送

colour[8]=light_sel[8];//B红灯传送

colour[6]=light_sel[6];//B绿灯传送

colour[5]=light_sel[5];//C绿灯传送

colour[3]=light_sel[3];//C绿灯传送

colour[2]=light_sel[2];//D红灯传送

colour[0]=light_sel[0];//D绿灯传送

if((y_flicker==1)&&(light_sel[1]==1'b1))//输入黄灯亮,且控制信号

colour[1]<=1'b1;//为高,黄灯才亮

else//别的情况,黄灯都灭

colour[1]<=1'b0;

if((y_flicker==1)&&(light_sel[4]==1'b1))//输入黄灯亮,且控制信号

colour[4]<=1'b1;//为高,黄灯才亮

else//别的情况,黄灯都灭

colour[4]<=1'b0;

if((y_flicker==1)&&(light_sel[7]==1'b1))//输入黄灯亮,且控制信号

colour[7]<=1'b1;//为高,黄灯才亮

else//别的情况,黄灯都灭

colour[7]<=1'b0;

if((y_flicker==1)&&(light_sel[10]==1'b1))//输入黄灯亮,且控制信号

colour[10]<=1'b1;//为高,黄灯才亮

else//别的情况,黄灯都灭

colour[10]<=1'b0;

end

控制灯亮时间及状态切换:

always@(posedgesysclk_1Hzornegedgereset)

begin

if(!

reset)

begin

My_Time=13'b0;

end

else

begin

if(sysclk_1Hz==1'b1)//0.5s后翻转

begin

My_Time<=My_Time+1;

end

if(My_Time>0&&My_Time<5400)//7:

30-9:

00

begin

aaaa<=8'h60;

bbbb<=8'h45;

cccc<=8'h60;

dddd<=8'h15;

end

if(My_Time>5400&&My_Time<34200)//9:

00-17:

00

begin

aaaa<=8'h30;

bbbb<=8'h30;

cccc<=8'h30;

dddd<=8'h30;

end

if(My_Time>34200&&My_Time<41400)//17:

00-19:

00

begin

aaaa<=8'h45;

bbbb<=8'h20;

cccc<=8'h60;

dddd<=8'h60;

end

if(My_Time>41400&&My_Time<86400)//19:

00-7:

30

begin

aaaa<=8'h20;

bbbb<=8'h20;

cccc<=8'h20;

dddd<=8'h20;

end

if(My_Time>86400)//19:

00-7:

30

begin

My_Time=0;

end

end

end

数码管显示模块

数码管译码显示(部分)

always@(led_goren)

begin

ledbcd_g=7'b1111111;

if(en==1)

case(led_g)//用case语句进行计时个位译码

4'b0000:

ledbcd_g=7'b1000000;//0

4'b0001:

ledbcd_g=7'b1111001;//1

4'b0010:

ledbcd_g=7'b0100100;//2

4'b0011:

ledbcd_g=7'b0110000;//3

4'b0100:

ledbcd_g=7'b0011001;//4

4'b0101:

ledbcd_g=7'b0010010;//5

4'b0110:

ledbcd_g=7'b0000010;//6

4'b0111:

ledbcd_g=7'b1111000;//7

4'b1000:

ledbcd_g=7'b0000000;//8

4'b1001:

ledbcd_g=7'b0010000;//9

default:

ledbcd_g=7'b0000000;

endcase

end

always@(led_soren)

begin

ledbcd_s=7'b1111111;

if(en==1)

case(led_s)//用case语句进行计时十位译码

4'b0000:

ledbcd_s=7'b1000000;//0

4'b0001:

ledbcd_s=7'b1111001;//1

4'b0010:

ledbcd_s=7'b0100100;//2

4'b0011:

ledbcd_s=7'b0110000;//3

4'b0100:

ledbcd_s=7'b0011001;//4

4'b0101:

ledbcd_s=7'b0010010;//5

4'b0110:

ledbcd_s=7'b0000010;//6

4'b0111:

ledbcd_s=7'b1111000;//7

4'b1000:

ledbcd_s=7'b0000000;//8

4'b1001:

ledbcd_s=7'b0010000;//9

default:

ledbcd_s=7'b0000000;

endcase

end

 

倒计时(每隔1s的时间闪烁)

always@(posedgeclkornegedgerst)

begin

if(!

rst)

begin

clk_scan<=0;

cnt<=32'd0;

end

else

begin

if(cnt==32'd50000000-1)//1s的时间

begin

cnt<=32'd0;

sec<=~sec;

end

else

cnt<=cnt+1;

end

begin//倒数计时

if(numA>0)

if(numA[3:

0]==0)

begin

numA[3:

0]<=4'b1001;

numA[7:

4]<=numA[7:

4]-1;//十位减1

end

elsenumA[3:

0]<=numA[3:

0]-1;//个位减1

if(numA==1)timA<=0;

end

End

(3)实验结果

时序仿真图

实物仿真图

由时序仿真图和实物仿真图都可以看出,A-B-C-D信号灯是按照所设计方案在运行。

即在7:

30~9:

00时间段内,当A信号灯为绿灯时,而其他三个方向的信号灯均为红灯。

当A信号灯的数码管显示绿灯倒计时,其他方向的数码管也显示着红灯倒计时。

60s倒计时完毕后,A信号灯由绿灯转为黄灯,进入3s的黄灯倒计时,其他方向交通灯继续保持着红灯状态,3s之后A信号灯黄灯倒计时完毕转为红灯,B信号灯由红灯转为绿灯,并开始45s倒计时。

同上,重复之前的步骤,交通灯由A-B-C-D-A完成一个循环。

 

二、SD卡播放器

DE2开发板上,采用Altera的SOPCBuilder开发工具设计从SD卡中读取wav格式的音频文件的音乐播放器。

播放器具有以下功能:

(1)播放器的音量可以通过按键增减

(2)可以选择播放下一首歌曲

(3)可以重复播放点前歌曲

设计参考书:

张志刚“FPGA与SOPC设计教程——DE2实践”西安电子科技大学出版社

参考论坛:

要求:

1)给出详细的设计步骤

2)系统结构图与软件设计程序

(1)产生的问题

怎样从SD卡中读wav音频文件的数据?

CPU跟Sd卡在底层进行的spi通信,在软件上层利用FAT32文件系统获取文件的具体相关信息及文件数据。

具体流程如下:

获取SD卡第一扇区的512字节数据—>计算得到根目录所在的扇区—>获取根目录所在扇区的512字节数据—>计算音频文件所在的扇区或开始簇号—>根据FAT表分析文件所占有簇的分布情况—>从而读取整个文件

如何保证读到的音频文件按其采样频率输出?

由于SD卡读取的数据的速度的不可控性,另外WAV音频文件比较大,一首歌多达十几兆,只能采用边读边放才能保证音乐实时不间断地放出来。

播放速度只取决于歌曲的采样频率,播放速度在播放过程中不能变化。

(2)实验原理

设计充分利用了DE2开发板上的硬件资源,其中音频编/解码器(AudioCODEC)是系统的核心,它是由Wolfson公司的低功耗立体声24位音频编解码芯片WM8731来完成的WM8731包含了线路输入、麦克风输入及耳机(音响)输出。

两路线路左、右声道能以1.5dB的步距在12dB~-34.5dB范围内进行对数音量调节,完成A/D转换后,还可以进行高通数字滤波,有效滤除输入信号中的直流成分。

一路麦克风输入可以在-6~34dB范围内进行音量调节。

这三路输入都有单独的静音功能,D/A转换器输入、线路输入旁路及麦克风输入经过侧音电路后可相加作为输出以驱动耳机(RHPOUT和LHPOUT)。

DE2平台上的LINEOUT可以直接驱动耳机,LINEIN经过隔直电容输入,而MICIN则直接输入。

充分利用了24位立体声音频编/解码芯片WM8731高性能、低功耗的优点,可听到音质较好的音乐。

系统总体设计框图如图1所示,利用这些硬件资源,设计实现了一个基于FPGA的多媒体音乐播放器。

整个系统分为:

WM8731的驱动程序编写,SD卡时序模拟,整个音乐播放系统的硬件平台的搭建,NIOSII软件C程序的编写。

本系统的核心在于SD卡的读取操作,使系统能完成其音乐播放功能。

结构框图

(3)实验步骤

工程的初建:

新建“demo_WAVplayer”工程

拷贝ip到工程文件夹“demo_WAVplayer”里

利用“SOPCBuilder”工具初建硬件系统

配置硬件

产生“.ptf”文件

在“SOPCBuilder”工程页面,设置映射地址;设置中断号,中断号越小,优先级越高,一般把Timer的优先级设为最高。

缺省情况下,各个硬件的时钟都使用“pll_c0_cpu”。

一般做如下修改:

“pll_0”使用“clk_50”;“sdram_0”和“sdram_1”使用“pll_c1_memory”;“audio”使用“pll_c2_audio”。

“Generate”生成的“.ptf”等用于硬件编译的文件都自动保存在路径。

建立顶层文件

 

顶层文件(demo_wav.v)的内容:

分配引脚

选中“pins‐de2‐70.tcl”使其蓝色高亮,然后鼠标左键单击“Run”,稍等片刻即可以完成管腿分配。

硬件编译

 

(4)软件设计

下载工程文件夹“demo_WAVplayer”里的“.sof”文件到DE2-70开发板上

新建“demo_WAVplayer_blank_project”工程

 

准备库文件

建立“wavplayer_main.c”源代码

选择release,插入SD卡,软件执行

稍等片刻,DE2-70多媒体开发板上的“LINEOUT”插接口接的耳机里会传出轻音乐,两个存在SD卡上的“.wav”文件wave1和wave2开始连续播放;板上1602LCD显示正在播放的文件名;数码管显示正在播放文件的持续时间;26个LED随着音乐强度越强亮的越多。

四个按钮开关的作用如下:

KEY1:

VolumnDown

KEY2:

VolumnUp

KEY3:

NextSong

KEY4:

Repeatcurrentsong

 

3、FIR低通滤波器设计

3.1设计要求

采用DSPbuilder设计一个截止频率为10KHz的FIR低通滤波器,滤波器的阶数不小于32阶,滤波器采样频率为48KHz,输入序列的位宽为9位(最高位为符号位)。

要求:

1)给出详细的设计步骤

2)给出必要的仿真实验结果

设计参考书:

潘松“现代DSP技术”西安电子科技大学出版社

3.2设计思路

使用DSPBulider在图形环境中设计FIR数字滤波器,然后借助Matlab来计算滤波器的系数。

先设计好一个4阶FIR数字滤波器(直接I型),然后通过不断电泳FIR滤波器节,将其级联起来,完成32阶FIR低通滤波器的设计。

3.3设计步骤

本文设计的是直接I型的FIP滤波器。

FIR滤波器原理:

对于一个FIR滤波器系统,它的冲激响应总是有限长的,最具体的FIR滤波器可用下式表示:

式中:

r是FIR滤波器的抽头数;z(,l一,.)是延时r个抽头的输入信号;b(r)是第r级抽头数(单位脉冲响应);M是滤波器的阶数;y(竹)表示滤波器的输出序列。

典型的直接I型FIR滤波器如图1表示,其输出序列y(n)满足下式:

 

图1直接I型FIR滤波器

 

先设计直接I型4阶FIR滤波器节子系统fir4tap,如图所示:

内部结构如下图所示:

然后复制8个fir4tap,并将它们衔接起来。

前一级的输出端口x4接后一级的X输入端口,并加上32个常树端口,作为FIR滤波器系数的输入。

把8个子系统的fir4tap的输出端口y连接起来,接入一个8输入的加法器,得到FIR滤波器的输出yout。

 

设计的32阶FIR滤波器如图:

注:

对于滤波器系数暂时h1-h32统一设置了255,会在后面FDATOOL中进行计算修改。

3.4使用MATLAB的滤波器设计工具

在FDATOOL中选择DesignFilter。

对滤波器参数进行设计。

滤波器类型选择低通(Lowpass);

设计方法为FIR,采用窗口法(windows);

滤波器阶数定制为31(常系数h(0)为0);

Fs为48kHz,Fc为10kHz。

如下图所示:

选择DesignFilter,让Matlab计算FIR滤波器系数并作相关分析,结果如图:

通过菜单“Analysis”,“FilterCoeffcients”来求出FIR滤波器系数,并对结果进行量化导出:

把计算结果(已四舍五入取整)逐个填入到FIR滤波器模型中,最终结果如图所示:

 

实验总结

这次一整天的FPGA课程设计,可以说是苦多于甜,但是不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次设计,进一步加深了对FPGA的了解,让我对它有了更加浓厚的兴趣。

在程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误。

在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示:

在设定输入的时钟信号后,计时开始,但是始终看不到红黄绿灯的变化。

后来,在几次的调试之后,才发现是因为输入的时钟信号对于器件的延迟时间来说太短了。

经过屡次调试,终于找到了比较合适的输入数值:

这样就可以观察到完整的仿真结果。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正学到真知,从而提高自己的实际动手能力

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1