Suporte de funcionamento e interacção com o teclado

Documentos relacionados
Disciplina de SSC Elementos de Lógica Digital II (Prática)

FSM em VHDL e Verificação Funcional. CMP de junho de 2006

Lógica Reconfigurável

Exercícios de Fixação

Universidade Federal de Santa Catarina Centro Tecnológico Departamento de Informática e Estatística Curso de Graduação em Ciências da Computação

12/11/13. Obje%vos do laboratório. SST20707 Síntese de Sistemas de Telecomunicações. Síntese de máquinas de estado (FSM) Finite State Machine (FSM)

TIPO INTEGER. Profa. Luiza Maria Romeiro Codá 2

CIRCUITOS SEQUENCIAIS parte 1

low): Descreve o que o sistema deve fazer utilizando expressões lógicas.

ISE com VHDL estrutural

Tipos enumerados definem uma lista de valores, e são especialmente úteis na

2006, António Esteves, Sistemas Digitais 1, UM-DI. Módulo 6. Sistemas sequenciais

Laboratório sobre Implementação de Sistemas Digitais com VHDL Acesso à Memória Externa na Plataforma de Prototipação XS40/XST-1

Introdução à Linguagem VHDL

Revisão: Projeto e síntese de Circuitos Digitais em FPGA

Módulo 4 Introdução ao VHDL

VHDL. Descrição e Projeto de Circuitos Utilizando VHDL

Descrição por fluxo de dados (Data-Flow): Descreve o que o sistema deve fazer utilizando expressões lógicas.

Descreva em VHDL, simule no simulador logico e sintetize usando uma ferramenta de CAD para FPGA :

CMP238 Projeto e Teste de Sistemas VLSI

LABORG. Parte 5 Projeto de um circuito digital de média complexidade. Fernando Gehm Moraes Matheus Trevisan

Algumas questões de prova recentes com seus gabaritos

Registradores. Circuitos Lógicos. DCC-IM/UFRJ Prof. Gabriel P. Silva

Disciplina de SSC Elementos de Lógica Digital II (Prática)

LABORG. Parte 5 Projeto de um circuito digital de média complexidade Parte 2. Fernando Gehm Moraes Matheus Trevisan

Eletrônica Digital para Instrumentação. Prof: Herman Lima Jr

Implementação de um Sistema Digital em VHDL Cronômetro para Jogos de Basquete

Fundamentos de Sistemas Digitais. Lógica Sequencial. Prof. Dr. Alexandre M. Amory Prof. Dr Edson I. Moreno

Fundamentos de sistemas digitais. Test-bench. prof. Dr. Edson Ifarraguirre Moreno

Gustavo G. Parma. Objetivos: O aluno deverá ser capaz de compreender os conceitos básicos de VHDL.

Organização e Arquitetura de Computadores II

Exercícios de Laboratório 3

Lógica Reconfigurável

Projeto com Dispositivos Programáveis

Desenvolvimento de um circuito aritmético em VHDL

Lógica Reconfigurável

Projeto de Circuito Combinacional

VHDL - VHSIC Hardware Description Language. Exemplo prático. Raiz Quadrada

Lógica Reconfigurável

ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES I. Introdução ao VHDL. César A. M. Marcon

Introdução ao VHDL. Circuitos Lógicos. DCC-IM/UFRJ Prof. Gabriel P. Silva. Original por Ayman Wahba

DISPOSITIVOS LÓGICOS PROGRAMÁVEIS - DLP. 10/03/2017 Prof. Alexandre - ELP1DLP1 / DEE

LABORG. VHDL Máquina de estados finitos

Descrição de um Hardware Multiplicador Parametrizável para Números Sinalizados em Complemento a Dois em Lógica Configurável

Tópicos Especiais 2 Capítulo 3 Introdução ao VHDL, sintaxe básica, tipo de dados e atribuições

Aula 2 Semântica de VHDL

CIRCUITOS SEQUENCIAIS parte 2 Máquina de Estados Finita (FSM)

FPGA & VHDL. Tutorial Aula 1. Computação Digital

Manual de Utilizador Placa DETIUA-S3

