A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Parte 5 – Projeto de um circuito digital de média complexidade LABORG 13/maio/2013 Fernando Gehm Moraes Ney Laert Vilar Calazans.

Apresentações semelhantes


Apresentação em tema: "Parte 5 – Projeto de um circuito digital de média complexidade LABORG 13/maio/2013 Fernando Gehm Moraes Ney Laert Vilar Calazans."— Transcrição da apresentação:

1 Parte 5 – Projeto de um circuito digital de média complexidade LABORG 13/maio/2013 Fernando Gehm Moraes Ney Laert Vilar Calazans

2 2 Fernando Moraes / Ney Calazans Sumário Introdução Especificação Trabalhos Intermediários Cronômetro

3 3 Fernando Moraes / Ney Calazans Introdução O objetivo deste trabalho é especificar um módulo a ser compreendido, capturado, validado e prototipado pelos alunos. Este é um módulo de hardware de complexidade média. A linguagem usada na fase de captura do módulo será VHDL, e o ambiente de desenvolvimento a empregar é o ISE da Xilinx Pressupostos: o cronômetro deve operar sobre a plataforma Nexys2 disponível no laboratório, com as restrições que esta plataforma impõe, o que inclui: Só existe uma fonte de relógio na Nexys2, (de 50MHz) Somente podem ser usados os dispositivos de entrada e saída nativos da placa, quais sejam: para saída de dados, 4 mostradores de sete segmentos e 8 diodos emissores de luz (LEDs), e para entrada de dados 8 chaves deslizantes e quatro botões (do tipo push button)

4 4 Fernando Moraes / Ney Calazans Sumário Introdução Especificação Trabalhos Intermediários Cronômetro

5 5 Fernando Moraes / Ney Calazans Especificação Usem a descrição de uso dos recursos da placa conforme definido acima: Um jogo de basquete é composto de 4 quartos com duração de exatamente 15 minutos (quartos são numerados de 1 a 4, Q1 a Q4) O tempo que falta para terminar um quarto em curso deve ser visualizado em notação decimal com precisão de centésimos de s (a conversão de hexadecimal para decimal deve ser feita no arquivo top. Logo, usar internamente ao hardware somente contadores binários – isto facilita o projeto) Por definição, os contadores de minutos, segundos e centésimos evoluem em ordem decrescente O contador de quartos deve evoluir, obviamente, em ordem crescente Na inicialização, o cronômetro deve ir para Q1 15min 00s 00cent. Ao comandar o início da contagem do tempo do quarto (botão para_continua), a primeira mudança no cronômetro ocorre exatamente 1 centésimo de segundo após o início do quarto, com o cronômetro passando para 1q 14min 59s 99cent

6 6 Fernando Moraes / Ney Calazans Especificação O hardware possui 4 botões de controle: reset: reinicializa o contador, com valores Q1 15min 00s 00cent O cronômetro inicia parado para_continua: uma vez pressionado ativa a contagem; pressionado novamente para imediatamente o cronômetro novo_quarto: estando o jogo parado E tendo sido concluído um quarto, se pressionado leva para o início do próximo quarto, deixando o cronômetro congelado no tempo de início do quarto, 15min 00s 00cent carga: quando acionado com o cronômetro parado, lê um conjunto de entradas que especificam novos valores de quarto, minutos e segundos, assumindo que os centésimos reiniciarão em 00. Este novo valor é estabelecido como o atual valor de contagem do cronômetro

7 7 Fernando Moraes / Ney Calazans Especificação Toda vez que um quarto for concluído, o cronômetro para automaticamente. O reinício do mesmo se dá quando o usuário aperta o botão novo_quarto, e em seguida aperta o botão para_continua

8 8 Fernando Moraes / Ney Calazans Sumário Introdução Especificação Trabalhos Intermediários Cronômetro

9 9 Fernando Moraes / Ney Calazans Trabalhos intermediários - Aula 1 1.Prototipar um contador para dividir o relógio da placa (clock), de forma a fazer um led qualquer piscar com frequência de 0,5Hz, ou seja, ficando 1 segundo aceso e 1 segundo apagado. No arquivo UCF: –Entradas: clock e reset –Saída: um led qualquer 2.Concluindo a atividade, continuar com as atividades descritas nas próximas lâminas

10 10 Fernando Moraes / Ney Calazans TI - Aula 2 1.Contador de 100 segundos, partindo de 0 até 1, carga paralela –Este contador deve usar o mesmo clock que o do experimento anterior –Ao se pressionar o botão carga deve-se inicializar o contador com o valor binãrio lido das 7 chaves deslizantes mais à direita (ou seja SW6 a SW0) –A exibição dos valores de segundo deve usar o display de sete segmentos 2.Estrutura do hardware e código VHDL –Divisor que conte 1 segundo a partir do relógio de 50MHz –Contador inicializado com 0 que passa por 100 valores distintos ( ) com condição de carga externa –Conversão de hexa para decimal (código na próxima lâmina) segundos_BCD <= Conv_to_BCD(CONV_INTEGER(segundos)); –Instância do driver do display de sete segmentos (ver enunciado do T2) »Definição dos dígitos que irão para o driver do display (ao dois dígitos mais à direita devem permanecer apagados) 3.Depois de prototipar este contador, continuar as atividades de desenvolvimento, validação e prototipação do cronômetro »Esperado ao final da Aula 3: contador executando na placa, com precisão de segundo

