计数器.docx
《计数器.docx》由会员分享,可在线阅读,更多相关《计数器.docx(15页珍藏版)》请在冰豆网上搜索。
计数器
计数器设计报告
目录
一、设计任务
二、题目分析与整体构思
三、硬件电路设计
四、程序设计
五、心得体会
一.任务设计
计数器是数字系统中用的较多的基本逻辑器件,它的基本功能是统计时钟脉冲的个数,
即实现计数操作,它也可用于分频、定时、产生节拍脉冲和脉冲序列等。
计数器分为同步计
数器和异步计数器两种,计数器是一个典型的时序电路。
计数器按照触发类型可分为同步计
数器,异步计数器。
其中同步计数器是指构成计数器的各触发器状态在时钟脉冲的控制下同
时发生变化;异步计数器是指,组成计数器的各触发器,低位触发器的输出信号作为高位触
发器的时钟信号。
异步计数器与同步计数器不同之处就在于时钟脉冲的提供方式。
本实验利用VHDL硬件描述语言设计一个0~9999的加法计数器。
根据一定频率的触发
时钟,计数器进行加计数,并利用数码管进行显示,当计数到9999时,从0开始重新计数。
二.题目要求与整体构思
SW0为复位开关。
当开关拨至高点平时,计数器归0,当开关拨至低电平时,计数器开
始计数。
该电路包括分频电路,计数器电路,二进制转BCD码电路和数码管显示电路。
分频电路(mod_clkdiv):
由于内部时钟频率为50MHz,为了使肉眼能够观察加计数的过
程,要将内部时钟进行分频,分频电路将内部时钟进行分频,将分频后的脉冲信号分别给计
数器电路和数码管显示电路,做为时钟信号。
对内部时钟脉冲进行218分频,得到
50000000/218=190Hz,将190Hz信号作为数码管的输入时钟;对内部时钟信号进行
220分频,得到50000000/220=47.6Hz,用频率为47.68Hz的信号来驱动模10000的计数器。
使用这个时钟频率7段码显示将从0-9999计数,时间大约为100000/47.68=209.7s(3.5分钟)。
计数器电路(mod_mod10kcnt):
在输入脉冲上升沿进行加计数;二进制转BCD电路(Mod_binbcd14):
将二进制数据输入到二进制转BCD码模块,输出BCD编码,然后再将转换后的数据输入到数码管显示电路(mod_x7segbc)。
(注:
由于实验中需要用到4位7段数码管,确认DIP开关JP1拨至上方(7SEGLED)
本实验4位数码管的数据输入端是共用的,若要点亮4个数码管,则采用循环扫描复用
7段数码管的方法。
当位选信号为00,01,10,11时,扫描不同的数码管。
扫描时钟足够快时,虽然四个数字的显示还是分时复用的,但是人眼看到的好像是同一时刻显示了4个数字。
EXCD-1开发板上数码管是共阴极连接方式,因此当输入为高电平时,数码管点亮。
三.硬件设计
四.软件设计
(1)创建工程
制定工程名,工程路径以及顶层设计所使用的输入方式,此设计我们选择硬件描述语言作为顶层设计的输入方式HDL。
(2)选择目标器件
(3)创建新源文件
这里我们选择“VHDLModule”,进行新源文件模块定义,所定义的内容是所要设计模块的实体说明,即模块的端口说明。
本实验所要实现的是计数器的设计,设定SW0为复位端口,数码管为输出,选择输出为总线模式(Bus),Msb、Lsb分别表示最大端口号与最小端口号(注意:
选择端口方向in、out、inout)。
检查模块端口定义是否正确。
(4)添加源文件
(5)完成工程创建
在工程设置统计窗口,可以看到对工程的描述总结,目标器件的描述,以及新建源文件
的总结,此工程创建完成。
(6)设计输入
包括库的声明,包的声明,完整的实体说明以及结构体框架。
使用VHDL语言设计完善计数器设计,拨动开关SW0作为复位端,LED0~LED3作为输出显示,以观察实验结果。
十六进制数0-F,所对应的7段数码管的控制码如下:
十六进制数abcdefg
01111110
10110000
21101101
31111001
40110011
51011011
61011111
71110000
81111111
91111011
A1110111
B0011111
C1001110
D0111101
E1001111
F1000111
(7)仿真设计
代码输入完成后,需要对设计进行波形仿真。
有添加波形仿真文件,仿真波形文件时钟设置,设置输入信号波形和波形仿真这几个步骤。
(8)设计综合
Xilinx综合工具对设计进行行为级综合,将系统直接从行为级描述综合为寄存器传输级
描述。
综合过程中主要完成三个步骤:
首先为语法检查,检查设计文件语法是否有错误;其
次为编译过程,翻译和优化HDL代码,将其转换为综合工具可以识别的元件序列;最后为
映射过程,将这些可识别的元件序列转换为可识别的目标技术的基本元件。
Synthesis工具即用来完成设计综合,它可完成以下任务查看综合报告(ViewSynthesisReport)、查看RTL原理图(ViewRTLSchematic)、查看技术原理图(ViesTechnologySchematic)、检查语法(CheckSyntax)、产生综合后仿真模型(GeneratePost-SynthesisSimulationModel)。
(9).引脚分配
引脚分配
表9-2FPGA管脚分配表
对应板上资源信号名FPGA引脚
输入时钟clkP80
四位七段是码管位选an<0>P34
四位七段是码管位选an<1>P35
四位七段是码管位选an<2>P36
四位七段是码管位选an<3>P39
七段数码管a段a_to_g<0>P49
七段数码管b段a_to_g<1>P42
七段数码管c段a_to_g<2>P45
七段数码管d段a_to_g<3>P41
七段数码管e段a_to_g<4>P48
七段数码管f段a_to_g<5>P50
七段数码管g段a_to_g<6>P47
七段数码管小数点dpP40
开关SW0btnP43
(10)设计实现
设计综合完成后,即进行设计实现(Implement)。
实现过程主要分为三个步骤:
翻译逻
辑网表(Translate)、映射到器件单元(Map)、布局布线(Place&Route)。
在处理子窗口,
鼠标双击ImplementDesign,信息输出窗口会显示设计信息。
(11)生成下载文件及目标板配置
处理子窗口中双击GenerateProgrammingFile,生成可编程文件。
而后双击ConfigureTargetDevice,进行目标板配置。
开发板正确连接,并上电后,可在ISE用户区看到两个可配置芯片,分别为4Mb的平台flash与FPGAxc3s500e台flash与FPGAxc3s500e。
同时出现平台Flash配置文件指定窗口,绿色芯片表示当前进行配置的芯片。
该设计我们选择对FPGAxc3s500e进行配置,平台Flash配
置窗口点击Cancel。
选定FPGA芯片图标,右键单击选择program,在随后弹出的“DeviceProgrammingProperties”对话框直接点击ok,对FPGA进行编程。
文件下载成功,则显示“ProgramSucceeded”可通过开发板观察相应实验现象。
至此,使用ISE软件设计基本逻辑门电路已经完成。
(12)程序代码
见附件
五.调试
仿真后,打开开关,数码管开始显示计数。
六.心得体会
本设计,满足了本次试验设计的任务要求,数码管正常显示计数。
通过这次设计我们了解并掌握VHDL硬件描述语言的设计方法和思想,使自己能将已学过的数字电子系统设计、VHDL程序设计等知识综合运用于电子系统的设计中,基本掌握了运用VHDL设计电子系统的流程和方法,加强和培养了自己对电子系统的设计能力。
我们也了解了VHDL的一些知识,VHDL主要用于描述数字系统的结构,行为,功能和接口。
除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。
VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。
在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。
这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
VHDL语言作为一种国际标准化的硬件描述语言,自1987年获得IEEE批准以来,经过了1993年和2001年两次修改,至今已被众多的国际知名电子设计自动化(EDA)工具研发商所采用,并随同EDA设计工具一起广泛地进入了数字系统设计与研发领域,目前已成为电子业界普遍接受的一种硬件设计技术。
VHDL语言用于数字系统设计的主要优点是:
(1)允许用软件描述系统的硬件结构,即描述系统怎样分解为子系统和子系统间怎样互连。
(2)允许使用类似常用编程语言形式的系统功能指标。
(3)允许对系统设计在制造前以低廉的花费进行性能模拟验证。
(4)允许设计的详细结构从更抽象的性能指标出发沿自顶向下的路线分层次地进行综合。
(5)允许设计重用和在可编程ASIC器件上生成设计芯片。
VHDL语言的运用提高了我们设计电子系统的效率,简单实用,也在此次设计中提升了我们自身运用所学知识的能力,也更加体会出作为团队中的一员要以团队思想为主题发展自己的思维。
在此感谢各位老师的指导,感谢赞助商给我们站在这个独特舞台上展现自己的机会。
附件:
程序代码
顶层程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitymod10Kcnt_topis
Port(clk:
inSTD_LOGIC;
btn:
inSTD_LOGIC;
a_to_g:
outSTD_LOGIC_VECTOR(6downto0);
an:
outSTD_LOGIC_VECTOR(3downto0);
dp:
outSTD_LOGIC);
endmod10Kcnt_top;
architectureBehavioralofmod10Kcnt_topis
componentclkdiv
Port(clk:
inSTD_LOGIC;
clr:
inSTD_LOGIC;
clk190:
outSTD_LOGIC;
clk48:
outSTD_LOGIC);
endcomponent;
componentmod10Kcnt
Port(clr:
inSTD_LOGIC;
clk:
inSTD_LOGIC;
q:
inoutSTD_LOGIC_VECTOR(13downto0));
endcomponent;
componentx7segbc
Port(x:
inSTD_LOGIC_VECTOR(15downto0);
cclk:
inSTD_LOGIC;
clr:
inSTD_LOGIC;
a_to_g:
outSTD_LOGIC_VECTOR(6downto0);
an:
outSTD_LOGIC_VECTOR(3downto0);
dp:
outSTD_LOGIC);
endcomponent;
componentbinbcd14
Port(b:
inSTD_LOGIC_VECTOR(13downto0);
p:
outSTD_LOGIC_VECTOR(16downto0));
endcomponent;
signalp:
std_logic_vector(16downto0);
signalclr,clk48,clk190:
std_logic;
signalb:
std_logic_vector(13downto0);
begin
clr<=btn;
u1:
clkdivportmap(
clk=>clk,
clr=>clr,
clk190=>clk190,
clk48=>clk48
);
u2:
mod10Kcntportmap(
clr=>clr,
clk=>clk48,
q=>b
);
u3:
x7segbcportmap(
x=>p(15downto0),
cclk=>clk190,
clr=>clr,
a_to_g=>a_to_g,
an=>an,
dp=>dp
);
u4:
binbcd14portmap(
b=>b,
p=>p
);
endBehavioral;
U1程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entityclkdivis
Port(clk:
inSTD_LOGIC;
clr:
inSTD_LOGIC;
clk190:
outSTD_LOGIC;
clk48:
outSTD_LOGIC);
endclkdiv;
architectureBehavioralofclkdivis
signalq:
std_logic_vector(24downto0);
begin
process(clr,clk)
begin
if(clr='1')then
q<=(others=>'0');
elsif(rising_edge(clk))then
q<=q+1;
endif;
endprocess;
clk190<=q(17);--190Hz
clk48<=q(19);--47.7Hz
endBehavioral;
U2程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entitymod10Kcntis
Port(clr:
inSTD_LOGIC;
clk:
inSTD_LOGIC;
q:
inoutSTD_LOGIC_VECTOR(13downto0));
endmod10Kcnt;
architectureBehavioralofmod10Kcntis
begin
process(clk,clr)
begin
if(clr='1')then
q<=(others=>'0');
elsif(rising_edge(clk))then
if(q=X"270F")then--9999
q<=(others=>'0');
elseq<=q+1;
endif;
endif;
endprocess;
endBehavioral;
U3程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
----anyXilinxprimitivesinthiscode.
--libraryUNISIM;
--useUNISIM.VComponents.all;
entityx7segbcis
Port(x:
inSTD_LOGIC_VECTOR(15downto0);
cclk:
inSTD_LOGIC;
clr:
inSTD_LOGIC;
a_to_g:
outSTD_LOGIC_VECTOR(6downto0);
an:
outSTD_LOGIC_VECTOR(3downto0);
dp:
outSTD_LOGIC);
endx7segbc;
architectureBehavioralofx7segbcis
signals:
std_logic_vector(1downto0);
signaldigit:
std_logic_vector(3downto0);
signalaen:
std_logic_vector(3downto0);
begin
dp<='1';
aen(3)<=x(15)orx(14)orx(13)orx(12);
aen
(2)<=x(15)orx(14)orx(13)orx(12)orx(11)orx(10)orx(9)orx(8);
aen
(1)<=x(15)orx(14)orx(13)orx(12)orx(11)orx(10)orx(9)orx(8)orx(7)orx(6)orx(5)orx(4);
aen(0)<='1';
process(s)
begin
casesis
when"00"=>digit<=x(3downto0);
when"01"=>digit<=x(7downto4);
when"10"=>digit<=x(11downto8);
whenothers=>digit<=x(15downto12);
endcase;
endprocess;
process(digit)
begin
casedigitis
whenx"0"=>a_to_g<="1111110";--"0000001";
whenx"1"=>a_to_g<="0110000";--"1001111";
whenx"2"=>a_to_g<="1101101";--"0010010";
whenx"3"=>a_to_g<="1111001";--"0000110";
whenx"4"=>a_to_g<="0110011";--"1001100";
whenx"5"=>a_to_g<="1011011";--"0100100";
whenx"6"=>a_to_g<="1011111";--"0100000";
whenx"7"=>a_to_g<="1110000";--"0001111";
whenx"8"=>a_to_g<="1111111";--"0000000";
whenx"9"=>a_to_g<="1111011";--"0000100";
whenx"A"=>a_to_g<="1110111";--"0001000";
whenx"B"=>a_to_g<="0011111";--"1100000";
whenx"C"=>a_to_g<="1001110";--"0110001";
whenx"D"=>a_to_g<="0111101";--"1000010";
whenx"E"=>a_to_g<="1001111";--"0110000";
whenothers=>a_to_g<="1000111";--"0111000";
endcase;
endprocess;
process(aen)
begin
an<="0000";
if(aen(conv_integer(s))='1')then
an(conv_integer(s))<='1';
endif;
endprocess;
process(cclk,clr)
begin
if(clr='1')then
s<="00";
elsif(rising_edge(cclk))then
s<=s+"01";
endif;
endprocess;
endBehavioral;
U4程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncommentthefollowinglibrarydeclarationifinstantiating
--