Sistemas Digitais Unidade Lógica e Aritmética - ULA

VHDL Circuitos Combinacionais

Descrição e Projeto de Circuitos Utilizando VHDL

Introdução a Sistemas Digitais

Prof. Leonardo Augusto Casillo

Laboratório sobre Implementação de Sistemas Digitais com VHDL Multiplicação por somas sucessivas

CMP238 Projeto e Teste de Sistemas VLSI

Universidade Federal de Santa Catarina Centro Tecnológico Departamento de Informática e Estatística Curso de Graduação em Ciências da Computação

DISPOSITIVOS LÓGICOS PROGRAMÁVEIS - DLP. 18/04/2016 Prof. Alexandre - ELP1DLP1 / DEE

FPGA & VHDL. Tutorial

Introdução a Sistemas Digitais

PRÁTICAS PARA DESENVOLVIMENTO DE PROTÓTIPOS DE CIRCUITOS DIGITAIS COM O KIT EDUCACIONAL DE2

Exercícios Referentes à Prova P1

AMOSTRAGEM DE SINAIS ANALÓGICOS POR

Livro texto: VHDL- Descrição e Síntese de Circuitos Digitais Roberto D Amore Editora LTC

VHDL. Prof. Maurício A Dias Laboratório de Lógica Digital

Introdução VHDL Parte 4 - Testbench

IMPLEMENTAÇÕES POR EQUAÇÃO DE ESTADOS E DE SAÍDA DOS MODELOS DE MEALY E DE MOORE 1 BIT POR ESTADO.

Lógica Reconfigurável

CIRCUITO DE AMOSTRAGEM E RETENÇÃO

EPUSP PCS 2355 Laboratório Digital. Contadores em VHDL

Introdução à Linguagem VHDL

LABORG. Parte 3 - VHDL: Processos, Paralelismo e o Comando process. Fernando Gehm Moraes Ney Laert Vilar Calazans

Trabalho Prático Nº3 Porta Paralela

Desenvolvimento de circuitos reconfiguráveis para interface série usando o protocolo RS-232

Introdução. VHDL: VHSIC Hardware Description Language. Origem: VHSIC: Very High Speed Integrated Circuits. Departamento de Defesa EUA

VHDL Lógica Síncrona. Sinais de Saída. Sinais de Entrada. barreira. carg. VHDL -Lógica Síncrona

Circuitos Seqüenciais

LABORG. Parte 1 Introdução à Simulação em VHDL. Ney Laert Vilar Calazans

Técnicas Digitais para Computação

Curso Superior de Sistemas de Telecomunicações Unidade São José. Disciplina: Síntese de Sistemas de Telecomunicações 7º Fase

ELETRÔNICA DIGITAL I

Projeto de Somador com e sem Sinal. Qualificadores

Arquitetura de Computadores

Prototipação em PLDs

Eletrônica Digital para Instrumentação. Herman Lima Jr.

SIMULAÇÃO DE CIRCUITOS

PCS Sistemas Digitais I. Circuitos Combinatórios Blocos Básicos: (De)Multiplexadores e Dispositivos tri-state. Prof. Dr. Marcos A. Simplicio Jr.

Introdução à Computação

Universidade Federal de Santa Catarina Centro Tecnológico Departamento de Informática e Estatística Curso de Graduação em Ciências da Computação

SISTEMAS DIGITAIS TRABALHO DE LABORATÓRIO IV CIRCUITO DE PROCESSAMENTO DE DADOS RELATÓRIO

SISTEMAS DIGITAIS. Linguagem de Descrição de Hardware VHDL. Prof. Fernanda Gusmão de Lima Kastensmidt

Microprocessadores. Introdução ao Prof. Henrique

Laboratório sobre Implementação de Sistemas Digitais com HDLs Ferramentas de Captura e Validação

Introdução à Simulação em VHDL. Ney Laert Vilar Calazans

Eletrônica Digital para Instrumentação

AULA 5 Aplicação com divisor de freqüência com o CI Livro Texto pág.197 a 200.

SISTEMAS DIGITAIS (SD)

Exercícios Referentes à Prova P2

Transcrição:

