Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


VHDL - Relogio Digital , Notas de estudo de Automação

Projeto de um relogio digital em linguagem vhdl, utilizando o software da Xiling, decodificado para display de 7 segmentos... Está bem simples o doc ...pois a prioridade do projeto era entregar ele funcionando... mas acho que já vai ajudar a entender o funcionamento. No proximo semestre acredito que a faculdade já vai ter o gravador para implementar este projeto.

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 05/12/2010

carla-patricia-padilha-6
carla-patricia-padilha-6 🇧🇷

4.5

(2)

1 documento

1 / 13

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
instituto superior tupy - sociesc
carla patricia padilha
relogio digital em código vhdl
Joinville
2010/02
pf3
pf4
pf5
pf8
pf9
pfa
pfd

Pré-visualização parcial do texto

Baixe VHDL - Relogio Digital e outras Notas de estudo em PDF para Automação, somente na Docsity!

instituto superior tupy - sociesc

carla patricia padilha

relogio digital em código vhdl

Joinville

“A máquina analítica não tem nenhuma pretensão de criar

nada. Pode fazer qualquer coisa que saibamos como mandá-la fazer.

Sua ocupação é nos assistir tornando disponível aquilo que já

conhecemos.”

Ada Augusta

Condessa de Lovelace

entity unidade_seg is Port ( clk_in_uni_seg: in std_logic; clk_out_uni_seg: out std_logic; bcd_uni_seg : out STD_LOGIC_vector (3 downto 0)); end unidade_seg;

