1 / 23

VHDL (outros tópicos)

VHDL (outros tópicos). MO801/MC912. Outros tipos de portas. Tipos já vistos in out Novos tipos inout buffer. inout. Porta de entrada e saída Considerado um fio com possibilidade de escrita e leitura Quando é feita uma leitura, funciona como uma porta in

Download Presentation

VHDL (outros tópicos)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. VHDL (outros tópicos) MO801/MC912

  2. Outros tipos de portas • Tipos já vistos • in • out • Novos tipos • inout • buffer

  3. inout • Porta de entrada e saída • Considerado um fio com possibilidade de escrita e leitura • Quando é feita uma leitura, funciona como uma porta in • Quando é feita uma escrita, funciona como uma porta out • Como saber quando é in e quando é out?

  4. buffer • É uma porta de saída com um buffer que faz realimentação • Considerado um fio com possibilidade de escrita e leitura • Quando é feita uma leitura, o valor presente na porta é lido • Quando é feita uma escrita, funciona como uma porta out

  5. Aliases • Permite que seja dado outro nome para um dado elemento • Um campo dentro de um registro • Um subconjunto de bits de um vetor de bits • Tipo de dados • Funções • Podem ser definidos alias de alias • Todas as operações aplicadas a um alias é aplicada ao elemento original

  6. Exemplo type register_array is array(0 to 15) of bit_vector(31 downto 0); type register_set isrecord general_purpose_registers : register_array; program_counter : bit_vector(31 downto 0); program_status : bit_vector(31 downto 0); end record; variable CPU_registers : register_set; alias GPR is CPU_registers.general_purpose_registers; alias SP is GPR(15); alias PSW is CPU_registers.program_status; alias interrupt_level : bit_vector(4 downto 0) is PSW(30 downto 26);

  7. Arquivos • Existem dois arquivos do tipo text já abertos por padrão • input • Mapeado no dispositivo de entrada padrão (geralmente é o teclado) • output • Mapeado no dispositivo de saída padrão (geralmente é a tela)

  8. Tipos • Representação de inteiros sobre bits • unsigned, signed • Complemento de 2 (bit de sinal à esquerda) • Package numeric_bit type unsigned is array (naturalrange <>) of bit; type signed is array (naturalrange <>) of bit; • Package numeric_std type unsigned is array (naturalrange <>) of std_logic; type signed is array (naturalrange <>) of std_logic;

  9. Conversões • to_integer • Converte signed para integer e unsigned para natural • to_unsigned • Converte natural para unsigned • to_signed • Converte integer para signed • Mais detalhes no capítulo 8 do livro

  10. Codificação de tipos enumerados • Por padrão, é responsabilidade das ferramentas de síntese definir como serão codificados os tipos enumerados • O projetista pode sobrepor esse padrão definindo o atributo enum_encoding attribute enum_encoding : string; type state is (idle, preamble, data, crc, ok, error); attribute enum_encoding of state : typeis “000 001 010 011 100 111”; • A ordem crescente deve ser mantida

  11. Desligando a ferramenta de síntese • A ferramenta de síntese pode ser desligada para alguns trechos de código • Útil para incluir testes internamente nos modelos • Dois comentários especiais controlam a ferramenta -- rtl_synthesis off -- rtl_synthesis on • Algumas ferramentas também aceitam a versão -- pragma translate off -- pragma translate on

  12. Exemplos extras • Opções para o GHDL • Comunicação com múltiplos domínios de freqüência • Carga de memória para simulação • Use alias para quebrar sinais • Portas para banco de registradores

  13. Opções do GHDL • Analisar o código ghdl –a –ieee=synopsys arquivo.vhd • Elaborar a entidade (gerar um executável) ghdl –e –ieee=synopsys arquivo • Outras opções úteis • i: Importa um arquivo para a biblioteca • gen_makefile: cria um Makefile --vcd=arq.vcd: gera um arquivo no formato VCD com as formas de ondas (só é válido no executável)

  14. Múltiplos domínios de freqüência • Como fazer a comunicação de dois módulos que trabalham em freqüências diferentes? A 17 MHz B 22 MHz

  15. Definir um protocolo • O Clock não pode ser considerado • Definir sinais de handshake para cada lado • Usar registradores nos dois lados do canal de comunicação • Cuidado com latches • Funciona em situações simples • Transporta o problema de temporização para dentro do circuito!

  16. Situações específicas • Sabe-se, antecipadamente, qual dos dois módulos é o mais rápido • Se as freqüências são muito distintas, o problema fica mais simples • Ex.: A trabalha com mais do que o dobro da freqüência de B

  17. Carga de Memória em Simulação • Como modelar uma ROM/RAM? • Como simulá-la? • Como carregar um valor inicial? • Como fazer um mesmo módulo que seja útil na simulação e na síntese?

  18. ROM • Versão mais simples: • Vetor de constantes • Alternativa • case sobre o endereço • Fará com que a ferramenta de síntese tente otimizar a memória com lógica • A temporização será modificada

  19. Dicas • Utilize os flags para desabilitar a ferramenta de síntese --rtl_synthesis off --rtl_synthesis on • Inclua um generic no componente passando o nome do arquivo • Permite que o mesmo componente seja usado mais de uma vez no projeto • Não se esqueça de parametrizar o intervalo dos endereços e a largura dos dados também

  20. Como zerar uma memória? • Síntese • Gastar ao menos N ciclos de clock para escrever N zeros na memória de N posições • Simulação • Declarar a memória com valor inicial zerado signal Memoria isarray(0 to 255) of std_logic_vector(31 downto 0) := (others => (others => ‘0’));

  21. Use alias para quebrar sinais • Exemplos type TInstrucao is unsigned(15 downto 0); signal instrucao : TInstrucao; alias opcode : unsigned(3 downto 0) is instrucao(15 downto 12); alias rd : unsigned(3 downto 0) is instrucao(11 downto 8); alias imm12 : unsigned(11 downto 0) is instrucao(11 downto 0); • Todos os acessos feitos serão considerados em relação ao sinal instrucao • rd = imm12(11 downto 8) !

  22. Portas para banco de registradores • Quantas portas o banco de registradores acessado pela máquina de estados abaixo precisa? case estado is when A => val1 <= RB(end1); when B => val2 <= RB(end2); when C => val3 <= RB(end3); endcase;

  23. Sugestão de escrita signal endereco, valor : … valor <= RB(endereco); … process … case estado is when A => endereco <= end1; val1 <= valor; when B => endereco <= end2; val2 <= valor; when C => endereco <= end3; val3 <= valor; end case; • Cuidado com a temporização!

More Related