您好,欢迎来到华佗健康网。
搜索
您的当前位置:首页32进制同步减法计数器设计

32进制同步减法计数器设计

来源:华佗健康网
课题名称 设计内容及要求 设计工作量 32进制同步减法计数器设计 试设计一个32进制同步减法计数器,输入的数字信号由实验装置上的开关给定,输出由LED完成,同时数码管也显示输入和输出的数字信号。要求设置2个按钮,一个供“开始” 用,一个供系统“复位”用。系统提供50MHZ频率的时钟源。完成该系统的硬件和软件的设计,并制作出实物装置,调试好后并能实际运用(指导教师提供制作所需的器件),最后就课程设计本身提交一篇课程设计说明书。 1、VHDL语言程序设计; 2、波形仿真; 3、在实验装置上进行硬件测试,并进行演示; 4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序分析、仿真分析、硬件测试、调试过程,参考文献、设计总结等。 起止日期(或时间量) 第1天 第2天 设计内容(或预期目标) 课题介绍,答疑,收集材料 设计方案论证 进一步讨论方案, 对设计方案进行必要的修正,方案确定后开始进行VHDL语言程序设计 设计VHDL语言程序 在实验装置上进行硬件测试,对VHDL语言程序进行必要的修正,并进行演示 编写设计说明书 年 月 日 年 月 日 备注 进度安排 第3天 第4天 第5~9天 第10天 教研室 意见 系(部)主管领导意见

目录

一、设计目的 ...................................................................................................................................... 1 二、设计原理 ...................................................................................................................................... 1 三、设计 .............................................................................................................................................. 1 3.1设计思路 .................................................................................................................................... 1 3.2设计步骤 .................................................................................................................................... 1 四、QuartusⅡ9.0操作步骤 ............................................................................................................... 3 五、程序 .............................................................................................................................................. 4 5.1完整程序 .................................................................................................................................... 4 5.2仿真程序 .................................................................................................................................... 8 六、仿真 ............................................................................................................................................ 12 6.1仿真结果 .................................................................................................................................. 12 6.2仿真结果分析 .......................................................................................................................... 12 七、引脚分配 .................................................................................................................................... 13 八、课程设计总结 ............................................................................................................................ 14 参考文献 ............................................................................................................................................ 15

一、设计目的

1)巩固和加深对“EDA技术””的基本知识的理解,提高综合运用本课程所学知识的能力。 2)培养学生根据课题需要选学参考书籍、查阅手册、图表和文献资料的自学能力。通过思考,深入钻研相关问题,学会自己分析解决问题的方法。

3)培养硬件设计、软件设计及系统软、硬件调试的基本思路、方法和技巧,并能熟练使用当前较流行的一些有关电路设计与分析的软件和硬件。

二、设计原理

计数是一种最简单基本的运算,计数器就是实现这种运算的逻辑电路,计数器在数字系统中主要是对脉冲的个数进行计数,以实现测量、计数和控制的功能,同时兼有分频功能,计数器是由基本的计数单元和一些控制门所组成,计数单元则由一系列具有存储信息功能的各类触发器构成,这些触发器有RS触发器、T触发器、D触发器及JK触发器等。按照计数器中的触发器是否同时翻转分类,可将计数器分为同步计数器和异步计数器两种。

本次设计是32进制同步减法计数器。32进制的二进制范围为“00000”到“11111”,即十进制0~31。当显示的数小于31时,数字将自减,减至0时又跳会预先输入的数,如此循环。系统提供50MHZ频率的时钟源,输入的数字信号由实验装置上的开关给定,输出由LED完成,同时数码管显示输入和输出的数字信号。设置2个按钮,一个作“开始” ,即使能端en,一个作系统“复位”res。

三、设计

3.1设计思路

本次程序设计的思路主要是分模块进行。32进制同步减法计数器的基本工作原理是循环自减,因此得需要一个自减VHDL的程序。系统提供50MHZ频率的时钟源,频率太大,肉眼无法观察,得需要一个分频的程序。数码管的同步显示需要一个扫频的程序。输入的数字可能是 一位数也有可能是两位数,一个数码管只能显示一位数,因此需要有把一个两位数分成两个一位数的程序,本次设计的程序就是利用了取余的函数rem。

将以上几个分支程序进行整理,再加上数码管的显示程序以及一些附加程序便可得完整的程序。

3.2设计步骤

1. 自减VHDL程序

1

process(en,res,clk1) begin

x<=conv_integer(start) rem 10; y<=(conv_integer(start)/10)rem 10; x2<=y; y2<=x;

