eda多功能时钟设计_基于FPGA的出租车计费器的设计

221ee7b029d2bc8ad7f3a713bf603176.png

6ee83a4e934e36f91da764daef1f272e.png
成 绩
批阅教师

桂林电子科技大学实训报告2017-2018学年第二学期 海洋信息工程学院 FPGA技术综合设计实训 梁新坚 1516030514 指导老师 覃琴 2018年5月20日 目录
1 概述... - 1 -
1.1 设计要求... - 1 -
1.1.1 设计任务... - 1 -
1.1.2 性能指标要求... - 1 -
1.2 总体设计基本原理及框图... - 1 -
1.2.1 基本原理... - 1 -
1.2.2 总体框图... - 2 -
2 系统软件设计分析... - 2 -
2.1时钟模块... - 2 -
2.2控制模块... - 4 -
2.3计程模块... - 7 -
2.4音乐模块... - 8 -
2.5 LCD显示模块... - 10 -
2.6计费模块... - 15 -
3 系统测试(调试) - 18 -
3.1 测试仪器与设备... - 18 -
3.2 性能指标测试... - 18 -
3.3 结果分析... - 19 -
4 波形发生器设计... - 19 -
5 实训总结... - 24 -
6 参考文献... - 24 -
附录... - 25 -

出租车计费器的设计

1 概述

EDA(Electronic Design Automation)即电子设计自动化,是电子设计技术的核心,它的系统级高层次电子设计方法,对整个系统进行方案设计和功能划分,无须通过门级原理图描述电路,而是针对设计目标进行功能描述,。

FPGA 是现场可编程门阵列的简称。它结合了微电子技术、电路技术和EDA技术,使设计者可以集中精力进行所需逻辑功能的设计,缩短设计周期,提高设计质量。FPGA的开发系统包括软件和硬件两个部分,开发系统软件指专用的编程语言和相应的汇编程序或编译程序。开发系统硬件部分包括计算机和编程器。编程器是对FPGA进行写入和擦除的专用装置,能够供写入或擦除操作所需要的电源电压和控制信号,并通过串行接口从计算机接收编程数据,最终写进FPGA之中。

基于FPGA的计费器系统利用Verilog HDL语言,采用模块化程序设计,自顶向下、由粗到细、逐步求精的方法,将基于FPGA的计费器系统的整体逐步分解各个模块。它不需要专门的硬件,只通过软件编程即可实现计费器系统的逻辑功能、电路结构和连接形式。Verilog HDL语言类似C语言,可读性强、更易理解,这种语言几乎覆盖了以往各种硬件描述语言的功能,在编程的过程中一般采用自顶向下的电路设计过程。

本设计利用Verilog HDL语言,在QuartusⅡ13.0软件中将出租车计费器基本结构分成6个模块对其进行程序汇编。将各块程序生成的.v文件组合在一起,生成数字钟源代码的.bdf 图形文件,最后下载到CycloneⅡ系列芯片EP20C8Q208C8N中,验证试验结果。

1.1 设计要求

1.1.1 设计任务

设计并制作一台出租车计费器。

1.1.2 性能指标要求

① 用EDA实训仪的I/O设备和PLD芯片实现出租车计费器的设计。

② 出租车起步开始计程和计费,计程系统按实际公里数计程,计费系统首先显示起步价(如7.0),车行驶2km以内,只收起步价7元。

③ 出租车行驶超过2km后,按每公里1.6元在7.0元的基础上增加。

④ 出租车行驶超过10km后(或超过20元路费),每公里加收50%的车费,即车费变为每公里2.4元。

⑤ 出租车达到目的地后,(用一个按钮)计程和计费数据清零,为下一次计费开始。

1.2 总体设计基本原理及框图

1.2.1 基本原理

