出租车计价器课程设计报告.docx
《出租车计价器课程设计报告.docx》由会员分享,可在线阅读,更多相关《出租车计价器课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
![出租车计价器课程设计报告.docx](https://file1.bdocx.com/fileroot1/2022-10/12/6dc5216e-9ab7-45c3-b20c-6abef13f430e/6dc5216e-9ab7-45c3-b20c-6abef13f430e1.gif)
出租车计价器课程设计报告
软件学院
课程设计报告
课程
题目出租车计价器
班级集 成 13-4
专业集成电路设计与集成系统
学生学号
指导教师(填写自己班的指导教师)
年月日
1. 课程设计目的
全面熟悉、掌握 VHDL 语言基本知识,掌握利用 VHDL 语言对常用的组合
逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序
的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用
设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。
2.课程设计题目描述和要求
2.1.课程设计题目描述
①.实现计费功能,计费标准为:
按行驶里程计费,起步价为 7.0 元,并
在车行 3km 后按 2.2 元/km 计费,当计费器达到或超过 20 元时,每公里加收 50%的
车费,车停止不计费。
②.现场模拟功能:
以开关或按键模拟公里计数,能模拟汽车起动、停止、
暂停等状态。
③.将车费和路程显示出来,各有一位小数。
2.2.总体设计思路框架
顶层模块
出租
车计
费器
分频模块
里程计算模块
价格计算模块
译码模块
2.3.课程设计题目要求
①.设计正确,方案合理。
②.程序精炼,结构清晰。
③.设计报告含程序设计说明,用户使用说明,源程序清单及程序框图。
④.上机演示。
⑤.有详细的文档。
文档中包括设计思路、设计仿真程序、仿真结果及相
应的分析与结论。
3.设计思想和设计内容
3.1 出租车计费设计
该出租车计费器按下开关 S1 后开始计费和计里程数,起步价是 7
元,行驶 3 公里,以后 2.2 元/公里。
并且设计选择模块,在车费超过 20
元每公里加收 50%车费即 3.3 元/公里。
3.2 基本设计思想
出租车计费器根据设计要求可初步分为 3 方面——显示、记里程
数、记费。
之后再根据三方面分别设计模块。
1.显示模块。
一般计数器
显示数字为 1-F 即 16 进制,而 16 进制不方便观看,所以在设计这一模
块时我们将 16 进制改为 10 进制输出进而设计了译码模块。
2、里程模块。
设计要求对里程计数主要分为两个方面,计数以及公里数比较。
即 3 公
里之内收 7 元,3 公里之后 20 元(通过计算为 9 公里)以内每公里 2.2
元,9 公里以外为每公里 3.3 元。
所以,我们将里程模块分为里程计数模
块以为比较模块。
3.计费模块。
计费模块同里程比较模块所以将两个模
块合二为一,为价格计算模块。
4.Verilog 代码
4.1 顶层模块
module taxi(
clk,stop,rst_n,
time1,time2,time3,time4,
seg1,seg2,seg3,seg4
);
input clk;
input stop;
input rst_n;
output [6:
0]time1;
output [6:
0]time2;
output [6:
0]time3;
output [6:
0]time4;
output [6:
0]seg1;
output [6:
0]seg2;
output [6:
0]seg3;
output [6:
0]seg4;
wire clk_fp;
wire [15:
0]distance;
wire [15:
0]price;
wire [15:
0]distan_bcd;
wire [15:
0]price_bcd;
fp my_fp(clk,clk_fp,rst_n,stop);
distance_counter dis_counter(clk_fp,rst_n,stop,distance);
price_counter price_coun(clk_fp,rst_n,stop,price,distance);
yimaqi distance_BCD(distance,distan_bcd,clk_fp);
yimaqi price_BCD(price,price_bcd,clk_fp);
dispaly_myaa(clk_fp,distan_bcd,seg1,seg2,seg3,seg4);
dispaly_mybb(clk_fp,price_bcd,time1,time2,time3,time4);
endmodule
4.2 分频模块
module fp(
clk,clk_fp,rst_n,stop
);//50mhz
input clk;
input rst_n;
input stop;
output clk_fp;
reg [25:
0] counter;
reg clk_fp;
always@(posedge clk or negedge rst_n or negedge stop)
begin
if(!
rst_n)
begin
clk_fp<=1'd0;
counter<=26'd0;
end
else if(!
stop)
begin
counter<=counter;
end
else
begin
if(counter==26'd49_999_999)
begin
clk_fp<=1'b1;
counter<=1'b0;
end
else
begin
clk_fp<=1'b0;
counter<=counter+1'b1;
end
end
end
endmodule
4.3 里程计算模块
clk_fp,rst_n,stop,distance
);
input clk_fp;//1S
input rst_n;
input stop;
output [15:
0]distance;
reg [15:
0]distance;
always@(posedge clk_fp or negedge rst_n)
begin
if(!
rst_n)
distance<=8'd0;
else if(!
stop)
distance<=distance;
else
distance<=distance+5'd10;
end
endmodule
4.4 价格计算模块
module price_counter(
clk_fp,rst_n,
stop,price,distance
);
input clk_fp;//1S
input rst_n;
input stop;
input [15:
0]distance;
output [15:
0]price;
reg [15:
0]price;
always@(posedge clk_fp or negedge rst_n or negedge stop)
begin
if(!
rst_n)
price<=8'd0;
else if(!
stop)
price<=price;
else
if(distance<=30)
price<=16'd70;
else if(distance<=90&&30price<=price+16'd22;
else
price<=price+16'd33;
end
endmodule
4.5 译码模块
module yimaqi(
num_hex,BCD,clk_fp
);
input [15:
0]num_hex;
input clk_fp;
output [15:
0]BCD;
reg [15:
0]BCD;
reg [3:
0] yima [3:
0];
always@(posedge clk_fp)
begin
yima[0]<=(num_hex)%10;
yima[1]<=( num_hex/10)%10;
yima[2]<=(num_hex/100)%10;
yima[3]<=(num_hex/1000)%10;
BCD<={yima[3],yima[2],yima[1],yima[0]};
end
endmodule
4.6 显示器模块
clk_fp,BCD,seg1,seg2,
seg3,seg4
);
input clk_fp;
input [15:
0] BCD;
output [6:
0]seg1;
output [6:
0]seg2;
output [6:
0]seg3;
output [6:
0]seg4;
reg [7:
0] seg1;
reg [7:
0] seg2;
reg [7:
0] seg3;
reg [7:
0] seg4;
reg [3:
0]shumaguan_aa[3:
0];
always shumaguan_aa[0]<=BCD[3:
0];
always shumaguan_aa[1]<=BCD[7:
4];
always shumaguan_aa[2]<=BCD[11:
8];
always shumaguan_aa[3]<=BCD[15:
12];
parameter seg_num0=7'hC0,
seg_num1=7'hF9,
seg_num2=7'hA4,
seg_num3=7'hB0,
seg_num4=7'h99,
seg_num5=7'h92,
seg_num6=7'h82,
seg_num7=7'hF8,
seg_num8=7'h80,
seg_num9=7'h90;
always@(posedge clk_fp)
begin
case(shumaguan_aa[0])
4'd0:
seg1<=seg_num0;
4'd1:
seg1<=seg_num1;
4'd2:
seg1<=seg_num2;
4'd3:
seg1<=seg_num3;
4'd4:
seg1<=seg_num4;
4'd5:
seg1<=seg_num5;
4'd6:
seg1<=seg_num6;
4'd7:
seg1<=seg_num7;
4'd8:
seg1<=seg_num8;
4'd9:
seg1<=seg_num9;
default:
seg1<=seg_num0 ;
endcase
case(shumaguan_aa[1])
4'd0:
seg2<=(seg_num0&7'b0111_1111);
4'd1:
seg2<=(seg_num1&7'b0111_1111);
4'd2:
seg2<=(seg_num2&7'b0111_1111);
4'd3:
seg2<=(seg_num3&7'b0111_1111);
4'd4:
seg2<=(seg_num4&7'b0111_1111);
4'd5:
seg2<=(seg_num5&7'b0111_1111);
4'd6:
seg2<=(seg_num6&7'b0111_1111);
4'd7:
seg2<=(seg_num7&7'b0111_1111);
4'd8:
seg2<=(seg_num8&7'b0111_1111);
4'd9:
seg2<=(seg_num9&7'b0111_1111);
default:
seg2<=(seg_num0&7'b0111_1111 );
endcase
case(shumaguan_aa[2])
4'd0:
seg3<=seg_num0;
4'd1:
seg3<=seg_num1;
4'd2:
seg