EDA课程设计-计步器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息科学与技术学院《EDA技术使用教程》
课程设计报告
题目名称:计步器设计
****:**
学号:**********
专业年级:电信2012级2班
指导教师:张锐敏老师
时间:2015年1月3日
目录
三、设计内容 (4)
3.1系统分析 (4)
3.2方案设计 (5)
3.3电路模块选择 (5)
3.3.1检测上升沿模块 (6)
3.3.2计数模块 (7)
3.3.3扫描输出模块 (8)
3.3.4输入输出信号模块 (10)
四、程序设计 (10)
五、仿真结果 (15)
5.1仿真截图 (15)
5.2结果分析 (17)
六、遇到的问题 (17)
七、设计心得 (18)
八、参考文献 (20)
计步器的设置
一、设计背景
从我国的电子计步器市场发展来看,近几年随着行业需求市场的进一步增长,电子计步器呈现良好的发展态势。
而随着人民生活水平的逐步提高,大家更加注重身体健康,锻炼在日常生活中显得尤为重要,而计步器就成为了大家比较青睐的锻炼伙伴。
此次交计步器的设计采用基于Verilog HDL语言和FPGA的方法来实现所要求的功能。
基于FPGA的计步器设计方法具有设计的灵活性,易于修改,设计周期短等纵多优点。
随着设计语言、电子设计自动化和FPGA期间的不断发展,基于FPGA期间的不断完善和发展。
在不远的将来。
由FPGA设计的产品将越来越普遍。
二、设计要求
通过对设计的模块划分,以及各模块功能的定义,以FPGA为核心器件,用VHDL设计手段制作、用硬件描述性语言编写程序实
现设计中各个模块的基本功能,完成其功能仿真和编译并生成底层模块,在Quartus中完成顶层设计并编译通过,完成设计下载并调试电路。
1)系统时钟1MHz;
2)拥有计步、暂停、清零(复位)功能;
3)输入端每进入一个计步脉冲(可能存在抖动),步数
计数+1,计步结果以十进制数显示在数码管上;
4)点下暂停键,计数停止,并有信号控制指示灯闪烁,
闪烁周期1s;再次点击暂停键,继续计数,指示灯停止闪
烁;
5)点下清零键,计数归零;
6)要求能够对计步脉冲和按键的抖动进行正确处理,2ms
以内的变化忽略不计;
7)持续10s无计数脉冲后,自动转入暂停状态,计数停
止,并有信号控制指示灯闪烁,闪烁周期1s;再次点击暂
停键,继续计数,指示灯停止闪烁;
三、设计内容
3.1系统分析
本实验设计完成一个电路来检测目标运动的次数,并在数码管
上显示。
用传感器检测抖动信号,采集到的信号经过放大器放大,将信号转变成方波,编程将信号在 FPGA 方式处理,并将结果送数码管显示。
3.2方案设计
根据设计要求和系统所具有功能,并参考相关的文献资料经行方案设计画出如下所示的计步器系统框图,及为设计的总体方案,框图如下图所示
3.3电路模块选择
本设计因为各个模块功能简单,故直接用内部信号线连接起来形
成一个整体,但是各模块功能简单介绍如下:
3.3.1检测上升沿模块
DIN为实际检测到的抖动信号,通过和D触发器的配合形成计数模块的使能端信号控制计数器的计数过程。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_UNSIGNED.all;
entity jibuqi is
port (din : in std_logic;
clk : in std_logic;
reset: in std_logic;
light:out std_logic_vector(7 downto 0);
en_out:out std_logic_vector(7 downto 0));
end jibuqi;
part1:process(clk,reset)---------D 触发器
begin
if (reset='0') then
b1<='0';
elsif (clk'event and clk='1') then
b1<=din;
end process ;
3.3.2计数模块
当使能信号EN为1时,通过检测上升沿信号实现计数,并将计数信息保存在b5,b6变量内,b5为计数个位值,b6为计数十位值。
part3: process(clk,reset,b4)-------- 计数器模块
begin
if (reset='0') then
b5<=(others=>'0') ;
b6<=(others=>'0');
elsif (clk'event and clk='1') then
if (b4='1') then
if (b5<"1001")then b5<=b5+'1';
elsif (b5>"1000") then b5<=(others=>'0');
if (b6<"1001")then b6<=b6+'1';
elsif (b6>"1000")then b6<=(others=>'0');
end if;
end if;
elsif (b4='0') then
b5<=b5;
end if;
end if;
end process;
3.3.3扫描输出模块
扫描输出模块主要由分频器构成,通过计数器构成的分频器控制电平翻转控制位的选择,以此确定输出十位和个位。
part4:process(clk,reset)-------- 扫描输出模块,控制使能输出
begin
if (reset='0') then
b8<=(others=>'0');
elsif (clk'event and clk='1') then
if (b8<"1111111111111111") then
b8<=b8+'1';
elsif (b8>"1111111111111110") then b8<=(others=>'0'); end if;
end if;
if (b8>"0111111111111111" and b8<"1111111111111111") then b9<='1' ;
elsif (b8<"1000000000000000" and b8>"0000000000000000")
then b9<='0';
end if;
if (b9='1') then en_out<="11111101";
elsif (b9='0') then en_out<="11111110";
end if;
end process ;
part5:process(b9,b5,b6)--------- 扫描输出模块,控制 LED 管
begin
if (b9='0') then plays<=b5;
elsif (b9='1') then plays<=b6;
end if;
case plays is
when"0000"=>light<="11000000";
when"0001"=>light<="11111001";
when"0010"=>light<="10100100";
when"0011"=>light<="10110000";
when"0100"=>light<="10011001";
when"0101"=>light<="10010010";
when"0110"=>light<="10000010";
when"0111"=>light<="11111000";
when"1000"=>light<="10000000";
when"1001"=>light<="10010000";
when others=>light<="11111111";
end case;
end process ;
end Behavioral;
3.3.4输入输出信号模块
din,clk,Reset为输入信号,din为抖动信号,即人体运动时的计步信号,clk为时钟脉冲信号为计数器提供时钟脉冲,Reset 为复位信号,实现计步器复位(清零)。
En,dout(light)为输出信号,En_out为选择显示十位还是个位,dout为计数值,并编码显示在数码管上。
四、程序设计
一个完整的VHDL语言程序通常包括实体(Entity)、结构体、配置、包集合(Package)和库(Library)5个部分组成。
下面
为此次课程设计的源代码。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_UNSIGNED.all;
entity jibuqi is
port (din : in std_logic;
clk : in std_logic;
reset: in std_logic;
light:out std_logic_vector(7 downto 0);
en_out:out std_logic_vector(7 downto 0));
end jibuqi;
architecture Behavioral of jibuqi is
signal b1,b4,b9:std_logic;------- 中间变量
signal b8:std_logic_vector(15 downto 0);------ 分频signal b5,b6:std_logic_vector(3 downto 0);------- 计数输出个位与十位
signal plays:std_logic_vector(3 downto 0);-------- 选择十位或个位
begin
part1:process(clk,reset)---------D 触发器
begin
if (reset='0') then
b1<='0';
elsif (clk'event and clk='1') then
b1<=din;
end if;
end process ;
part2: process(b1,din)------ 比较器与门后输出begin
if ( b1='0' and din='1' ) then
b4<='1' ;
else
b4<='0';
end if;
end process;
part3: process(clk,reset,b4)-------- 计数器模块begin
if (reset='0') then
b5<=(others=>'0') ;
b6<=(others=>'0');
elsif (clk'event and clk='1') then
if (b4='1') then
if (b5<"1001")then b5<=b5+'1';
elsif (b5>"1000") then b5<=(others=>'0');
if (b6<"1001")then b6<=b6+'1';
elsif (b6>"1000")then b6<=(others=>'0');
end if;
end if;
elsif (b4='0') then
b5<=b5;
b6<=b6;
end if;
end if;
end process;
part4:process(clk,reset)-------- 扫描输出模块,控制使能输出
begin
if (reset='0') then
b8<=(others=>'0');
elsif (clk'event and clk='1') then
if (b8<"1111111111111111") then
b8<=b8+'1';
elsif (b8>"1111111111111110") then b8<=(others=>'0'); end if;
end if;
if (b8>"0111111111111111" and b8<"1111111111111111") then b9<='1' ;
elsif (b8<"1000000000000000" and b8>"0000000000000000") then b9<='0';
end if;
if (b9='1') then en_out<="11111101";
elsif (b9='0') then en_out<="11111110";
end if;
end process ;
part5:process(b9,b5,b6)--------- 扫描输出模块,控制 LED 管
begin
if (b9='0') then plays<=b5;
elsif (b9='1') then plays<=b6;
end if;
case plays is
when"0000"=>light<="11000000";
when"0001"=>light<="11111001";
when"0010"=>light<="10100100";
when"0011"=>light<="10110000";
when"0100"=>light<="10011001";
when"0101"=>light<="10010010";
when"0110"=>light<="10000010";
when"0111"=>light<="11111000";
when"1000"=>light<="10000000";
when"1001"=>light<="10010000";
when others=>light<="11111111";
end case;
end process ;
end Behavioral;
五、仿真结果
5.1仿真截图
利用QuartusII软件对本程序进行编译,生成了可以进行仿真定时分析以及下载到可编程器件的相关文件。
仿真结果如图所示
设置好的vwf仿真激励波形文件图仿真输出波形报告
5.2结果分析
通过设定Clk值以及din和Reset的初值,就可以得到如上所示的仿真波形图。
由仿真波形图可以看出波形是由din初值信号触发而显示出各个状态的。
Reset高电平信号输入时,对应en_out选定位选显示对应计数值。
六、遇到的问题
1、问题首先出现在Quartus软件的应用上,一开始把文件名
取名为汉字名“计步器”,出现错误,后来知道,文件必须保存在英文文件夹下。
2、一开始没有注意到程序文件保存时要保存成实体名,VHD
的形式,在编译时出错。
3、在写程序的时候会输错部分关键字或漏掉一些小的标点之
类的,导致编译不通过,需要经过反复查找,所以,觉得在输入程序时就应注意细节,提高一次正确率,避免一些不必要的小错误的发生,起到事半功倍的效果。
4、在编译过程中一定要按照步骤,细心仔细的完成每一个选
项,在这个部分很容易出错。
如果选项错误,那么在时序仿真是会出错。
七、设计心得
通过本次EDA课程设计,由于我们去图书馆查阅了很多书籍,因此获得了很多知识,同时也发现了自己的很
多不足,由于课程设计的时间紧迫,有些瑕疵和漏洞还没
有进一步完善。
但是通过这几天的学习,我还是发现了很
多知识上的漏洞,同时也看到了自己的动手能力还是比较
缺乏、独立思考的意识还不强、理论联系实际的能力还急
需提高。
正是这次课程设计让我学到了很多,我总是想着能动嘴就不动手,因此在实践中总是出现这样那样的问题,
但是在大家的齐心协力下,我们不仅巩固了先前学的EDA
技术的理论知识,而且也培养了我们的动手能力,更令我
的创造性思维得到拓展。
在课程设计中一个人的力量是远
远不够的,真正完成任务需要我们团结一心,互相协作,
在此过程中我得到了师哥师姐们以及同组同学的热心帮
助才最终完成了这个题目,我也曾经因为实践经验的缺乏失落过,也曾经仿真成功而热情高涨。
在设计过程中,我们应该培养自己的独立思考、分析问题的能力。
通过这次的设计,实现了自己动手实践。
实现了理论与实践相结合。
在课下和同学的交流中,我发现我们所欠缺的东西真的很多,需要学习的东西更多,只有一直保持积极向上、激情活力的心,有目标、有理想,并不断为之付出努力,就一定会取得成功。
最后,通过这次的课程设计,还有一点是我们做任何事情都无法缺少的,那就是细心认真。
此次设计我们就深深地体会到了,由于编程的时候没有做到足够的细心,导致一串代码弄混了。
但是密密麻麻的英文字母混在一起,我始终没有发现。
最终在调试的时候,就出现了问题。
只知道出现了问题,就是不知道到问题的根源在哪里,好长时间都没有找出问题的所在。
这也让我真正的明白了,科学的严谨性,它不允许出半点差错,否则后果会是比较麻烦的。
做其他事情也一样,都需要我们付出足够的认真去对待,才能顺利的完成。
书山有路勤为径,学海无涯苦作舟,需要我们学习的地方还很多,我们必须一步一个脚印,踏踏实实,用认真努力的态度,为自己的大学生活添上浓墨重彩的一笔。
八、参考文献
1、《EDA技术使用教程》第四版潘松主编
2、《电子技术与EDA技术课程设计指导》郭朝南主编中南大学出版社
3、《电子线路设计、实验、测试》谢自美主编华中理工出版社。