architecture Behavioral of unidade_seg is signal uni_seg: std_logic_vector (3 downto 0):= "0000"; signal clk_out_tmp_seg : std_logic := '0'; begin process (clk_in_uni_seg) begin IF (clk_in_uni_seg = '1' and clk_in_uni_seg'event) then uni_seg <= uni_seg + "1"; IF (uni_seg = 9) then uni_seg <= "0000"; clk_out_tmp_seg <= '1'; end if; IF (uni_seg = 5) then clk_out_tmp_seg <= '0'; end if; end if; end process; bcd_uni_seg <= uni_seg; clk_out_uni_seg <= clk_out_tmp_seg; end Behavioral;

Contador 0 a 9 – unidade segundo

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL; entity dezena_seg is Port ( clk_in_dez_seg: in std_logic; clk_out_dez_seg : out std_logic; bcd_dez_seg : out STD_LOGIC_vector (2 downto 0)); end dezena_seg; architecture Behavioral of dezena_seg is signal dez: std_logic_vector (2 downto 0):= "000"; signal clk_out_tmp_seg : std_logic := '0'; begin process (clk_in_dez_seg) begin IF (clk_in_dez_seg = '1' and clk_in_dez_seg'event) then dez <= dez + "1"; IF (dez = 5) then dez <= "000"; clk_out_tmp_seg <= '1'; end if; if (dez = 2) then clk_out_tmp_seg <= '0'; end if; end if; end process; bcd_dez_seg <= dez; clk_out_dez_seg <= clk_out_tmp_seg; end Behavioral;

Contador 0 a 6 – dezena Segundo

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL; entity unidade_min is Port ( clk_in_uni_min: in std_logic; clk_out_uni_min : out std_logic; bcd_uni_min : out STD_LOGIC_vector (3 downto 0)); end unidade_min; architecture Behavioral of unidade_min is signal uni_min: std_logic_vector (3 downto 0):= "0000"; signal clk_out_tmp_min : std_logic := '0'; begin process (clk_in_uni_min) begin IF (clk_in_uni_min = '1' and clk_in_uni_min'event) then uni_min <= uni_min + "1"; IF (uni_min = 9) then uni_min <= "0000"; clk_out_tmp_min <= '1'; end if; if (uni_min = 5) then clk_out_tmp_min <= '0'; end if; end if; end process; bcd_uni_min <= uni_min; clk_out_uni_min <= clk_out_tmp_min; end Behavioral;

Contador 0 a 9 unidade minute

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL; entity dezena_min is Port ( clk_in_dez_min: in std_logic; clk_out_dez_min : out std_logic; bcd_dez_min : out STD_LOGIC_vector (2 downto 0)); end dezena_min; architecture Behavioral of dezena_min is signal dez: std_logic_vector (2 downto 0):= "000"; signal clk_out_tmp_min : std_logic := '0'; begin process (clk_in_dez_min) begin IF (clk_in_dez_min = '1' and clk_in_dez_min'event) then dez <= dez + "1"; IF (dez = 5) then dez <= "000"; clk_out_tmp_min <= '1'; end if; if (dez = 2) then clk_out_tmp_min <= '0'; end if; end if; end process; bcd_dez_min <= dez; clk_out_dez_min <= clk_out_tmp_min; end Behavioral;

segundo e minuto, possuem uma entrada (clk_in) e uma saída de clock (clk_out)

respectivamente, também possui uma saída de 4 segmentos para ser acoplado a um

decodificador para display de 7 segmentos cujo código esta descrito logo abaixo. O clock de

saída é acionado quando o contador chega ao valor máximo, ou seja, o numero nove,

proporcionando a borda de subida de clock, a borda de descida acontece quando o contador

chega ao valor de numero 5. A saída BCD do relógio é acionada a cada borda de subida de

clock e através da lógica descrita mostra os números seqüencialmente na base binária, quando

o contador chega ao numero 9 ele então é zerado, ou seja, recebe como saída o valor zero em

binário (0000), e depois disso é só um loop de sinal seqüencial a cada linha de código.

Os demais códigos dos contadores descritos são executados da mesma forma, o que

diferencia um dos outros são os valores quando eles zeram e quando acontece a borda de

descida de clock de saída, basta uma rápida visualização nos códigos para se perceber esta

informação.

O código a seguir descreve o projeto do relógio digital chamando todos os componentes

criados anteriormente, cada componente esta conectada a um sinal, nomeado antes de chamar

os componentes ao projeto, onde então é mostrada a ordem dos componentes que será

executado. A entrada da entidade relógio é de apenas um clock, e de saída ele possui seis

vetores de oito bits que podem ser conectados diretamente ao display de sete segmentos, pois

dentro do código já esta incluso o decodificador do display.

library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; use IEEE.NUMERIC_STD.ALL;

entity relogio is port (clk : in std_logic; seg71: out std_logic_vector (7 downto 0); seg72: out std_logic_vector (7 downto 0); seg73: out std_logic_vector (7 downto 0); seg74: out std_logic_vector (7 downto 0); seg75: out std_logic_vector (7 downto 0); seg76: out std_logic_vector (7 downto 0)); end relogio;

architecture Behavioral of relogio is

signal bcduniseg : STD_LOGIC_vector (3 downto 0); signal bcddezseg : STD_LOGIC_vector (2 downto 0); signal bcdunimin : STD_LOGIC_vector (3 downto 0); signal bcddezmin : STD_LOGIC_vector (2 downto 0); signal bcdunihr : STD_LOGIC_vector (2 downto 0); signal bcddezhora : STD_LOGIC_vector (1 downto 0); signal clock : std_logic_vector (5 downto 1);

-- segmento mostrador: abcdefgh (h=ponto)

constant num0: STD_LOGIC_vector (7 downto 0) := "00000011"; -- codigo numero 0 constant num1: STD_LOGIC_vector (7 downto 0) := "10011111"; -- codigo numero 1 constant num2: STD_LOGIC_vector (7 downto 0) := "00100101"; -- codigo numero 2 constant num3: STD_LOGIC_vector (7 downto 0) := "00001101"; -- codigo numero 3 constant num4: STD_LOGIC_vector (7 downto 0) := "10011001"; -- codigo numero 4 constant num5: STD_LOGIC_vector (7 downto 0) := "01001001"; -- codigo numero 5 constant num6: STD_LOGIC_vector (7 downto 0) := "11000001"; -- codigo numero 6 constant num7: STD_LOGIC_vector (7 downto 0) := "00011111"; -- codigo numero 7 constant num8: STD_LOGIC_vector (7 downto 0) := "00000001"; -- codigo numero 8 constant num9: STD_LOGIC_vector (7 downto 0) := "00011001"; -- codigo numero 9 constant numn: STD_LOGIC_vector (7 downto 0) := "11111111"; -- apaga tudo

component unidade_seg is Port ( clk_in_uni_seg: in std_logic; clk_out_uni_seg: out std_logic; bcd_uni_seg : out STD_LOGIC_vector (3 downto 0)); end component;

component dezena_seg is Port ( clk_in_dez_seg: in std_logic; clk_out_dez_seg : out std_logic; bcd_dez_seg : out STD_LOGIC_vector (2 downto 0)); end component;

component unidade_min is Port ( clk_in_uni_min: in std_logic; clk_out_uni_min : out std_logic; bcd_uni_min : out STD_LOGIC_vector (3 downto 0)); end component;

component dezena_min is Port ( clk_in_dez_min: in std_logic; clk_out_dez_min : out std_logic; bcd_dez_min : out STD_LOGIC_vector (2 downto 0)); end component;

component unihora is Port ( clk_in_uni_hr: in std_logic; clk_out_uni_hr : out std_logic; bcd_uni_hr : out STD_LOGIC_vector (2 downto 0)); end component;

component dezhora is Port ( clk_in_dez_hora: in std_logic; bcd_dez_hora : out STD_LOGIC_vector (1 downto 0)); end component; begin

num7 when bcddezmin = 7 else num8 when bcddezmin = 8 else num9 when bcddezmin = 9 else numn; end block table_dezmin;

table_unihr: block begin seg75 <=num0 when bcdunihr = 0 else num1 when bcdunihr = 1 else num2 when bcdunihr = 2 else num3 when bcdunihr = 3 else num4 when bcdunihr = 4 else numn; end block table_unihr;

table_dezhr: block begin seg76 <=num0 when bcddezhora = 0 else num1 when bcddezhora = 1 else num2 when bcddezhora = 2 else numn; end block table_dezhr; end Behavioral;

Codigo relogio components

O ultimo código apresentado logo abaixo é o test bench do projeto gerado

automaticamente pelo software da Xilinx, nos primeiros testes feitos o contador não contava da

forma planejada e descrita na lógica acima, e depois de diversas modificações e testes

descobrimos que o test bench estava com uma entrada de clock duplicada, o que gerava uma

confusão no projeto, assim que o problema foi resolvido o projeto funcionou exatamente como

previsto no inicio.

LIBRARY ieee; USE ieee.std_logic_1164.ALL;

ENTITY testerelogio IS END testerelogio;

ARCHITECTURE behavior OF testerelogio IS

-- Component Declaration for the Unit Under Test (UUT)

COMPONENT relogio PORT( clk : IN std_logic; seg71 : OUT std_logic_vector(7 downto 0); seg72 : OUT std_logic_vector(7 downto 0); seg73 : OUT std_logic_vector(7 downto 0);

seg74 : OUT std_logic_vector(7 downto 0); seg75 : OUT std_logic_vector(7 downto 0); seg76 : OUT std_logic_vector(7 downto 0) ); END COMPONENT;

--Inputs signal clk : std_logic := '0';

--Outputs signal seg71 : std_logic_vector(7 downto 0); signal seg72 : std_logic_vector(7 downto 0); signal seg73 : std_logic_vector(7 downto 0); signal seg74 : std_logic_vector(7 downto 0); signal seg75 : std_logic_vector(7 downto 0); signal seg76 : std_logic_vector(7 downto 0);

-- Clock period definitions constant clk_period : time := 10 ns;

BEGIN

-- Instantiate the Unit Under Test (UUT) uut: relogio PORT MAP ( clk => clk, seg71 => seg71, seg72 => seg72, seg73 => seg73, seg74 => seg74, seg75 => seg75, seg76 => seg );

-- Clock process definitions clk_process :process begin clk <= '0'; wait for clk_period/2; clk <= '1'; wait for clk_period/2; end process;

-- Stimulus process stim_proc: process begin -- hold reset state for 100 ns. wait for 100 ns;

wait for clk_period*10;

-- insert stimulus here

wait; end process;

END;