Suporte de funcionamento e interacção com o teclado Autor: André Amaral Costa (nº 7578) Curso: Universidade de Aveiro Data: 6 de Dezembro de 006 Disciplina: Docente: Valery Sklyarov

Introdução Neste trabalho desenvolveu-se hardware e software para interacção com um dispositivo de entrada (teclado) utilizando, para isso, o auxílio da placa DETIUA S desenvolvida no departamento de Electrónica, Telecomunicações e Informática da Universidade de Aveiro. O hardware foi desenvolvido sob a forma de uma PCB, onde foram soldados posteriormente todos os componentes electrónicos, utilizando para o efeito o programa Orcad Release 9.1. O desenvolvimento do software foi feito utilizando a linguagem VHDL no ambiente Xilinx ISE 8.i. Objectivos O trabalho tem como objectivo a escrita de valores ascii ou scan codes em led s ou em displays de sete segmentos, conforme sejam pressionadas as teclas do teclado. A escolha do código a visualizar (ascii ou scan code) bem como a escolha do dispositivo de saída (led ou display) é feita recorrendo a dois DIP switches colocados no hardware desenvolvido no âmbito deste trabalho. Descrição do trabalho Hardware Neste trabalho desenvolveu-se uma PCB que irá ser conectada à placa DETIUA-S desenvolvida no departamento de Electrónica, Telecomunicações e Informática através de pinos acessíveis que fornecem ligações a uma FPGA da família Spartan. A placa desenvolvida contém: - Conector de 0 pinos (para ligar a placa DETIUA_S); - Conector de 6 pinos (para ligar a placa DETIUA_S); - Conector PS ; - DIP switches; - 8 led s ; - display s de sete segmentos; Pretende-se portanto ler valores do teclado, que estará ligado ao conector PS, e escrever os valores lidos nos led s ou nos display s de sete segmentos. Os DIP switches permitem a escolha dos valores de saída (códigos ascii ou scan codes) e também a escolha do dispositivo de saída (led s ou display s). Em anexo encontra-se o esquema eléctrico da placa (anexo 1) bem como o desenho da PCB (anexo e ) desenvolvida neste trabalho.

Software O software desenvolvido permite implementar as funcionalidades acima descritas. Este foi desenvolvido na linguagem VHDL no ambiente Xilinx ISE 8.i webpack. Este é constituído por blocos distintos, cada um com uma funcionalidade diferente, como se pode ver no esquemático em anexo (anexo ): - DCM Este bloco permite alterar a frequência do relógio de 80 MHz (disponível na placa DETIUA-S) para 5 MHz e também criar um sinal de reset para o resto do circuito. Este bloco já se encontra disponível na biblioteca do Xilinx ISE 8.i. - Keyb Este bloco permite ler o scan code do teclado quando uma tecla é pressionada. Tem como entradas os sinais de dados e relógio do teclado (ps_data e ps_clk) bem como o relógio do sistema (clk5) e o sinal de reset (rst). Apresenta como saídas um sinal de 8 bits com o scan code (SCAN_code(7:0)) lido e um sinal que indica se o teclado está ocupado ou não (busy). - Cod_converter Neste bloco é feita a escolha do código de saída pretendido. Este código pode ser alterado actuando sobre o DIP switch 0. Tem como entradas o scancode lido do teclado (scan_code), o DIP switch 0 (dip0) e o sinal de busy do teclado. Este apresenta, na saída, o código já convertido (ascii ou scancode) num sinal de 8 bits chamado code. - Choose_out A escolha do dispositivo de saída pretendido é feita neste bloco. Actuando sobre o DIP switch 1 pode-se optar por visualizar o código nos led s ou nos display s de sete segmentos. Este bloco tem como entradas o código convertido proveniente do bloco Cod_converter (code), o sinal de reset (rst), o sinal do DIP switch 1 (dip1). As saídas são dois vectores, um de 8 bits para os led s (led) e outros de 1 bits para os dois display s de sete segmentos (segment). O código feito para estes blocos encontra-se em anexo (anexo 5,6,7).