该出租车计费器的基本原理方框图如图1所示,由时钟模块、控制模块、计程模块、音乐模块、LCD显示模块、计费模块6部分组成。该计费系统通过分频模块将20MHz的时钟信号通过分频器变成1Hz的时钟信号和50Hz的显示输出信号。该出租车计费的标准是起步价是6元,2公里之内费用不变,当超过2公里时,每行驶1公里,费用加收50%元;由peo信号来控制有人或者没人,高电平有人,低电平显示空车,出租车计费显示模块显示相应的费用和行驶的里程。当res为低电平时,计费系统复位。该计费系统的显示费用是0~999.9元

1.2.2 总体框图

6ee83a4e934e36f91da764daef1f272e.png

图1 总体框图

2 系统软件设计分析

整个系统由6个模块组成:

2.1时钟模块

时钟模块,提供实时时间,并可以通过按键调节分钟和小时并由其qs、qm、qh分别输出秒、分、时,clk20m输入20Mhz,clrn清零,fj和hj为调分和调时。用于区分白天与夜间计费,白天时间6:00~00:00、夜间时间00:00~6:00,由两个60进制计数器和一个24进制计数器组成,生成一个元件符号。

6ee83a4e934e36f91da764daef1f272e.png

图2-1 时钟模块元件符号图

60进制计数器程序:

module cont60(clk,clrn,q,cout,j);

input j,clrn,clk;

output reg [7:0] q;

output reg cout;

always @( posedge clk^j or posedge clrn )

begin

if(clrn) q=0;

else

begin

q = q+1; if(q[3:0] >= 10)

begin q[3:0] = 0;q[7:4] = q[7:4]+1;

if(q[7:4] >= 6) q[7:4] = 0;

end

