电子课程设四位十进制计数器.docx
《电子课程设四位十进制计数器.docx》由会员分享,可在线阅读,更多相关《电子课程设四位十进制计数器.docx(18页珍藏版)》请在冰豆网上搜索。
电子课程设四位十进制计数器
目录
一、设计任务与要求································2
二、总体框图·······································2
三、选择器件·······································3
四、功能模块·······································3
五、总体设计电路··································12
四位十进制频率计
一、设计任务与要求
1、用大规模可编程器件设计一个数字频率计,主要技术指标如下:
1)频率测量范围:
1Hz~10kHz。
2)数字显示位数:
4位数字显示。
3)测量时间:
t<=1.5s。
2、利用设计软件对EP1C12Q240C8器件进行设计输入设计仿真及器件编程,使其具备要求的逻辑功能。
3、计算参数,安装、调试电路。
4、画出完整电路图,写出设计总结报告。
5、选作内容:
用数字频率计测量信号周期。
二、总体框图
计数器
锁存器
译码驱动电路
数码管显示
待测信号
测频信号控制发生器
模块功能
1)计数器:
实现十进制计数功能。
2)锁存器:
锁存信号。
3)频率信号控制发生器:
输入端clk收到1Hz信号后,其输出端testen控制各个计数器的使能,clr_cnt控制各个计数器的清零,load控制锁存器内数据的输出。
4)译码驱动电路:
将锁存器输出的BCD码译码,译码后输送到译码显示器件。
5)数码管显示:
显示待测信号的频率值。
设计思路
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。
这就要求testpl的计数使能信号tsten能产生一个1秒脉宽的周期信号,并对频率计的每一计数器cnt10的使能端ena进行同步控制。
当tsten为高电平"1"时,允许计数;为低电平"0"时停止计数,并保持其计数结果。
在停止计数期间,首先需要一个锁存信号load的上跳沿将计数器在前1秒种的计数值锁存进16位锁存器reg16b中。
锁存信号之后,必须有一个清零信号clr_cnt对计数器进行清零,为下1秒的计数操作做准备,然后由数码管显示出来。
三、选择器件
电路中的所有器件都是VHDL语言设计生成的,所以无通用常规器件。
四、功能模块
分频器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydivis
port(clk_in:
INstd_logic;
div_outb,div_outc:
outstd_logic);
enddiv;
ARCHITECTUREaofdivis
signalfre_nb:
integerrange0to25000000;
signalfre_nc:
integerrange0to100000;
signalclk_tmpb:
std_logic;
signalclk_tmpc:
std_logic;
begin
div_outb<=clk_tmpb;
div_outc<=clk_tmpc;
process(clk_in)
begin
iffalling_edge(clk_in)then
iffre_nb>24999999then
fre_nb<=0;
clk_tmpb<=notclk_tmpb;
else
fre_nb<=fre_nb+1;
endif;
iffre_nc>99999then
fre_nc<=0;
clk_tmpc<=notclk_tmpc;
else
fre_nc<=fre_nc+1;
endif;
endif;
endprocess;
enda;
逻辑功能:
将50MH分频为单位脉冲1Hz和扫描频率。
十进制计数器
libraryieee;
useieee.std_logic_1164.all;
entitycnt10is
port(clk:
instd_logic;
clr:
instd_logic;
ena:
instd_logic;
cq:
outintegerrange0to9;
carry_out:
outstd_logic);
endcnt10;
architecturebehavofcnt10is
signalcqi:
integerrange0to9;
begin
process(clr,clk,ena)
begin
if(clr='1')then
cqi<=0;
elsif(clk'eventandclk='1')then
if(ena='1')then
if(cqi=9)then
cqi<=0;
carry_out<='1';
else
cqi<=cqi+1;
carry_out<='0';
endif;
endif;
endif;
endprocess;
cq<=cqi;
endbehav;
逻辑功能:
实现十进制计数功能。
当第一个CNT10计数输出CQ=9时,下一秒时钟上升沿到来时,将产生一个CARRY_OUT信号作为下一个CNT10的时钟信号,同时CQ清零。
依次递推到8个CNT10。
测频控制信号发生器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytestctlis
port(
clk:
instd_logic;
tsten:
outstd_logic;
clr_cnt:
outstd_logic;
load:
outstd_logic);
endtestctl;
architecturebehavoftestctlis
signaldiv2clk:
std_logic;
begin
process(clk)
begin
if(clk'eventandclk='1')then
div2clk<=notdiv2clk;
endif;
endprocess;
process(clk,div2clk)
begin
if(clk='0'anddiv2clk='0')then
clr_cnt<='1';
else
clr_cnt<='0';
endif;
endprocess;
load<=notdiv2clk;
tsten<=div2clk;
endbehav;
逻辑功能:
对8个CNT10产生同步使能信号TSTEN;产生一个清零信号CLR_CNT,计数完成时对4个CNT10清零;产生一个锁存信号LOAD对锁存器RED16B,对CNT10产生的信号进行锁
16位锁存器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityreg16bis
port(load:
instd_logic;
din:
instd_logic_vector(15downto0);
dout:
outstd_logic_vector(15downto0));
endreg16b;
architectureartofreg16bis
begin
process(load,din)
begin
ifload'eventandload='1'then
dout<=din;
endif;
endprocess;
endarchitectureart;
逻辑功能:
锁存信号,并将结果输出给SELTIME。
数码管扫描SELTIME
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityseltimeis
port(
clk:
instd_logic;
din:
instd_logic_vector(15downto0);
daout:
outstd_logic_vector(3downto0);
sel:
outstd_logic_vector(2downto0));
endseltime;
architecturebehavofseltimeis
signalsec:
std_logic_vector(2downto0);
begin
process(clk)
begin
if(clk'eventandclk='1')then
if(sec>="100")then
sec<="000";
else
sec<=sec+1;
endif;
endif;
endprocess;
process(sec,din(15downto0))
begin
casesecis
when"000"=>daout<=din(3downto0);
when"001"=>daout<=din(7downto4);
when"010"=>daout<=din(11downto8);
when"011"=>daout<=din(15downto12);
whenothers=>null;
endcase;
endprocess;
sel<=sec;
endbehav;
逻辑功能:
锁存信号输出给DIN[16..0],然后由SELTIME进行扫描输出,当SEL为”000”时选通第一个CNT10,输出到DELED进行译码输出。
依次类推。
译码器
IIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYSEG7IS
PORT(NUM:
INstd_logic_vector(3downto0);
A:
OUTstd_logic;
B:
OUTstd_logic;
C:
OUTstd_logic;
D:
OUTstd_logic;
E:
OUTstd_logic;
F:
OUTstd_logic;
G:
OUTstd_logic;
DP:
OUTstd_logic
);
ENDSEG7;
ARCHITECTUREfunOFSEG7IS
signalled:
std_logic_vector(6downto0);
BEGIN
A<=led(6);
B<=led(5);
C<=led(4);
D<=led(3);
E<=led
(2);
F<=led
(1);
G<=led(0);
DP<='0';
led<="1111110"whennum="0000"else
"0110000"whennum="0001"else
"1101101"whennum="0010"else
"1111001"whennum="0011"else
"0110011"whennum="0100"else
"1011011"whennum="0101"else
"1011111"whennum="0110"else
"1110000"whennum="0111"else
"1111111"whennum="1000"else
"1111011"whennum="1001"else
"1110111"whennum="1010"else
"0011111"whennum="1011"else
"1001110"whennum="1100"else
"0111101"whennum="1101"else
"1001111"whennum="1110"else
"1000111"whennum="1111";
ENDfun;
逻辑功能:
将SELTIME输出的信号译码显示出来。
3-8译码器
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYdecode3_8IS
PORT(SEL:
INstd_logic_vector(2downto0);
Q:
OUTstd_logic_vector(7downto0)
);
ENDdecode3_8;
ARCHITECTUREaOFdecode3_8IS
BEGIN
Q<="11111110"whensel=0else
"11111101"whensel=1else
"11111011"whensel=2else
"11110111"whensel=3else
"11111111";
ENDa;
逻辑功能:
将编码后的信号“翻译”出来从而实现所需的输出信号。
五、总体设计电路
电路的整体工作情况及连接关系:
实验箱内部管脚pin_153接div的clk端,同时div的两个输出div_outb和div_outc分别接testctl的clk端和seltime的clk端,testctl的三个输出端tsten、ckr_cnt、load,其中tsten、ckr_cnt分别接到cnt10的ena和clr端,load接到reg16b的load端。
cnt10的clk端接待测信号,对应实验箱的管脚pin_28——IO3,将IO3用导线与IO_CLK连接,四个cnt10的输出端cq[3..0]与reg16b的din[15..0]连接。
最后由reg16b输出的信号经过译码显示电路显示出来。
整体仿真图
根据上图可以频率为10Hz,对应功能仿真波形同样是10Hz,所以仿真结果正确。
管脚分配图
实验箱上的IO_3用导线与IO_CLK连接,其中IO_3对应的是pin_28。
拨动实验箱上的SW17—SW20,IO_CLK输出不同的频率,同时在数码管上显示出对应的频率,设计理论与实际硬件实现相同。