if res='1'then

di<=0; xp<=start;

if clk1'event and clk1='1' then

if xp=0 then

xp<=start; xp<=xp-1; else end if ;

elsif en='1'then

end if;

end if; end process;

程序中,res是复位信号,功能是在在出现res=1是,将数码管回到最初始状态,当rst=0是,循环显示;en是一个开始信号,只有en=1时,计数才开始工作;conv_integer() 是将二进制变为十进制数;start为输入信号,xp为信号。

2. 分频程序 process(clk)

variable a1:integer range 24999999 downto 0; begin

if clk'event and clk='1' then if a1<24999999 then a1:=a1+1; else

a1:=0;clk1<=not clk1; end if; end if; end process;

将50MHZ的频率分为1HZ,即将50MHZ分成两部分,每数完25MHZ,信号clk1就变化一次,以此达到目的。

3. 扫频程序 process(clk)

variable b1:integer range 20000 downto 0; begin

if clk'event and clk='1' then

if b1<20000 then

b1:=b1+1;

b1:=0;clk2<=not clk2; else end if;

end if; end process;

扫频的程序与分频程序原理都一样 4.位数分离程序 process(xp)

variable b:integer range 0 to 9; variable a:integer range 0 to 3; begin

b:=conv_integer(xp) rem 10; a:=(conv_integer(xp)/10)rem 10; ai<=a; bi<=b; end process;

此程序用到了rem求余函数,将个位与十位分开。

四、QuartusⅡ9.0操作步骤

1.运行QuartusⅡ9.0并创建工程路径(如:E:\\example),以便相关设计文件和工程管理。 2.新建一个VHDL文本文件。

3.创建新工程并添加设计文件到工程。

4.选择目标器件Cyclone 系列 EP1C20F324C8 芯片。 5.对源代码进行语法检查和编译。 6.创建仿真波形文件并仿真。

7.引脚分配。

8.重编译,编程下载,下载完成后验证功能。

五、程序

5.1完整程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY DCLK IS

PORT(clk:IN STD_LOGIC; res,en:in std_logic;

start:IN STD_LOGIC_VECTOR(4 DOWNTO 0); led7s2:out std_logic_vector(6 downto 0); scan:out std_logic_vector(3 downto 0) ); end;

architecture one of DCLK IS

signal di:integer range 31 to 0; signal w:std_logic_vector( 2 downto 0); signal clk1,clk2:std_logic; signal ai,bi:integer;

signal xp:STD_LOGIC_VECTOR(4 DOWNTO 0); signal x,y:integer range 0 to 9; --FENPIN begin process(clk)

variable a1:integer range 24999999 downto 0; begin

if clk'event and clk='1' then if a1<24999999 then a1:=a1+1; else

a1:=0;clk1<=not clk1;

end if; end if; end process; --SCAN CLK process(clk)

variable b1:integer range 20000 downto 0; begin

if clk'event and clk='1' then

if b1<20000 then

b1:=b1+1;

b1:=0;clk2<=not clk2; else end if;

end if; end process; --COUNTER

process(en,res,clk1) begin

x<=conv_integer(start) rem 10; y<=(conv_integer(start)/10)rem 10; x2<=y; y2<=x;

if res='1'then

di<=0; xp<=start;

if clk1'event and clk1='1' then

if xp=0 then

xp<=start; xp<=xp-1; else end if ;

elsif en='1'then

end if;

end if;

end process; process(xp)

variable b:integer range 0 to 9; variable a:integer range 0 to 3; begin

b:=conv_integer(xp) rem 10; a:=(conv_integer(xp)/10)rem 10; ai<=a; bi<=b; end process;

process(ai,bi,clk2,y,x) begin

if clk2'event and clk2='1' then

if w=\"100\" then

w<=\"000\"; if w=\"000\" then scan<=\"0001\";

case ai is

when 0=>led7s2<=\"1000000\"; when 1=>led7s2<=\"1111001\"; when 2=>led7s2<=\"0100100\"; when 3=>led7s2<=\"0110000\"; when others=>null;

else w<=w+1;

end case;

end if; if w=\"001\" then scan<=\"0010\";

case bi is

when 0=>led7s2<=\"1000000\"; when 1=>led7s2<=\"1111001\"; when 2=>led7s2<=\"0100100\"; when 3=>led7s2<=\"0110000\"; when 4=>led7s2<=\"0011001\";