Anexos Anexo 1: Hardware - Esquema eléctrico da placa desenvolvida 6 10 1 1 16 18 0 6 8 0 6 8 8 10 1 1 16 18 0 6 8 0 JF1 JR 10k R0 R1 R R R R5 R6 R7 1k 1k 1k 1k 1k 1k 1k 1k D7 R9 R11 R1 560 560 560 R17 560 R19 560 R1 560 PS connector J1 CON10C 1 5 1 11 1 15 17 19 1 5 7 9 1 5 7 9 11 1 15 17 19 1 5 7 9 1 5 7 9 1 1 5 6 5 6 R R 10k DIP Switch (1:0) JR1 1 D0 D1 D D D D5 D6 R8 560 R15 560 R10 R1 R1 R16 R18 R0 560 560 560 560 560 560 JP 1 10 9 8 7 6 J CON10C 1 5 10 9 8 7 6

Anexo : Hardware - Desenho da parte superior da PCB (TOP) 5

Anexo : Hardware - Desenho da parte inferior da PCB (BOT) 6

Anexo : Software Esquemático 7

Anexo 5: Software Bloco keyb library IEEE; use IEEE.STD_LOGIC_116.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Inputs / Outputs entity keyb is Port ( clk5 : in STD_LOGIC; -- Relógio 5 MHz rst : in STD_LOGIC; -- Sinal de RESET ps_clk : in STD_LOGIC; -- Sinal de relógio do teclado ps_data : in STD_LOGIC; -- Sinal de dados do teclado busy : inout STD_LOGIC; -- Sinal de ocupação do teclado SCAN_code : out STD_LOGIC_VECTOR (7 downto 0)); -- SCANCODE lido end keyb; architecture Behavioral of keyb is -- Internal signal signal improve_signal : std_logic_vector(7 downto 0); signal pulse : std_logic; -- Transição descendente do sinal de relógio count : natural range 0 to ; -- Numero de bits lidos signal byte : std_logic_vector(7 downto 0); -- Scancode enviado signal begin --Processo que detecta transições descendentes do relogio do teclado --Previne sentir glitches como dados process(clk5,rst) begin if (rst='0') then improve_signal<= (others=>'0'); elsif rising_edge(clk5) then improve_signal<= improve_signal(6 downto 0) & ps_clk; if improve_signal = "10000000" then pulse<= '1'; else pulse <= '0'; end process; -- Processo que lê os scancodes quando alguma tecla é pressionada process(pulse, rst) begin 8

if (rst='0') then count <= 0; SCAN_code<= (others=>'0'); busy<='0'; elsif rising_edge(pulse) then if (ps_data ='0') then if (busy='0') then busy<='1'; count <= count + 1; -- Start BIT else null; else null; case count is when 0 => null; when 1 to 8 => count <= count + 1; byte(count-1)<= ps_data; when 9 => count <= count + 1; SCAN_code <= byte; when 10 => if (ps_data='1') then count<= count+1; else null; when 11 => if (ps_data ='0') then count <= count + 1; else null; when 1 to 0 => count <= count + 1; when 1 => if (ps_data='1') then count<= count+1; else null; when => if (ps_data ='0') then count <= count + 1; else null; 9

when to 1 => count <= count + 1; end process; end Behavioral; when => if (ps_data='1') then count<= count+1; busy<='0'; count <= 0; else null; end case; 10

Anexo 6: Software Bloco Cod_converter library IEEE; use IEEE.STD_LOGIC_116.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity cod_converter is Port ( dip0 : in STD_LOGIC; code : out STD_LOGIC_VECTOR (7 downto 0); busy: in std_logic; -- sincronizacao scan_code:in std_logic_vector(7 downto 0)); -- keyboard scan code end cod_converter; architecture Behavioral of cod_converter is begin process(scan_code,busy) begin if busy/='1' then if dip0='1' then case scan_code is --Digitos when x"5" => code <= x"0"; when x"16" => code <= x"1"; when x"1e" => code <= x""; when x"6" => code <= x""; when x"5" => code <= x""; when x"e" => code <= x"5"; when x"6" => code <= x"6"; when x"d" => code <= x"7"; when x"e" => code <= x"8"; when x"6" => code <= x"9"; --Caracteres when x"1c" => code <=x"1"; --A when x"" => code <=x""; --B when x"1" => code <=x""; --C when x"" => code <=x""; --D when x"" => code <=x"5"; --E when x"b" => code <=x"6"; --F when x"" => code <=x"7"; --G when x"" => code <=x"8"; --H when x"" => code <=x"9"; --I when x"b" => code <=x"a"; --J when x"" => code <=x"b"; --K when x"b" => code <=x"c"; --L when x"a" => code <=x"d"; --M 11

