资源描述
课 程 设 计 报 告
课程名称 数字系统和逻辑设计
课题名称 出租车计费器设计
专 业
班 级
学 号
姓 名
指导老师
7月 7日
湖南工程学院
课 程 设 计 任 务 书
课程名称 数字系统和逻辑设计
课 题 出租车计费器设计
专业班级
学生姓名
学 号
指导老师 乔汇东 胡瑛 谭小兰
审 批 乔汇东
任务书下达日期 年 6月 29日
任务完成日期 年 7月 7日
《数字系统和逻辑设计》课程设计任务书
一 、设计目标
全方面熟悉、掌握VHDL语言基础知识,掌握利用VHDL语言对常见组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序技巧,掌握分析结果若干有效方法,深入提升上机动手能力,培养使用设计综合电路能力,养成提供文档资料习惯和规范编程思想。
二、设计要求
1、设计正确,方案合理。
2、程序精炼,结构清楚。
3、设计汇报5000字以上,含程序设计说明,用户使用说明,源程序清单及程序框图。
4、上机演示。
5、有具体文档。文档中包含设计思绪、设计仿真程序、仿真结果及对应分析和结论。
三、进度安排
第十九周 星期一: 课题讲解,查阅资料
星期二: 总体设计,具体设计
星期三: 编程,上机调试、修改程序
星期四: 上机调试、完善程序
星期五: 答辩
星期六-星期天:撰写课程设计汇报
附:
课程设计汇报装订次序:封面、任务书、目录、正文、评分、附件(A4大小图纸及程序清单)。
正文格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文内容:一、课题关键功效;二、课题功效模块划分(要求画出模块图);三、关键功效实现;四、系统调试和仿真;五、总结和体会;六、附件(全部程序原代码,要求对程序写出必需注释);七、评分表。
目 录
一. 系统总体设计 1
1.1 问题描述 1
1.2 设计思想 1
1.3 引脚分配 1
二.出租车计费功效实现 2
2.1 系统总体框图 2
2.2 程序步骤图 3
2.3 系统各功效模块实现 4
四. 调试和仿真 8
五. 总结和体会 9
六. 附件 10
七. 评分表 15
一. 系统总体设计
1.1 问题描述
出租车计费器通常全部是按公里计费,通常是起步价xx 元(xx 元能够行走x公里),然后再是xx 元/公里。要完成一个出租车计费器,就要有两个计数单位,一个用来计公里,另外一个用来计费用。通常在出租车轮子上全部有传感器,用来统计车轮转动圈数,而车轮子周长是固定,所以知道了圈数自然也就知道了里程。在这个试验中,就要模拟出租车计费器工作过程,用直流电机模拟出租车轮子,经过传感器,能够得到电机每转一周输出一个脉冲波形。 (有条件同学再完成:显示用8 个七段码管,前四个显示里程,后四个显示费用。)
1.2 设计思想
该出租车计费器按下开关S1后开始计费和计里程数,起步价是3元,准行1公里,以后1元/公里。时钟输入为一个1KHz系统时钟,直流电机模块每转一圈输出一个脉冲信号给CPU,另外用按键模块S1 来作为整个系统复位按钮,每复位一次,计费器从头开始计费。直流电机模块用来模拟出租车车轮子,每转动一圈认为是行走1 米,所以每旋转1000 圈,认为车子前进1 公里。系统设计是需要检测电机转动情况,每转1000圈,分频模块输出一个上升沿信号。车费和里程数在一个8位7段数码管上显示,前4位显示里程,后4位显示费用。
1.3 引脚分配
显示:
动态八位七段数码管模块
动态八位七段数码管模块
数码管端口名称
FPGA 引脚
说明
7SEG-A
C8
显示内容控制
7SEG-B
C9
显示内容控制
7SEG-C
C7
显示内容控制
7SEG-D
C6
显示内容控制
7SEG-E
D6
显示内容控制
7SEG-F
D9
显示内容控制
7SEG-G
D8
显示内容控制
7SEG-DP
D7
显示内容控制
7SEG-SEL0
A21
显示位置控制
7SEG-SEL1
B21
显示位置控制
7SEG-SEL2
A22
显示位置控制
7SEG-SEL3
D5
显示位置控制
7SEG-SEL4
C4
显示位置控制
7SEG-SEL5
B22
显示位置控制
7SEG-SEL6
A19
显示位置控制
7SEG-SEL7
B19
显示位置控制
时钟:
Clk
N1
直流电机脉冲输入:
pulse
AE13
一圈一个脉冲
复位按键
RST
J7
按键S1
二.出租车计费功效实现
2.1 系统总体框图
该出租车计费系统由三个模块组成,分别是:
计费模块:计算应付车费
计程模块:计录已行里程
显示模块:将应付车费和已行里程显示在数码管上
各模块之间关系为:
2 程序步骤图
计算旅程框图:
q1<=0;q2<=0;
q3<=0;q4<=0;
S1=’1’
meter'event and meter='1'
money_cn3~money_cn1代表4位十进制数加1
meter信号发生改变
图2 计算旅程框图
计算出租车计费框图:
a1<=0;a2<=0;
a3<=0;a4<=3;
S1=1
q1<=q1+1'
A1,a2,a3,a4代表4位十进制数加1
q1信号发生改变
图3 计费框图
2.3 系统各功效模块实现
计算距离模块:
REG:PROCESS(s1,meter)
begin
if s1='1' then
q1<=0;
q2<=0;
q3<=0;
q4<=0;
elsif meter'event and meter='1' then --clk'event and clk='1' then
if q4=9 then
q4<=0;
if q3=9 then
q3<=0;
if q2=9 then
q2<=0;
q1<=q1+1;
else
q2<=q2+1;
end if;
else
q3<=q3+1;
end if;
else
q4<=q4+1;
end if;
end if;
--end if;
end process REG;
计费距离模块:
COM:process( q1)
begin
if q1<7 then
a4<=q1+3;
else if q1=7 then
a4<=0;
if a3=9 then
a3<=0;
if a2=9 then
a2<=0;
a1<=a1+1;
else
a2<=a2+1;
end if;
else
a3<=a3+1;
end if;
else if q1=8 then
a4<=1;
if a3=9 then
a3<=0;
if a2=9 then
a2<=0;
a1<=a1+1;
else
a2<=a2+1;
end if;
else
a3<=a3+1;
end if;
else if q1=9 then
a4<=2;
if a3=9 then
a3<=0;
if a2=9 then
a2<=0;
a1<=a1+1;
else
a2<=a2+1;
end if;
else
a3<=a3+1;
end if;
end if;
end if;
end if;
end if;
end process COM;
显示模块:
CAM:process(clk)
begin
if clk'event and clk='1' then
cout<=cout+1;
end if;
end process CAM;
pra:process(cout)
begin
case cout is
when "000"=> wx<="10000000";shuju<=q1;
when "001"=> wx<="01000000";shuju<=q2;
when "010"=> wx<="00100000";shuju<=q3;
when "011"=> wx<="00010000";shuju<=q4;
when "100"=> wx<="00001000";shuju<=a1;
when "101"=> wx<="00000100";shuju<=a2;
when "110"=> wx<="00000010";shuju<=a3;
when "111"=> wx<="00000001";shuju<=a4;
end case;
end process pra;
process(shuju)
begin
case shuju is
when 0=>duan<="0111111"; --0
when 1=>duan<="0000110"; --1
when 2=>duan<="1011011"; --2
when 3=>duan<="1001111"; --3
when 4=>duan<="1100110"; --4
when 5=>duan<="1101101"; --5
when 6=>duan<="1111101"; --6
when 7=>duan<="0000111"; --7
when 8=>duan<="1111111"; --8
when 9=>duan<="1101111"; --9
when others=>null;
end case;
end process;
四. 调试和仿真
在调试过程中,出现了很多问题,在编译时出现同时赋值现象:
图4 同时赋值现象
在程序使用软件仿真时,出现了问题;开始使用10进制数进行仿真时因为在计费时,开始不适应复位信号,就会出现几公里几块钱,一但经过复位以后程序使用就正常了,这是有和我在使用时没有复位时,不给初值一样,以后经过修改以后就正常了。
图5 计费仿真
图6 距离仿真
图7 出租车计费仿真
五. 总结和体会
经过这次担心而又充实EDA课程设计,我感受到了VHDL语言和一般软件语言之间区分,也能够愈加熟练地利用VHDL语言进行逻辑电路设计了,受益匪浅。在没有进行课程设计之前,我们上机实践历来没有编写过规模如此数字电路系统,最多就写写什么半加器,全加器之类小型实体。而这次课程设计要想实现课题要求功效,必需将若干小型实体组合成一个相对大型实体。不仅如此,在写完程序后,还要把程序下载到芯片内,连接对应电子器件,观察真正效果。所以,经过这次担心课程设计,我体会了从开始利用VHDL语言编程到把设想放到真正在电子器件上实现全部过程,提升了自己从事工程项目设计能力。
另外,在课程设计过程,我碰到了很多棘手难题,即使也进行了苦思冥想,却还是得不四处理方法,有时也有想放弃念头,不过最终还是坚持了下来,完成了任务,我意识到以后不管是在工作还是学习中,做工程项目全部需要有忍耐力和坚持。
结果关键,过程更是我们学习宝贵经验。课程设计不仅是学习一门课,更能够锻炼我们实践能力,动手操作能力,和处理问题能力。能够将课堂上所学知识灵活、巧妙利用到实践操作上是一次很好体验,和机会。不仅锻炼路我们动手能力,而且加深了对书本了解和填补了书本上所不能包含到东西。所以在对待每一次课程设计时我全部很认真,也最终经过自己努力最终完成了此次课程设计。
六. 附件
程序源代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY eda IS
PORT(clk : IN STD_LOGIC; --外部时钟输入口
meter : IN STD_LOGIC; -- 外部转圈信号输入,假定每个上升沿视为车轮转一圈
S1 : IN STD_LOGIC; -- 外部按键输入复位信号,假定低电平表示按键被按下,高电平表示按键未按下
wx:out std_logic_vector(7 downto 0);
cost1,cost2,cost3,cost4 :out integer range 0 to 9; --输出计费值个位十位百味
dist1,dist2,dist3,dist4 : out integer range 0 to 9); --输出公里数小数点后一位,个位,十位
END entity;
architecture behav of eda is
signal q1,q2,q3,q4:integer range 0 to 9; --
signal a1,a2,a3,a4:integer range 0 to 9;
signal cout:STD_LOGIC_VECTOR (2 DOWNTO 0);
--signal wx:std_logic_vector(7 downto 0);
signal shuju:integer range 0 to 9; --控制旅程和计费数据显示位置
signal duan:std_logic_vector(6 downto 0); ---控制数码管显示输出
begin
REG:PROCESS(s1,meter) --计算旅程
begin
if s1='1' then
q1<=0;
q2<=0;
q3<=0;
q4<=0;
elsif meter'event and meter='1' then --clk'event and clk='1' then
if q4=9 then
q4<=0;
if q3=9 then
q3<=0;
if q2=9 then
q2<=0;
q1<=q1+1;
else
q2<=q2+1;
end if;
else
q3<=q3+1;
end if;
else
q4<=q4+1;
end if;
end if;
--end if;
end process REG;
COM:process( q1) --计算出租车计费
begin
if q1<7 then
a4<=q1+3;
else if q1=7 then
a4<=0;
if a3=9 then
a3<=0;
if a2=9 then
a2<=0;
a1<=a1+1;
else
a2<=a2+1;
end if;
else
a3<=a3+1;
end if;
else if q1=8 then
a4<=1;
if a3=9 then
a3<=0;
if a2=9 then
a2<=0;
a1<=a1+1;
else
a2<=a2+1;
end if;
else
a3<=a3+1;
end if;
else if q1=9 then
a4<=2;
if a3=9 then
a3<=0;
if a2=9 then
a2<=0;
a1<=a1+1;
else
a2<=a2+1;
end if;
else
a3<=a3+1;
end if;
end if;
end if;
end if;
end if;
end process COM;
------------------------------------------------------------ 计费 旅程显示输出
CAM:process(clk)
begin
if clk'event and clk='1' then
cout<=cout+1;
end if;
end process CAM;
pra:process(cout) --控制旅程和计费输出位置
begin
case cout is
when "000"=> wx<="10000000";shuju<=q1;
when "001"=> wx<="01000000";shuju<=q2;
when "010"=> wx<="00100000";shuju<=q3;
when "011"=> wx<="00010000";shuju<=q4;
when "100"=> wx<="00001000";shuju<=a1;
when "101"=> wx<="00000100";shuju<=a2;
when "110"=> wx<="00000010";shuju<=a3;
when "111"=> wx<="00000001";shuju<=a4;
end case;
end process pra;
process(shuju) --数码管显示
begin
case shuju is
when 0=>duan<="0111111"; --0
when 1=>duan<="0000110"; --1
when 2=>duan<="1011011"; --2
when 3=>duan<="1001111"; --3
when 4=>duan<="1100110"; --4
when 5=>duan<="1101101"; --5
when 6=>duan<="1111101"; --6
when 7=>duan<="0000111"; --7
when 8=>duan<="1111111"; --8
when 9=>duan<="1101111"; --9
when others=>null;
end case;
end process;
dist1<=q1;
dist2<=q2;
dist3<=q3;
dist4<=q4;
cost1<=a1;
cost2<=a2;
cost3<=a3;
cost4<=a4;
end behav;
七. 评分表
计算机和通信学院课程设计评分表
课题名称: 数字系统和逻辑设计
项 目
评 价
设计方案合理性和发明性
设计和调试结果
设计说明书质量
答辩陈说和回复问题情况
课程设计周表现情况
综合成绩
老师署名:
日 期:
展开阅读全文