电子课程设四位十进制计数器Word文档格式.docx
《电子课程设四位十进制计数器Word文档格式.docx》由会员分享,可在线阅读,更多相关《电子课程设四位十进制计数器Word文档格式.docx(18页珍藏版)》请在冰点文库上搜索。
测频信号控制发生器
模块功能
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:
begin
div_outb<
=clk_tmpb;
div_outc<
=clk_tmpc;
process(clk_in)
iffalling_edge(clk_in)then
iffre_nb>
24999999then
fre_nb<
=0;
clk_tmpb<
=notclk_tmpb;
else
=fre_nb+1;
endif;
iffre_nc>
99999then
fre_nc<
clk_tmpc<
=notclk_tmpc;
=fre_nc+1;
endprocess;
enda;
逻辑功能:
将50MH分频为单位脉冲1Hz和扫描频率。
十进制计数器
entitycnt10is
port(clk:
instd_logic;
clr:
ena:
cq:
outintegerrange0to9;
carry_out:
outstd_logic);
endcnt10;
architecturebehavofcnt10is
signalcqi:
integerrange0to9;
process(clr,clk,ena)
if(clr='
1'
)then
cqi<
elsif(clk'
eventandclk='
)then
if(ena='
if(cqi=9)then
cqi<
carry_out<
='
;
else
=cqi+1;
0'
endif;
cq<
=cqi;
endbehav;
逻辑功能:
当第一个CNT10计数输出CQ=9时,下一秒时钟上升沿到来时,将产生一个CARRY_OUT信号作为下一个CNT10的时钟信号,同时CQ清零。
依次递推到8个CNT10。
测频控制信号发生器
entitytestctlis
port(
clk:
tsten:
outstd_logic;
clr_cnt:
load:
endtestctl;
architecturebehavoftestctlis
signaldiv2clk:
std_logic;
process(clk)
if(clk'
div2clk<
=notdiv2clk;
process(clk,div2clk)
if(clk='
anddiv2clk='
clr_cnt<
load<
tsten<
=div2clk;
对8个CNT10产生同步使能信号TSTEN;
产生一个清零信号CLR_CNT,计数完成时对4个CNT10清零;
产生一个锁存信号LOAD对锁存器RED16B,对CNT10产生的信号进行锁
16位锁存器
entityreg16bis
port(load:
din:
instd_logic_vector(15downto0);
dout:
outstd_logic_vector(15downto0));
endreg16b;
architectureartofreg16bis
process(load,din)
begin
ifload'
eventandload='
then
dout<
=din;
endprocess;
endarchitectureart;
锁存信号,并将结果输出给SELTIME。
数码管扫描SELTIME
entityseltimeis
din:
daout:
outstd_logic_vector(3downto0);
sel:
outstd_logic_vector(2downto0));
endseltime;
architecturebehavofseltimeis
signalsec:
std_logic_vector(2downto0);
if(clk'
if(sec>
="
100"
sec<
000"
else
=sec+1;
process(sec,din(15downto0))
casesecis
when"
=>
daout<
=din(3downto0);
001"
=din(7downto4);
010"
=din(11downto8);
011"
=din(15downto12);
whenothers=>
null;
endcase;
sel<
=sec;
锁存信号输出给DIN[16..0],然后由SELTIME进行扫描输出,当SEL为”000”时选通第一个CNT10,输出到DELED进行译码输出。
依次类推。
译码器
IIBRARYieee;
ENTITYSEG7IS
PORT(NUM:
INstd_logic_vector(3downto0);
A:
OUTstd_logic;
B:
C:
D:
E:
F:
G:
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<
led<
1111110"
whennum="
0000"
"
0110000"
0001"
1101101"
0010"
1111001"
0011"
0110011"
0100"
1011011"
0101"
1011111"
0110"
1110000"
0111"
1111111"
1000"
1111011"
1001"
1110111"
1010"
0011111"
1011"
1001110"
1100"
0111101"
1101"
1001111"
1110"
1000111"
1111"
ENDfun;
将SELTIME输出的信号译码显示出来。
3-8译码器
LIBRARYieee;
ENTITYdecode3_8IS
PORT(SEL:
INstd_logic_vector(2downto0);
Q:
OUTstd_logic_vector(7downto0)
);
ENDdecode3_8;
ARCHITECTUREaOFdecode3_8IS
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输出不同的频率,同时在数码管上显示出对应的频率,设计理论与实际硬件实现相同。