when x"1" => code <=x"e"; --N when x"" => code <=x"f"; --O when x"d" => code <=x"50"; --P when x"15" => code <=x"51"; --Q when x"d" => code <=x"5"; --R when x"1b" => code <=x"5"; --S when x"c" => code <=x"5"; --T when x"c" => code <=x"55"; --U when x"a" => code <=x"56"; --V when x"1d" => code <=x"57"; --W when x"" => code <=x"58"; --X when x"5" => code <=x"59"; --Y when x"1a" => code <=x"5a"; --Z when x"66" => code <= x"0"; -- BACKSPACE when x"9" => code <= x"0"; -- SPACE when others => null; end case; elsif dip0='0' then code<=scan_code; end process; end Behavioral; 1

Anexo 7: Software Bloco Choose_out library IEEE; use IEEE.STD_LOGIC_116.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity choose_out is Port ( code : in STD_LOGIC_VECTOR (7 downto 0); dip1 : in STD_LOGIC; led : inout STD_LOGIC_VECTOR (7 downto 0); rst: in std_logic; segment : inout STD_LOGIC_VECTOR (1 downto 0)); end choose_out; architecture Behavioral of choose_out is begin signal code_msb: STD_LOGIC_VECTOR ( downto 0); signal code_lsb: STD_LOGIC_VECTOR ( downto 0); process (dip1) begin if dip1='1' then code_msb<=code(7 downto ); code_lsb<=code( downto 0); case code_msb is when "0000" => segment(1 downto 7)<= "1111110"; when "0001" => segment(1 downto 7)<= "0011000"; when "0010" => segment(1 downto 7)<= "1101101"; when "0011" => segment(1 downto 7)<= "0111101"; when "0100" => segment(1 downto 7)<= "0011011"; when "0101" => segment(1 downto 7)<= "0110111"; when "0110" => segment(1 downto 7)<= "1110111"; when "0111" => segment(1 downto 7)<= "0011100"; when "1000" => segment(1 downto 7)<= "1111111"; when "1001" => segment(1 downto 7)<= "0111111"; when "1010" => segment(1 downto 7)<= "1011111"; when "1011" => segment(1 downto 7)<= "1111111"; when "1100" => segment(1 downto 7)<= "1100110"; when "1101" => segment(1 downto 7)<= "1111110"; when "1110" => segment(1 downto 7)<= "1100111"; when "1111" => segment(1 downto 7)<= "1000111"; when others => null; end case; case code_lsb is when "0000" => segment(6 downto 0)<= "1111110"; when "0001" => segment(6 downto 0)<= "0011000"; 1

when "0010" => segment(6 downto 0)<= "1101101"; when "0011" => segment(6 downto 0)<= "0111101"; when "0100" => segment(6 downto 0)<= "0011011"; when "0101" => segment(6 downto 0)<= "0110111"; when "0110" => segment(6 downto 0)<= "1110111"; when "0111" => segment(6 downto 0)<= "0011100"; when "1000" => segment(6 downto 0)<= "1111111"; when "1001" => segment(6 downto 0)<= "0111111"; when "1010" => segment(6 downto 0)<= "1011111"; when "1011" => segment(6 downto 0)<= "1111111"; when "1100" => segment(6 downto 0)<= "1100110"; when "1101" => segment(6 downto 0)<= "1111110"; when "1110" => segment(6 downto 0)<= "1100111"; when "1111" => segment(6 downto 0)<= "1000111"; when others => null; end case; led<="00000000"; else led<=code; segment<="00000000000000"; end process; end Behavioral; 1