if( q == 'h00 ) cout = 1;else cout = 0;

end

end

endmodule

24进制计数器程序:

module cont24(clk,clrn,q,cout,j);

input j,clk,clrn;

output reg [7:0] q;

output reg cout;

always@( posedge clk^j or posedge clrn )

begin

if(clrn)begin q=0;cout = 0;end

else

begin

q = q+1; if(q[3:0] >= 10)

begin q[3:0] = 0; q[7:4] = q[7:4]+1;

end

if( q >= 'h24 )

begin q = 0; cout = 1; end

else cout = 0; end end endmodule

6ee83a4e934e36f91da764daef1f272e.png

图2-2 时钟仿真图

2.2控制模块

控制模块是用于控制车速的模块clk输入20Mhz,res清零作用,key_up是加速、key_down是减速,对应速度有0km/h、20km/h、40km/h——260km/h、280km/h、300km/h共15个速度调节来产生不同的频率由clk_speed输出,20km/h即11.1m每秒,所以20km/h要产生一秒为11100个上升沿,20Mhz/(2*11100),而gear输出不同的档位,通过对20MHz分频来产生不同的频率对应不同的速度,1秒内10000个上升沿表示1秒行驶了1m,改变频率即改变了1秒内上升沿的个数,就改变了速度。

6ee83a4e934e36f91da764daef1f272e.png

图2-3 按键控制模块元件符号图

控制模块程序:

module key(clk,

key_up,

gear,

res,

key_down,

clk_speed,

people);

input res,people;

input key_up,clk,key_down;

output reg clk_speed;

reg [29:0] clk_sp_reg;

output reg[3:0]gear;

reg [29:0]up_c,down_c,n;

initial begin

gear='b1000;up_c=0;down_c=0;n=0;

clk_sp_reg=0;

end

always@( posedge clk or posedge res)//加速减速控制

begin

if(res) begin down_c=0;up_c=0;end

else if(!people)begin up_c=0; down_c =0; end else

begin

if(key_up)

begin

up_c=up_c+1'b1;

end

else

begin

up_c=0;

end

if(key_down)

begin

down_c=down_c+1'b1;

end

else

begin

down_c=0;

end

end

end

always @(posedge clk or posedge res)//速度对应的分频数,

begin

if(res) begin gear=0; end

else if(!people)begin gear=0; clk_sp_reg=0; end else

begin

if(key_up ^ key_down )

begin

if(key_up==1)

begin

if(up_c==5 && gear<='b1110)//200000)

gear=gear+1;

if(gear>='b1111)

gear='b1111;

end

if(key_down==1)

begin

if(down_c==5)//200000)

if(gear=='b0)

gear='b0;else gear=gear-1;

end

end

case (gear)

0 : ; //速度为0

1 : clk_sp_reg=909;

2 : clk_sp_reg=454;

3 : clk_sp_reg=303;

4 : clk_sp_reg=227;

5 : clk_sp_reg=181;

6 : clk_sp_reg=151;

7 : clk_sp_reg=129;

8 : clk_sp_reg=113;

9 : clk_sp_reg=101;

10 : clk_sp_reg=90;

11 : clk_sp_reg=82;

12 : clk_sp_reg=75;

13 : clk_sp_reg=69;

14 : clk_sp_reg=64;

15 : clk_sp_reg=60;

endcase

end

end

always @( posedge clk or posedge res) //把20MHz分频,产生相对应速度的频率

begin

if(res)begin n<=0;clk_speed<=0;end

else if(!people)begin n<=0;clk_speed<=0; end else

begin

if (n>=clk_sp_reg && gear!=0)

begin n<=0;clk_speed<=~clk_speed; end

else

begin n<=n+1; clk_speed<=clk_speed;end

end

end

endmodule

6ee83a4e934e36f91da764daef1f272e.png

图2-4 控制模块仿真图

2.3计程模块

计程模块由五个100进制的计数器组成,clk输入控制模块分频出来的频率,然后在计程模块进行计数,只显示qshiwan到qshiyi的计程其中qshiwan[7:4]是百米计程,这样能使计费精确到分以下,所以计程用1000个上升沿记为1米,

6ee83a4e934e36f91da764daef1f272e.png

图2-5 计程模块元件符号图

计程模块程序:

module counter0_99(clk,clr,q,cout,people);

input clk,clr,people;

output reg [7:0] q;

output reg cout;

reg one='b1;

initial q='h99;

always@( posedge clk or posedge clr or negedge people )

begin

if(clr ) q=0;

else

begin if(!people) q=0;

else

begin

q = q+1;

if(q[3:0] >= 10)

begin

q[3:0] = 0;

q[7:4] = q[7:4]+one;

if(q[7:4] >= 10)

q[7:4] = 0;

end

if( q == 0 )

cout = 1;

else

cout = 0;

end end end endmodule

6ee83a4e934e36f91da764daef1f272e.png

图2-6 计程模块仿真图

2.4音乐模块

音乐模块的clk是时钟输入,people是有人和没人的状态标志,beep外接蜂鸣器,并设定了两个音乐《送别》和《起风了》,作为乘客上车下车时播放的音乐,播放音乐的原理是通过改变频率来改变音高,改变延时时间来确定一小节拍的时间是240ms,通过分频产生。

//音高与频率的对应关系

//| | 1 | 2 | 3 | 4 | 5 | 6 | 7 |

//|低音 |261.6Hz |293.7Hz |329.6Hz |349.2Hz | 392Hz | 440Hz |493.9Hz |

//|中音 |523.3Hz |587.3Hz |659.3Hz |698.5Hz | 784Hz | 880Hz |987.8Hz |

//|高音 |1045.5Hz|1174.7Hz|1318.5Hz|1396.9Hz| 1568Hz | 1760Hz |1975.5Hz|

//乐谱参数:D=F/2K (D:参数,F:时钟频率,K:音高频率)

6ee83a4e934e36f91da764daef1f272e.png

图2-7 音乐模块元件符号图

音乐模块程序:

module music( clk,people, beep);

input clk,people;

output reg beep;

reg flag ,flag1;

reg[7:0] state,state1; //乐谱状态机 <

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值