when 5=>led7s2<=\"0010010\"; when 6=>led7s2<=\"0000010\"; when 7=>led7s2<=\"1111000\"; when 8=>led7s2<=\"0000000\"; when 9=>led7s2<=\"0010000\"; when others=>null;

end case;

end if; scan<=\"1000\";

case y is

when 0=>led7s2<=\"1000000\"; when 1=>led7s2<=\"1111001\"; when 2=>led7s2<=\"0100100\"; when 3=>led7s2<=\"0110000\"; when others=>null;

if w=\"010\" then

end case;

end if; if w=\"011\" then scan<=\"0100\";

case x is

when 0=>led7s2<=\"1000000\"; when 1=>led7s2<=\"1111001\"; when 2=>led7s2<=\"0100100\"; when 3=>led7s2<=\"0110000\"; when 4=>led7s2<=\"0011001\"; when 5=>led7s2<=\"0010010\"; when 6=>led7s2<=\"0000010\"; when 7=>led7s2<=\"1111000\"; when 8=>led7s2<=\"0000000\"; when 9=>led7s2<=\"0010000\"; when others=>null;

end case;

end if;

end if;

end if; end process; end;

5.2仿真程序

LIBRARY IEEE;

USE IEEE.STD_LOGIC_11.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTITY DCLK IS

PORT(clk:IN STD_LOGIC; res,en:in std_logic;

start:IN STD_LOGIC_VECTOR(4 DOWNTO 0); led7s2:out std_logic_vector(6 downto 0); scan:out std_logic_vector(3 downto 0); x1,y1:out integer range 0 to 9; x2,y2:out integer range 0 to 9;

xp_disp:out STD_LOGIC_VECTOR(4 DOWNTO 0)); end;

architecture one of DCLK IS

signal di:integer range 31 to 0; signal w:std_logic_vector( 2 downto 0); signal clk1,clk2:std_logic; signal ai,bi:integer;

signal xp:STD_LOGIC_VECTOR(4 DOWNTO 0); signal x,y:integer range 0 to 9; begin --FENPIN process(clk)

variable a1:integer range 4 downto 0; begin

if clk'event and clk='1' then if a1<4 then a1:=a1+1;

else

a1:=0;clk1<=not clk1; end if; end if; end process; --SCAN CLK process(clk)

variable b1:integer range 20000 downto 0; begin

if clk'event and clk='1' then

if b1<20000 then

b1:=b1+1;

b1:=0;clk2<=not clk2; else end if;

end if; end process; --COUNTER

process(en,res,clk1) begin

x<=conv_integer(start) rem 10; y<=(conv_integer(start)/10)rem 10; x2<=y;---TEST SHURU SHIWEI y2<=x;---TEST SHURU GEWEI if res='1'then

di<=0; xp<=start;

if clk1'event and clk1='1' then

if xp=0 then

xp<=start; xp<=xp-1; else end if ;

elsif en='1'then

end if;

end if;

xp_disp<=xp; ---TEST ZIJIAN end process; process(xp)

variable b:integer range 0 to 9; variable a:integer range 0 to 3; begin

b:=conv_integer(xp) rem 10; a:=(conv_integer(xp)/10)rem 10; ai<=a; bi<=b;

x1<=ai;---TEST SHUCHU SHIWEI y1<=bi;---TEST SHUCHU GEWEI end process;

process(ai,bi,clk2,y,x) begin

if clk2'event and clk2='1' then

if w=\"100\" then

w<=\"000\"; if w=\"000\" then scan<=\"0001\";

case ai is

when 0=>led7s2<=\"1000000\"; when 1=>led7s2<=\"1111001\"; when 2=>led7s2<=\"0100100\"; when 3=>led7s2<=\"0110000\"; when others=>null;

else w<=w+1;

end case;

end if; if w=\"001\" then scan<=\"0010\";

case bi is

when 0=>led7s2<=\"1000000\"; when 1=>led7s2<=\"1111001\"; when 2=>led7s2<=\"0100100\"; when 3=>led7s2<=\"0110000\"; when 4=>led7s2<=\"0011001\"; when 5=>led7s2<=\"0010010\"; when 6=>led7s2<=\"0000010\"; when 7=>led7s2<=\"1111000\"; when 8=>led7s2<=\"0000000\"; when 9=>led7s2<=\"0010000\"; when others=>null;

end case;

end if; scan<=\"1000\";

case y is

when 0=>led7s2<=\"1000000\"; when 1=>led7s2<=\"1111001\"; when 2=>led7s2<=\"0100100\"; when 3=>led7s2<=\"0110000\"; when others=>null;

if w=\"010\" then

