EDA课程设计 带报警的99分钟定时器 分频器
课程设计报告
设计名称EDA(VHDL)课程设计
专业班级电子0841
姓名陈启
学号0804451101
成绩评定
电气与信息工程学院
二0一一年一月
课程设计要求和成绩考核办法
(要求和成绩考核办法在封皮背面打印)
1.不允许在教室或实验室内吸烟、吃零食,不准带无关人员到教室或实验室活动,否则扣平时表现分。
2.凡病事假超过3天(每天7小时),或迟到早退三次以上,或旷课两次(1天)以上,不得参加本次考核,按不及格处理,本次课程设计不能通过。
3.病事假必须有请假条,需经班主任或有关领导批准,否则按旷课处理。
4.课程设计的考核由指导教师根据设计表现(出勤、遵守纪律情况等)、设计报告、设计成果、答辩等几个方面,给出各项成绩或权重,综合后给出课程设计总成绩。该设计考核须经教研室主任审核,主管院长审批备案。
5.成绩评定采用五级分制,即优、良、中、及格和不及格。
6.课程设计结束一周内,指导教师提交成绩和设计总结。
7.设计过程考核和成绩在教师手册中要有记载。
实习报告要求
实习报告内容、格式各专业根据实习(设计)类别(技能实习、认识实习、生产实习、毕业实习等)统一规范,经教研室主任审核、主管院长审批备案。
注意:
1.课程设计任务书和指导书在课程设计前发给学生,设计任务书放置在设计报告封面后和正文目录前。
2.为了节省纸张,保护环境,便于保管设计报告,统一采用A4纸,课程设计报告建议双面打印(正文采用宋体五号字)或手写,左侧装订,订两个钉。
课程设计任务书
设计名称EDA(VHDL)课程设计专业班级电子0841、2
指导教师林海波、吕晓丽
起止日期2011.1.4 – 2011.1.14
设计地点一教EDA室(408)
电气与信息工程学院
课程设计任务书
进度计划表
注意:答辩验收时将根据老师现场提出的要求来改动,有关VHDL的基础知识、MaxplusⅡ操作和FPGA等内容将会被抽问,如果没能达到指定要求将不能及格。成绩将根据出勤率、具体题目的难度、答辩和操作情况、设计报告是否有雷同和抄袭现象以及报告是否规范等考核标准酌情况给分。
实验一基于FPGA的半整数分频器设计
一.系统设计任务及功能概述
1.系统设计任务基于FPGA的半整数分频器设计
任务要求:设有一个5MHz(或7、9、11、13、15、17、19、21、23 、25MHz)的时钟源,但电路中需要产生一个2MHz的时钟信号,由于分频比为2.5(或3.5、4.5、5.5、6.5、7.5、8.5、9.5、10.5、11.5、12.5),因此采用小数分频。
2.小数分频的基本原理
小数分频的基本原理是采用脉冲吞吐计数器和锁相环技术先设计两个不同分频比的整数分频器,然后通过控制单位时间内两种分频比出现的不同次数来获得所需要的小数分频值。如设计一个分频系数为10.1的分频器时,可以将分频器设计成9次10分频,1次11分频,这样总的分频值为:F=(9×10+1×11)/(9+1)=10.1
3.系统功能概述
本系统是一个基于FPGA的半整数分频器,具有以下功能:有一个5MHz的时钟源,通过半整数分频器后电路中可以产生的是一个2MHz的时钟信号
二.系统设计方案和程序设计
1.系统设计方案
下图给出
再利用原
entity counter3 is
port (clk ,reset ,en :in std_logic;
qa ,qb :out std_logic);
end counter3;
architecture behavior of counter3 is
signal count :std_logic_vector(1 downto 0); --定义信号count传递计数器的值
begin
process (reset ,clk) --进程开始实现复位和模三计数功能
begin
if reset = '1'then
count (1 downto 0)<="00";
else
if (clk'event and clk = '1') then
if (en = '1') then
if (count = "10") then
count<="00";
else
count<=count + 1 ; --加1计数
end if ;
end if ;
end if ;
end if ;
end process ;
qa<=count (0) ;
qb<=count (1) ;
end behavior ;
3.模三计数器仿真波形图
4.输入、输出接口说明
5.模三计数器元件图
6.半整数分频器原理图
7.半整数分频器仿真波形图
三.课程设计总结
通过本次实验用计算机操作的形式编辑计数器程序和绘制出了利用计数器原理的分频器原理图,了解了利用软件绘制原理图和编程的方法,以及用计算机形象的仿真计数器和分频器的波形,在实验中通过形象的方法结合图形进行分析把在书上学习的理论知识进行实践。不仅更好的理解和掌握了用软件设计图形和运行仿真的方法,也通过实验把理论知识转化为实际的图形加以理解,更好的理解和掌握了此方面的知识。为以后的实践积累了经验。
四.参考文献
[1] 谭会生,张昌凡.EDA技术及应用. 西安:西安电子科技大学出版社,2006,12.
[2] 潘松,王国栋编著.VHDL实用教程. 成都:电子科技大学出版社,2006.
[3] 徐志军,徐光辉编著.CPLD/FPGA的开发与应用. 北京:电子工业出版社.2002.
[4] 杨晓慧,杨永健.基于FPGA的EDA/SOPC技术与VHDL.北京:国防工业出版社,2007,7.
[5] 王诚,吴继华等,ALTERA FPGA/CPLD设计(基础篇).北京:人民邮电出版社,2008,12.
[6] 陈雪松,滕立中编著.VHDL入门与应用.北京:人民邮电出版社. 2000.
实验二99分钟定时器的VHDL设计
一.系统设计任务及功能概述
1.系统设计任务
任务要求:通过设计,定时器可以整体清零;可以定时最高到99MIN;以秒速度递增至预定时间,以秒速度递减至零。
2.系统功能概述
本系统是一个99分钟的定时器,具有以下功能:
具有整体清零(reset)功能,定时99分钟。以秒速度递增至99分钟停止,启动报警(cout)5秒钟。具有置位(cn)控制,即cn高电平时,clk脉冲上升沿到来,计数加一;cn低电平时,置位结束,进入倒计时阶段,以秒速度使输出计数减一至零结束,并同时报警(cout)5秒钟。时钟信号提供秒信号(1HZ);四位数码管静态显示,高位high(3 downto 0)显示分,低位low(3 downto 0)显示秒。
二.系统设计方案和程序设计
1.系统设计方案
通过记数器控制中心输入秒信号,并输出两个四位的BCD码,可分别来表示各位与十位,也可整体复位清零。通过该记数器实现以秒速度递增至清零,该记数器以秒的速度递增至99来实现置位,而以秒的速度递减至零以实现定时功能。当以秒速度递增至99分钟停止,启动报警(cout)5秒钟。cn低电平时,置位结束,进入倒计时阶段,以秒速度使输出计数减一至零结束时也同时报警(cout)5秒钟。通过二选一选择器对个位和十位进行扫描输出,并将输出送到译码器,通过译码器对输入的四位BCD 码进行七段码编译,然后输出到数码管。
2.VHDL程序设计
Aaa控制计数模块,是该定时器的核心部分.res为复位端,用来清零,采用异步复位方式;cn用于置位,高电平有效。cout端将在定时结束时产生高电平。Low和high为四位BCD码输出端口,可用于显示。当cn有效时,clk脉冲上升沿到来,计数加1;当cn为低电平时,置位结束,进入计时阶段,每1个时钟周期发出一个脉冲,使输出记数减1,直到记时结束,令cout位为高电平为止。该模块的源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity aaa is
port (cn,res,clk:in std_logic;
cout :out std_logic;
flow,fhigh,mlow,mhigh:out std_logic_vector(3 downto 0));
end aaa;
architecture art of aaa is
signal fdisplow,fdisphigh,mdisplow,mdisphigh:std_logic_vector(3 downto 0); --定义信号分别表示分钟和秒钟的十位和个位
begin
process(clk,cn,res)
begin
if(res='0')then
mdisplow<="0000";
mdisphigh<="0000";
fdisplow<="0000";
fdisphigh<="0000";
cout<='0'; --res低电平执行复位
elsif (clk'event and clk='1')then
if cn='1'then
if mdisplow<9 then
mdisplow<=mdisplow+1;--秒钟个位数小于9时执行计数加1
cout<='0';
elsif mdisplow="1001" and mdisphigh<5 then
mdisplow<="0000";
mdisphigh<=mdisphigh+1;--秒钟十位进位加1
elsif mdisphigh="0101" and fdisplow<9 then
mdisplow<="0000";
mdisphigh<="0000";
fdisplow<=fdisplow+1;--满59秒后分钟个位加1
elsif fdisplow="1001" and fdisphigh<9 then
mdisplow<="0000";
mdisphigh<="0000";
fdisplow<="0000";
fdisphigh<=fdisphigh+1;--满9分59秒后分钟十位加1
elsif fdisplow="1000" and fdisphigh="1001" then
mdisplow<="0000";
mdisphigh<="0000";
fdisplow<="1001";--计时至99分停止
elsif fdisplow="1001" and fdisphigh="1001" then
cout<='1';--计时停止cout变为高电平
end if;
elsif cn='0' then—cn为0进入倒计时
if mdisplow>0 then
mdisplow<=mdisplow-1;--秒钟减1
cout<='0';
elsif mdisplow="0000" and mdisphigh>0 then
mdisplow<="1001";
mdisphigh<=mdisphigh-1;--个位0时十位减1
elsif mdisphigh="0000" and fdisplow>0 then
mdisplow<="1001";
mdisphigh<="0101";
fdisplow<=fdisplow-1;--分减1
elsif fdisplow="0000" and fdisphigh>0 then
mdisplow<="1001";
mdisphigh<="0101";
fdisplow<="1001";
fdisphigh<=fdisphigh-1;--分减10
elsif fdisphigh="0000"and fdisplow="0000"and mdisphigh="0000"and mdisplow="0000"then
cout<='1';--倒计时结束cout变为高电平
end if;
end if;
end if;
end process;
mhigh<=mdisphigh;
mlow<=mdisplow;
fhigh<=fdisphigh;
flow<=fdisplow;
end art;end art;
Aaa控制计数模块仿真波形图
译码器disp是对四位BCD码进行七段码译码,其输出Q0~Q6分别接数码管各段进行显示输出,它的操作源程序如下:
library ieee;
use ieee.std_logic_1164.all;
entity disp is
port(a:in std_logic_vector(3 downto 0);
p:out std_logic_vector(6 downto 0));
end disp;
architecture disp_arc of disp is
begin
process(a)
begin
case a is
when"0000"=>p<="0111111";
when"0001"=>p<="0000110";
when"0010"=>p<="1011011";
when"0011"=>p<="1001111";
when"0100"=>p<="1100110";
when"0101"=>p<="1101101";
when"0110"=>p<="1111101";
when"0111"=>p<="0000111";
when"1000"=>p<="1111111";
when"1001"=>p<="1101111";--七段译码器显示0—9
when others=>p<="0000000";
end case;
end process;
end disp_arc;
译码器disp仿真波形图
报警器模块主要功能是计数定时器以秒速度递增至99分钟停止时启动报警(cout)5秒钟。倒计时阶段,计时器以秒速度使输出计数减一至零结束时也同时报警(cout)5秒钟。它的操作源程序如下:library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity cou5 is
port(clk,reset,en:in std_logic;
speak:out std_logic);
end cou5;
architecture behavior of cou5 is
signal count:std_logic_vector(2 downto 0);--定义计数信号
begin
process(reset,clk)
begin
if reset='1' or en='0' then
count(2 downto 0)<="000";
speak<='0';--有复位信号或始能端低电平时输出0
else
if(clk'event and clk='1')then
count<=count+1;
speak<='1';--有时钟上升沿计数加1,报警信号speak高电平
if count="101"then
speak<='0';
count<="101";--5秒之后停止报警speak为0
end if;
end if;
end if;
end process;
end behavior;
报警器模块仿真波形图
根据定时器要实现的功能对以上程序进行元件例化,例化程序如下:
定时器例化程序
library ieee;
use ieee.std_logic_1164.all;
entity dsq is
port(sna,resa,clka,resb,clkb: in std_logic;
myimal:out std_logic_vector(6 downto 0); --秒钟个位译码输出 myimah:out std_logic_vector(6 downto 0); --秒钟十位译码输出 fyimal:out std_logic_vector(6 downto 0); --分钟个位译码输出 fyimah:out std_logic_vector(6 downto 0); --分钟十位译码输出 baoj:out std_logic
);
end entity dsq;
architecture art of dsq is
component aaa is
port (cn,res,clk:in std_logic;
cout :out std_logic;
flow,fhigh,mlow,mhigh:out std_logic_vector(3 downto 0)); end component aaa; --aaa控制模块
component disp is
port(a:in std_logic_vector(3 downto 0);
p:out std_logic_vector(6 downto 0));
end component disp;--译码模块
component cou5 is
port(clk,reset,en:in std_logic;
speak:out std_logic);
end component cou5;--报警模块
signal s1,s2,s3,s4:std_logic_vector(3 downto 0);
signal s5:std_logic;
begin
u1:aaa port map(sna,resa,clka,s5,s1,s2,s3,s4);
u2:disp port map(s1,fyimal);
u3:disp port map(s2,fyimah);
u4:disp port map(s3,myimal);
u5:disp port map(s4,myimah);
u6:cou5 port map(clkb,resb,s5,baoj);--各模块通过位置关联
end architecture art;
定时器仿真波形图
3.输入、输出接口说明
三.课程设计总结
在前一个实验的基础上,我这两天又天做了一个定时器,通过这一次的实验我有了很大的收获,设计了多个模块以最后实现定时器功能,对各个模块和最后例化程序进行仿真,通过观察仿真波形图来判断程序设计的正确性。在编程和仿真的过程中虽然遇到了很多的问题,但是在老师和同学的帮助下在查阅了多方面的资料和书籍后都迎刃而解。巩固了自己的理论知识锻炼了自己的实际动手编程能力。更深刻的掌握和理解了用计算机语言编程的方法和要点。并通过自己亲自动手操作掌握了用计算机软件运行和仿真程序,更好的练习了用软件来实现实验程序的方法。
四.参考文献
[1] 谭会生,张昌凡.EDA技术及应用. 西安:西安电子科技大学出版社,2006,12.
[2] 潘松,王国栋编著.VHDL实用教程. 成都:电子科技大学出版社,2006.
[3] 徐志军,徐光辉编著.CPLD/FPGA的开发与应用. 北京:电子工业出版社.2002.
[4] 杨晓慧,杨永健.基于FPGA的EDA/SOPC技术与VHDL.北京:国防工业出版社,2007,7.
[5] 王诚,吴继华等,ALTERA FPGA/CPLD设计(基础篇).北京:人民邮电出版社,2008,12.
[6] 陈雪松,滕立中编著.VHDL入门与应用.北京:人民邮电出版社. 2000.