博主福利:100G+电⼦设计学习资源包!
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 总体框图
图1 总体框图
2 系统软件设计分析
整个系统由6个模块组成:
2.1时钟模块
时钟模块,提供实时时间,并可以通过按键调节分钟和⼩时并由其qs、qm、qh分别输出秒、分、时,clk20m输⼊20Mhz,clrn清零,fj 和hj为调分和调时。⽤于区分⽩天与夜间计费,⽩天时间6:00~00:00、夜间时间00:00~6:00,由两个60进制计数器和⼀个24进制计数器组成,⽣成⼀个元件符号。
图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
图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秒内上升沿的个数,就改变了速度。
图2-3 按键控制模块元件符号图
控制模块程序:
module key(clk,
key_up,
gear,
res,
key_down,
clk_speed,
people);
北京车展2013input 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
性价比最好的suvgear='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)
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
宝马3系挑战赛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超速20以下
图2-4 控制模块仿真图
2.3计程模块
计程模块由五个100进制的计数器组成,clk输⼊控制模块分频出来的频率,然后在计程模块进⾏计数,只显⽰qshiwan到qshiyi的计程其中qshiwan[7:4]是百⽶计程,这样能使计费精确到分以下,所以计程⽤1000个上升沿记为1⽶,
发布评论