end case;

end if; if w=\"011\" then scan<=\"0100\";

case x is

when 0=>led7s2<=\"1000000\"; when 1=>led7s2<=\"1111001\"; when 2=>led7s2<=\"0100100\"; when 3=>led7s2<=\"0110000\"; when 4=>led7s2<=\"0011001\"; when 5=>led7s2<=\"0010010\"; when 6=>led7s2<=\"0000010\"; when 7=>led7s2<=\"1111000\";

when 8=>led7s2<=\"0000000\"; when 9=>led7s2<=\"0010000\"; when others=>null;

end case;

end if;

end if;

end if; end process; end;

六、仿真

6.1仿真结果

6.2仿真结果分析

Clk为时钟源,10hz分频为1hz,led7s2为数码管显示,en为使能控制端,res为复位端,start为输入,scan为片选输出,x1为输出的十位,y1为输出的个位,x2为输入的十位,y2为输入的个位,xp_disp为输入数的自减。

当res为低电平,en为高电平时,程序开始运行;当res为高电平时,输出的值就跳回最开始输入的值,高电平消失后,程序又开始自减,如此循环显示。

七、引脚分配

八、课程设计总结

EDA课程设计很快就结束了,虽然在之前的学习过程中还存在着没有弄懂的问题,但是通过这次设计,进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。

EDA设计我感觉程序调试、试验软件、硬件熟悉最重要。在编完各模块程序之后,编译查错最初有十几个错误,有输入错误、语法错误。一遍一遍的编译查错,直到没有错误。必须注意工程名和实体名一致,不然一般会出错。在没有错误之后可以进行波型仿真。若与理想的不同,再查看程序,有无原理上的编辑错误或没有查出的输入错误。

通过本次EDA课程设计,让我更进一步的熟悉了VHDL语言,了解了其中的语法,同时,在做32进制同步减法计数器计数显示的过程中,遇到了很多的困难,但从这些困哪中,我也受益匪浅,有困难才会提高,这样自己才能学到更多的东西。

在本次课程设计中,让我学到了不少知识,知道了什么叫数码管的动态显示,更深一步了解了数码管的显示原理,以前在做实验时,只知道按照实验指导书上一步一步按部就班的做,有些地方根本就没有深刻的理解,虽然在实验时也遇到几个数码管显示同时显示一个数,但是根本没有想为什么会是这样,但通过此次课程设计,真正的了解了数码管是如何显示的。

此次课程设计,令我感到最头痛的是程序的编译中出现的问题,在以前做实验时,由于程序不会很长,所以编译中出现的问题会很容易解决,但课程设计中的程序比平常做的要长得多,不过在查找程序的错误中,是我能更深刻了解VHDL的语法,深刻理解程序中的逻辑关系,例如在我设计计数器两位显示的时候,数码管一直不亮,再那里卡了很久,最后终于搞清楚了出错的地方,使我对进位计数器的设计有了更清晰的理解,这些都是自己不做不想无法得到的财富。

同时,老师的教学理念也给我留下了深刻的印象,只有通过自己亲手做出来的东西,自己才会真正的理解,东西才是自己的。老师的一番话不止在我们做课程设计中有用,在以后的工作生活中也是有用的。

参考文献

[1] 潘松、黄继业,EDA技术与VHDL[M],北京:清华大学出版社,2005 [2] 潘 松,EDA技术实用教程[M],北京:科学出版社,2002

[3] 谭京生,EDA技术及应用[M],西安:西安电子科技大学出版社,2001 [4] 徐志军,CPLD/FPGA的开发与应用[M],北京:电子工业出版社,2001

[5](美)Mark D.Birnbaum,电子设计自动化基础(英文影印版)[M],北京:机械工业出版社,2005

[6] 朱正伟,EDA技术与应用[M],北京:清华大学出版社,2005

[7] 王金明,数字系统设计与Verilog HDL[M],北京:电子工业出版社,2000 [8] 潘 松,VHDL实用教程[M],成都:电子科技大学出版社,2001

[9] 周祖成,电子设计硬件描述语言VHDL [M],北京:北京学苑出版社,2000

[10] 侯伯亭,VHDL硬件描述语言与数字逻辑电路设计[M],西安:西安电子科技大学出版社,2001

[11] 边计年、薛宏熙,用VHDL设计电子线路[M],北京:清华大学出版社,2000 [12] 任爱锋,基于FPGA的嵌入式系统设计[M],西安:西安电子科技大学出版社,2004

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.com 版权所有 湘ICP备2023021991号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务