11 type ROM is array (0 to 99) of std_logic_vector (7 downto 0); constant Conv_to_BCD : ROM:=( " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ," ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " ); Supondo segundos= 0x0F segundos_BCD <= Conv_to_BCD(CONV_INTEGER(segundos)); O retorno de Conv_to_BCD será ( 1 5 )

12 12 Fernando Moraes / Ney Calazans Sumário Introdução Especificação Trabalhos Intermediários Cronômetro

13 13 Fernando Moraes / Ney Calazans Cronômetro – Sugestão de estrutura de código 1.Construir divisor de relógio para centésimo de s. Para a prototipação deve-se contar o número de ciclos de relógio necessários para contabilizar 1 centésimo de segundo. Para facilitar a simulação alterar este número, dividindo, por exemplo por 10. Isto acelera bastante a simulação, embora torne a base de tempo não realista 2.Usar 3 sincronizadores (debounce) das teclas acionadas pelo usuário, ou seja: carga / para_continua / novo_quarto. Código do sincronizador será discutido em aula. Aparência da instanciação de um sincronizador em VHDL: a1: entity work.edge_detector port map (clock=>ck_1_cent, reset=>reset, din=> carga, rising=>carga_int); 3.Criar uma máquina de estados de controle, comanda por ck_1_cent »utilizar os sinais de controle oriundos dos sincronizadores 4.Usar atribuição concorrente para detecção do fim de um quarto de jogo: fim_quarto <= '1' when minutos_int=0 and segundos_int=0 and centesimos_int=0 else '0;

14 14 Fernando Moraes / Ney Calazans Cronômetro 5.Criar um contador decrescente de centésimos, controlado pelo relógio ck_1_cent – que conta de – contagem habilitada em estado específico da máquina e não final do quarto – verificar se o estado é de carga, ao tentar fazer inicialização com valor externo 6.Implementar contador decrescente de segundos, controlado pelo relógio ck_1_cent – que conta –contagem é habilitada no estado de contagem, com centésimos=0 e não final do quarto –verificar se estado é de carga, para realizar uma inicialização com valor externo 7.Criar contador decrescente de minutos, controlado pelo relógio ck_1_cent – conta de 15 a 0 –contagem é habilitada cada vez que o cronômetro está no estado de contagem, segundos=0, centésimos=0 e não chegou ao final do quarto – verificar se estado é de carga, para realizar uma inicialização com valor externo – no reset, este contador não vai para zero e sim para 15 8.Criar contador crescente de quartos, que conta de 1 a 4 –estando parado e pressionando-se novo_quarto seu valor é incrementado –sugere-se usar três bits no contador: quando quarto=100 assumir que passaram 4 quartos, devendo o cronômetro parar e só sair por reset ou carga de valor externo

15 15 Fernando Moraes / Ney Calazans MÁQUINA DE ESTADOS

16 16 Fernando Moraes / Ney Calazans Aula 3 Escrita do cronômetro de basquete, e simulação (testbench fornecido) Lembrar de dividir o relógio de referência por 10 (para simulação) SEGUIR ESTRITAMENTE ESTA INTERFACE

17 17 Fernando Moraes / Ney Calazans Aula 4 begin inst_crono: entity work.crono_bskt port map ( clock => clock, -- sinais na lâmina anterior -- ); c_segundos_int <= "000000" when C_segundos="00" else -- 0s... "101101" when C_segundos="11"; -- 45s quarto_led <= "1000" when quarto = "11" else.... "0001"; segundos_BCD <= Conv_to_BCD(CONV_INTEGER(segundos)); centesimos_BCD <= Conv_to_BCD(CONV_INTEGER(centesimos)); d4 <= '1' & segundos_BCD(7 downto 4) & '1'; d3 <= '1' & segundos_BCD(3 downto 0) & '0'; d2 <= '1' & centesimos_BCD(7 downto 4) & '1'; d1 <= '1' & centesimos_BCD(3 downto 0) & '1'; inst_dspl_drv: entity work.dspl_drv port map (....); end top_cr_bskt; SEGUIR ESTRITAMENTE ESTA INTERFACE

18 18 Fernando Moraes / Ney Calazans entity top_cr_bskt is Port ( clock : in STD_LOGIC; botões push-buttons carga : in STD_LOGIC; para_continua : in STD_LOGIC; novo_quarto : in STD_LOGIC; reset : in STD_LOGIC; --- valores de carga – 8 dip-switches c_quarto : in STD_LOGIC_VECTOR (1 downto 0); c_minutos : in STD_LOGIC_VECTOR (3 downto 0); c_segundos : in STD_LOGIC_VECTOR (1 downto 0); -- 4 displays de sete-segmentos para segundos e centésimos - DSPL_cent_seg : out STD_LOGIC_VECTOR (7 downto 0); anodo : out STD_LOGIC_VECTOR (3 downto 0); leds, para indicar os minutos e quarto minutos : out STD_LOGIC_VECTOR (3 downto 0); quarto_led : out STD_LOGIC_VECTOR (3 downto 0)); end top_cr_bskt; Aula 4 - TOP

19 inst_crono: entity work.crono_bskt port map ( clock => clock, c_segundos_int <= "000000" when C_segundos="00" else -- 0s "001111" when C_segundos="01" else -- 15s centesimos_BCD <= Conv_to_BCD(CONV_INTEGER(centesimos)); segundos_BCD <= Conv_to_BCD(CONV_INTEGER(segundos)); quarto_led <= "1000" when quarto = "11" else … d4 <= '1' & segundos_BCD(7 downto 4) & '1'; d3 <= … d2 <= … d1 <= … inst_dspl_drv: entity work.dspl_drv port map (… 7 blocos de código

20 Sinais de controle entram direto no circuito cronômetro de basquete inst_crono: entity work.crono_bskt port map ( clock => clock,… para_continua carga novo_quarto

21 A saída do contador de centésimos (até 99), com 7 bits, entra na ROM para gerar dois valores hexadecimais, os quais vão para o driver dos mostradores de 7 segmentos inst_crono: entity work.crono_bskt port map ( clock => clock,… centesimos_BCD <= Conv_to_BCD(CONV_INTEGER(centesimos)); d4 <= '1' & segundos_BCD(7 downto 4) & '1'; d3 <= … d2 <= … d1 <= …

22 A saída do contador de segundos (até 59), com 6 bits, entra na ROM para gera dois valores hexa, os quais vão para o driver dos mostradores de 7 segmentos inst_crono: entity work.crono_bskt port map ( clock => clock, segundos_BCD <= Conv_to_BCD(CONV_INTEGER(segundos));

23 A contagem de minutos vai direto para os leds A contagem de quarto passa por um decodificador 2 4 antes de ir para os leds quarto_led <= "1000" when quarto = "11" else …

24 A carga dos valores externos é direta, exceto pela carga dos segundos, que é codificada c_segundos_int <= "000000" when C_segundos="00" else -- 0s "001111" when C_segundos="01" else -- 15s......

25 25 Fernando Moraes / Ney Calazans Aula 5 TESTAR NA PLACA DE PROTOTIPAÇÃO E MOSTRAR AO PROFESSOR ENTREGÁVEIS NO MOODLE: –Arquivo VHDL do contador de basquete –Arquivo UCF do top –Arquivo.BIT funcional da implementação –Arquivo em formato PDF com as formas de onda relevantes para o projeto, explicando os eventos mostrados –Todos os arquivos em um único ZIP

26 Exemplo de UCF completo o cronômetro: clock, reset, leds... (se necessãrio, adaptem os nomes dos sinais tais como switch e led para os nomes utilizados na sua implementação # pinos para as entradas e saídas NET "clock" LOC = "b8" ; NET "carga" LOC = "h13" ; NET "para_continua" LOC = "e18" ; NET "novo_quarto" LOC = "d18" ; NET "reset" LOC = "b18" ; NET "SWITCH " LOC = "r17" ; NET "SWITCH " LOC = "n17" ; NET "SWITCH " LOC = "l13" ; NET "SWITCH " LOC = "l14" ; NET "SWITCH " LOC = "k17" ; NET "SWITCH " LOC = "k18" ; NET "SWITCH " LOC = "h18" ; NET "SWITCH " LOC = "g18" ; NET "anodo " LOC = "f17" ; NET "anodo " LOC = "h17" ; NET "anodo " LOC = "c18" ; NET "anodo " LOC = "f15" ; NET "DSPL_cent_seg " LOC = "c17" ; NET "DSPL_cent_seg " LOC = "h14" ; NET "DSPL_cent_seg " LOC = "j17" ; NET "DSPL_cent_seg " LOC = "g14" ; NET "DSPL_cent_seg " LOC = "d16" ; NET "DSPL_cent_seg " LOC = "d17" ; NET "DSPL_cent_seg " LOC = "f18" ; NET "DSPL_cent_seg " LOC = "l18" ; NET "LED " LOC = "j14" ; NET "LED " LOC = "j15" ; NET "LED " LOC = "k15" ; NET "LED " LOC = "k14" ; NET "LED " LOC = "e16" ; NET "LED " LOC = "p16" ; NET "LED " LOC = "e4" ; NET "LED " LOC = "p4" ;


Carregar ppt "Parte 5 – Projeto de um circuito digital de média complexidade LABORG 13/maio/2013 Fernando Gehm Moraes Ney Laert Vilar Calazans."

Apresentações semelhantes


Anúncios Google