-
Notifications
You must be signed in to change notification settings - Fork 0
/
contador_m.vhd
77 lines (70 loc) · 2.61 KB
/
contador_m.vhd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
-----------------Laboratorio Digital-------------------------------------
-- Arquivo : contador_m.vhd
-- Projeto : Experiencia 4 - Desenvolvimento de Projeto de
-- Circuitos Digitais em FPGA
-------------------------------------------------------------------------
-- Descricao : contador binario, modulo m, com parametro M generic,
-- sinais para clear assincrono (zera_as) e sincrono (zera_s)
-- e saidas de fim e meio de contagem
--
-- calculo do numero de bits do contador em funcao do modulo:
-- N = natural(ceil(log2(real(M))))
--
-- Exemplo de instanciacao: contador módulo 50
-- CONT50: contador_m
-- generic map ( M=> 50 )
-- port map ( ...
--
-------------------------------------------------------------------------
-- Revisoes :
-- Data Versao Autor Descricao
-- 09/09/2019 1.0 Edson Midorikawa criacao
-- 08/06/2020 1.1 Edson Midorikawa revisao e melhoria de codigo
-- 09/09/2020 1.2 Edson Midorikawa revisao
-- 30/01/2022 2.0 Edson Midorikawa revisao do componente
-- 29/01/2023 2.1 Edson Midorikawa revisao do componente
-------------------------------------------------------------------------
--
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.math_real.all;
entity contador_m is
generic (
constant M: integer := 100 -- modulo do contador
);
port (
clock : in std_logic;
zera_as : in std_logic;
zera_s : in std_logic;
conta : in std_logic;
Q : out std_logic_vector(natural(ceil(log2(real(M))))-1 downto 0);
fim : out std_logic;
meio : out std_logic
);
end entity contador_m;
architecture comportamental of contador_m is
signal IQ: integer range 0 to M-1;
begin
process (clock,zera_as,zera_s,conta,IQ)
begin
if zera_as='1' then IQ <= 0;
elsif rising_edge(clock) then
if zera_s='1' then IQ <= 0;
elsif conta='1' then
if IQ=M-1 then IQ <= 0;
else IQ <= IQ + 1;
end if;
else IQ <= IQ;
end if;
end if;
end process;
-- saida fim
fim <= '1' when IQ=M-1 else
'0';
-- saida meio
meio <= '1' when IQ=M/2-1 else
'0';
-- saida Q
Q <= std_logic_vector(to_unsigned(IQ, Q'length));
end architecture comportamental;