|
|
Linha 4: |
Linha 4: |
| *[[Cronograma de atividades (DLP1-EngTel) | Cronograma de atividades ]] | | *[[Cronograma de atividades (DLP1-EngTel) | Cronograma de atividades ]] |
| *[[DLP1-EngTel (Plano de Ensino) | Plano de Ensino]] | | *[[DLP1-EngTel (Plano de Ensino) | Plano de Ensino]] |
− |
| |
− | ==Registro on-line das aulas==
| |
− | ===Unidade 1===
| |
− | ;Aula 1 (23 Mar):
| |
− | *[[DLP1-EngTel (Plano de Ensino) | Apresentação da disciplina]]
| |
− |
| |
− | *Introdução aos dispositivos lógicos programáveis:
| |
− | :* Conceito, tipos de PLDs
| |
− | :* SPLD: PAL, PLA e GAL
| |
− | :* CPLDs
| |
− | ::Ver pag. 413 a 422 de <ref name="PEDRONI2010a"> PEDRONI, Volnei A. Eletrônica digital moderna e VHDL; 1ª ed. Rio de Janeiro:Elsevier, 2010. 619p. . ISBN 9788535234657 </ref>
| |
− | ::Ver pag. 495 a 499 de <ref name="PEDRONI2010b"> PEDRONI, Volnei A. '''Circuit Design and Simulation with VHDL'''; 2ª ed. Massachusetts-EUA:MIT, 2010. 608 p. ISBN 9780262014335 </ref>
| |
− |
| |
− | ;Aula 2 (28 Mar):
| |
− | *Introdução aos dispositivos lógicos programáveis:
| |
− | :* Arquitetura de FPGAs (Xilinx e Altera): CLB, LAB, RAM, DSP, Clock, PLL, I/O
| |
− | :* Fabricantes de DLPs
| |
− | :* Vizualização no Chip Planner de um projeto. (importante todos alunos terem acesso a [[IFSC-CLOUD]]
| |
− | ::Ver pag. 419 a 431 de <ref name="PEDRONI2010a" />
| |
− | ::Ver pag. 499 a 501 de <ref name="PEDRONI2010b" />
| |
− | :*[[Conhecendo os dispositivos lógicos programáveis]]
| |
− | ::Ver pag. 418 a 429 de <ref name="PEDRONI2010a"> PEDRONI, Volnei A. Eletrônica digital moderna e VHDL; 1ª ed. Rio de Janeiro:Elsevier, 2010. 619p. . ISBN 9788535234657 </ref>
| |
− |
| |
− | ===Unidade 2===
| |
− | ;Aula 3 e 4 (30-31 Mar) - Introdução ao VHDL e ambienta EDA - QUARTUS
| |
− |
| |
− | *Exemplo de programação de um full adder.
| |
− | ::Utilize os arquivos [https://owncloud.ifsc.edu.br/index.php/s/FYkGXQSK69JPweb full_adder.qar]
| |
− | * Estrutura do código VHDL
| |
− | * Libraries, Entity, Architecture
| |
− | * Exemplo 2.2 (VHDL) - programação de um flip-flop
| |
− | <syntaxhighlight lang=vhdl>
| |
− | LIBRARY ieee;
| |
− | USE ieee.std_logic_1164.all;
| |
− |
| |
− | ENTITY flip_flop IS
| |
− | PORT (d, clk, rst: IN STD_LOGIC;
| |
− | q: OUT STD_LOGIC);
| |
− | END;
| |
− |
| |
− | ARCHITECTURE flip_flop OF flip_flop IS
| |
− | BEGIN
| |
− | PROCESS (clk, rst)
| |
− | BEGIN
| |
− | IF (rst='1') THEN
| |
− | q <= '0';
| |
− | ELSIF (clk'EVENT AND clk='1') THEN
| |
− | q <= d;
| |
− | END IF;
| |
− | END PROCESS;
| |
− | END;
| |
− | </syntaxhighlight>
| |
− | :* Após a [[criação do projeto em VHDL]] utilizando a descrição de hardware acima, [[compile o código VHDL]].
| |
− | :* Use o [[RTL Viewer]] para ver a descrição RTL do circuito.
| |
− |
| |
− | <center>[[Arquivo:RTL_Ex2_2_Pedronib.png| 400 px]]</center>
| |
− | <center> Figura 1 - Código RTL do Exemplo 2.2 </center>
| |
− |
| |
− | :* Use o [[Technology Map Viewer]] para ver a como o circuito foi mapeado para os elementos lógicos disponíveis no dispositivo FPGA selecionado (EP1C3T100A8)
| |
− |
| |
− | <center>[[Arquivo:TM_Ex2_2_Pedronib.png| 400 px]]</center>
| |
− | <center> Figura 2 - Technology Map do Exemplo 2.2 </center>
| |
− |
| |
− | :* Abra o [[Chip Planner]] e observe no [[Node Properties]] como esse circuito é conectado dentro do dispositivo FPGA selecionado
| |
− |
| |
− | <center>[[Arquivo:ChipPlanner_Ex2_2_Pedronib.png| 400 px]]</center>
| |
− | <center> Figura 3 - Chip Planner do Exemplo 2.2 </center>
| |
− |
| |
− |
| |
− | * Exemplo 2.3 (VHDL e QSIM) - programação de um circuito somador com registrador
| |
− | :: Realizar as simulações funcional e temporal do circuito
| |
− | :: Observar o "Technology Map" e o "RTL" do circuito
| |
− | <syntaxhighlight lang=vhdl>
| |
− | LIBRARY ieee;
| |
− | USE ieee.std_logic_1164.all;
| |
− |
| |
− | ENTITY registered_comp_add IS
| |
− | PORT (clk: IN STD_LOGIC;
| |
− | a, b: IN INTEGER RANGE 0 TO 7;
| |
− | reg_comp: OUT STD_LOGIC;
| |
− | reg_sum: OUT INTEGER RANGE 0 TO 15);
| |
− | END;
| |
− |
| |
− | ARCHITECTURE circuit OF registered_comp_add IS
| |
− | SIGNAL comp: STD_LOGIC;
| |
− | SIGNAL sum: INTEGER RANGE 0 TO 15;
| |
− | BEGIN
| |
− | comp <= '1' WHEN a>b ELSE '0';
| |
− | sum <= a + b;
| |
− | PROCESS (clk)
| |
− | BEGIN
| |
− | IF (clk'EVENT AND clk='1') THEN
| |
− | reg_comp <= comp;
| |
− | reg_sum <= sum;
| |
− | END IF;
| |
− | END PROCESS;
| |
− | END;
| |
− | </syntaxhighlight>
| |
− | :: Acrescente saídas para o sinal '''sum''' e para o sinal '''comp''', de modo a poder observar estes sinais no simulador QSIM e realize novas simulações funcional e temporal.
| |
− |
| |
− | <center>[[Arquivo:RTL_Ex2_3_Pedronib.png | 400 px]] </center>
| |
− | <center> Figura 4 - Código RTL do Exemplo 2.3 </center>
| |
− |
| |
− | ::Para conhecer melhor o ambiente do simulador QSIM veja [[Arquivo:Quartus_II_Simulation.pdf | Introduction to Simulation of VHDL Designs]] da ALTERA.
| |
− |
| |
− | ::Ver pag. 3 a 24 de <ref name="PEDRONI2010b"> PEDRONI, Volnei A. '''Circuit Design and Simulation with VHDL'''; 2ª ed. Massachusetts-EUA:MIT, 2010. 608 p. ISBN 9780262014335 </ref>
| |
− |
| |
− | ;Aula 5 (4 Abr):
| |
− | *Introdução ao VHDL.
| |
− | :*Exemplo de decodificador de endereço genérico
| |
− | <syntaxhighlight lang=vhdl>
| |
− | ENTITY address_decoder IS
| |
− | GENERIC (N: NATURAL := 2);
| |
− | PORT (
| |
− | address: IN NATURAL RANGE 0 TO 2**N-1;
| |
− | ena: BIT;
| |
− | word_line: OUT BIT_VECTOR(2**N-1 DOWNTO 0));
| |
− | END ENTITY;
| |
− |
| |
− | ARCHITECTURE ad_arch1 OF address_decoder IS
| |
− | BEGIN
| |
− | gen: FOR i IN address'RANGE GENERATE
| |
− | word_line(i) <= '1' WHEN ena='0' ELSE
| |
− | '0' WHEN i=address ELSE
| |
− | '1';
| |
− | END GENERATE;
| |
− | END ARCHITECTURE;
| |
− |
| |
− | ARCHITECTURE ad_arch2 OF address_decoder IS
| |
− | signal word_tmp: BIT_VECTOR(2**N-1 DOWNTO 0);
| |
− | BEGIN
| |
− | word_line <= (others => '1') WHEN ena='0' ELSE word_tmp;
| |
− | gen: FOR i IN address'RANGE GENERATE
| |
− | word_tmp(i) <= '0' WHEN i=address ELSE '1';
| |
− | END GENERATE;
| |
− | END ARCHITECTURE;
| |
− |
| |
− | CONFIGURATION ad_conf OF address_decoder is
| |
− | FOR ad_arch1 END FOR;
| |
− | END CONFIGURATION;
| |
− | </syntaxhighlight>
| |
− | ::* Utilize Family = '''Cyclone''' e Device = '''EP1C4F400C6'''
| |
− | ::* Observe que o uso de um valor GENERIC permite criar diferentes tamanhos de hardware de forma muito simples.
| |
− | ::* Usando N = 2, verifique o RTL e o TECHNOLOGY MAP obtido para as duas ARCHITECTURES {ad_arch1, ad_arch2}. A função do CONFIGURATION é definir qual das ARCHITECTURE será associada a ENTITY.
| |
− |
| |
− | <center>[[Arquivo:RTL_Ex2_4_Pedronib.png | 400 px]] </center>
| |
− | <center> Figura 5 - Código RTL do Exemplo 2.4 (N=2) </center>
| |
− |
| |
− | <center>[[Arquivo:TM_Ex2_4_Pedronib.png | 400 px]] </center>
| |
− | <center> Figura 6 - Technology Map do Exemplo 2.4 (N=2) </center>
| |
− |
| |
− | ::* Comente a linha (word_line <= (others => '1') WHEN ena='0' ELSE word_tmp;) e veja o RTL obtido.
| |
− | ::* Verifique o RTL gerado para os casos de N = 2, 3, 4, 8. Perceba que o número de pinos necessário cresce exponencialmente com N. Use o ['''Processing''' > '''Compilation Report'''] e anote o número de '''pinos''' usados, o número de '''elementos lógicos''' e o '''tempo de propagação''' do caminho crítico ('''TimeQuest Timing Analyser''' > '''Datasheet Report''' > '''Propagation Delay''').
| |
− | ::*Restrinja o tempo de propagação entre entrada(s) e saída(s). Para isso é necessário acrescentar ao projeto um arquivo .sdc ([http://quartushelp.altera.com/14.0/mergedProjects/reference/glossary/def_sdc.htm Synopsys Design Constraints File]). No exemplo abaixo é inserida um restrição de máximo atraso ([http://quartushelp.altera.com/15.0/mergedProjects/tafs/tafs/tcl_pkg_sdc_ver_1.5_cmd_set_max_delay.htm set_max_delay]) entre todas as portas de entradas para todas as portas de saída de 15 ns. Para inserir esta restrição crie um arquivo sdc1.sdc com o seguinte conteúdo:
| |
− | set_max_delay -from [get_ports *] -to [get_ports *] 15
| |
− | :::Experimente restringir o tempo máximo atraso em 11ns, 8ns, 6ns e observe o resultado da compilação. Observe o Chip Planner e também o tempo de propagação.
| |
− | ::Ver pag. 22 a 30 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ===Unidade 3===
| |
− | ;Aula 6 (6 Abr):
| |
− | *Tipos de Dados em VHDL.
| |
− | :*Objetos de VHDL: CONSTANT, SIGNAL, VARIABLE, FILE.
| |
− | :*Palavra chave OTHERS
| |
− | :* Bibliotecas padrão.
| |
− | ::* '''ATENÇÃO!!! Não use as bibliotecas que não são padrão (''std_logic_arith, std_logic_unsigned, std_logic_signed''''')
| |
− | :: Ver pag. 31 a 39 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 7 (11 Abr):
| |
− | *Tipos de Dados em VHDL.
| |
− | :* Classificação dos tipos de dados.
| |
− | :* Tipos de dados: BIT, BIT_VECTOR, BOOLEAN, INTEGER, NATURAL, POSITIVE, CHARACTER, STRING, STD_(U)LOGIG, STD_(U)LOGIG_VECTOR
| |
− | ::* Exemplo 3.1 Buffer Tri-state
| |
− | ::* Exemplo 3.2 Circuito com Saida "don't care"
| |
− | :: Ver pag. 39 a 51 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 8 (13 Abr):
| |
− | *Tipos de Dados em VHDL.
| |
− | :* Tipos de dados: SIGNED e UNSIGNED
| |
− | :* Exemplo 3.3 Multiplicador (un)signed
| |
− | :* Tipos de dados: FIXED e FLOAT (apenas conhecer)
| |
− | :* Resumo dos Tipos predefinidos (Tabela 3.6).
| |
− | :* Tipos definidos pelo usuário:
| |
− | ::* Escalares (Inteiros e Enumerados)
| |
− | ::* Tipos de Array 1D x 1D, 2D , 1D x 1D x 1D, 3D
| |
− | :* RECORD e SUBTYPE
| |
− | :* Exemplo 3.8: Multiplexador com porta 1D x 1D.
| |
− | :: Ver pag. 51 a 73 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 9 (14 Abr):
| |
− | *Qualificação de tipos, conversão de tipos (automática, casting e funções de conversão).
| |
− | :* Resumo das funções de conversão de tipos (Tabela 3.10) e ver [[Aritmética com vetores em VDHL]]
| |
− | :* Exemplo 3.9: Multiplicador com sinal
| |
− | <syntaxhighlight lang=vhdl>
| |
− | LIBRARY ieee;
| |
− | USE ieee.std_logic_1164.all;
| |
− | USE ieee.numeric_std.all;
| |
− |
| |
− | ENTITY signed_multiplier IS
| |
− | PORT (
| |
− | a, b: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
| |
− | y: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
| |
− | );
| |
− | END ENTITY;
| |
− |
| |
− | ARCHITECTURE type_conv_arch OF signed_multiplier IS
| |
− | BEGIN
| |
− | y <= std_LOGIC_VECTOR(SIGNED(a) * SIGNED(b));
| |
− | END ARCHITECTURE;
| |
− | </syntaxhighlight>
| |
− |
| |
− | :* Exercício:
| |
− | ::*Implementar em VHDL um circuito que efetue a operação <math>\ y = a^2 + 2*a*b + 5 </math>, utilizando portas do tipo INTEGER para valores de entrada <math>\ a </math> e <math>\ b </math> com sinal e ocupando 4 bits, utilize na saída <math>\ y </math> 8 bits. Determine o número de elementos lógicos e verifique o código RTL obtido. Compare com os colegas.
| |
− | ::*Repita o circuito com as mesmas características, utilizando no entanto portas do tipo STD_LOGIC_VECTOR com 4 bits nas entradas e 8 bits na saída.
| |
− | ::*Faça a simulação funcional do circuito. Teste o circuito no minimo com <math>\ {a = -2, b = 3} => y = -3 </math>, <math>\ {a = 7, b = 6} => y = 138 </math> e <math>\ {a = -8, b = -8} => y = 197 </math>. Note que para valores maiores de entrada <math>\ a </math> e <math>\ b </math> pode ocorrer ''overflow'' devido a limitação do número de bits da saída.
| |
− | :: Ver pag. 73 a 78 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 10 e 11 (18 e 20 Abr):
| |
− | *Operadores em VHDL.
| |
− | :* Operadores predefinidos: Atribuição, Lógicos, Aritméticos, Comparação, Deslocamento, Concatenação, "Matching".
| |
− | :* Sobrecarga de operadores
| |
− | *Atributos em VHDL.
| |
− | :* Atributos predefinidos: tipo escalar e enumerados; tipo array; de sinal;
| |
− | :* Exemplo 4.2 (Simulação funcional)
| |
− | :* Atributos definidos pelo usuário;
| |
− | :* Atributos de síntese:
| |
− | ::* Enum_encoding [http://quartushelp.altera.com/15.0/mergedProjects/hdl/vhdl/vhdl_file_dir_enum_encoding.htm]
| |
− | ::* chip_pin [http://quartushelp.altera.com/15.0/mergedProjects/hdl/vhdl/vhdl_file_dir_chip.htm]
| |
− | :: Ver pag. 91 a 108 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 12 (25 Abr):
| |
− | *Atributos em VHDL.
| |
− | :* Atributos de síntese:
| |
− | ::* keep [http://quartushelp.altera.com/15.0/mergedProjects/hdl/vhdl/vhdl_file_dir_keep.htm]
| |
− | :::* Exemplo 4.4: Delay line (Síntese e Simulação temporal sem o com o atributo keep)
| |
− | :::* Exemplo 5.8 Gerador de Pulsos estreitos
| |
− | ::* preserve [http://quartushelp.altera.com/15.0/mergedProjects/logicops/logicops/def_preserve_fanout_free_node.htm]
| |
− | ::* noprune.
| |
− | :::* Exemplo 4.5: Preserve and noprune attributes
| |
− | <syntaxhighlight lang=vhdl>
| |
− | ENTITY redundant_registers IS
| |
− | PORT (
| |
− | clk, x: IN BIT;
| |
− | y: OUT BIT);
| |
− | END ENTITY;
| |
− |
| |
− | ARCHITECTURE arch OF redundant_registers IS
| |
− | SIGNAL a, b, c: BIT;
| |
− | -- NORMAL -- 1 LE
| |
− | --ATTRIBUTE preserve: BOOLEAN;
| |
− | --ATTRIBUTE preserve OF a, b, c: SIGNAL IS TRUE; -- 2 LE
| |
− | --ATTRIBUTE noprune: BOOLEAN;
| |
− | --ATTRIBUTE noprune OF a, b, c: SIGNAL IS TRUE; --3 LE
| |
− | --ATTRIBUTE keep: BOOLEAN;
| |
− | --ATTRIBUTE keep of a,b,c: SIGNAL IS TRUE;
| |
− | BEGIN
| |
− | PROCESS (clk)
| |
− | BEGIN
| |
− | IF (clk'EVENT AND clk='1') THEN
| |
− | a <= x;
| |
− | b <= x;
| |
− | c <= x;
| |
− | END IF;
| |
− | END PROCESS;
| |
− | y <= a AND b;
| |
− | END ARCHITECTURE;
| |
− | </syntaxhighlight>
| |
− | Após a compilação do código acima, observe o número de elementos lógicos obtidos, observe o '''Technology Map''' dos circuitos gerados e verifique a localização dos FFs no '''Chip Planner'''.
| |
− | <center> [[Arquivo:Ex4_5_NoAttribute.png | Sem Attribute| 400 px]] <br> '''Fig 12. Technology Map do Circuito sem Attribute'''</center>
| |
− | <center> [[Arquivo:Ex4_5_PreserveAttribute.png| Preserve (or Keep) Attribute |400 px]] <br> '''Fig 13. Technology Map do Circuito com Attribute Preserve (or Keep) '''</center>
| |
− | <center> [[Arquivo:Ex4_5_NopruneAttribute.png| Noprune Attribute| 400 px]] <br> '''Fig 14. Technology Map do Circuito com Attribute Noprune '''</center>
| |
− |
| |
− |
| |
− | :* Group
| |
− | :* Alias
| |
− | ::*Exemplo de uso no pacote numeric_std.vhd
| |
− | <syntaxhighlight lang=vhdl>
| |
− | function ADD_UNSIGNED (L, R: UNSIGNED; C: STD_LOGIC) return UNSIGNED is
| |
− | constant L_LEFT: INTEGER := L'LENGTH-1;
| |
− | alias XL: UNSIGNED(L_LEFT downto 0) is L;
| |
− | alias XR: UNSIGNED(L_LEFT downto 0) is R;
| |
− | variable RESULT: UNSIGNED(L_LEFT downto 0);
| |
− | variable CBIT: STD_LOGIC := C;
| |
− | begin
| |
− | for I in 0 to L_LEFT loop
| |
− | RESULT(I) := CBIT xor XL(I) xor XR(I);
| |
− | CBIT := (CBIT and XL(I)) or (CBIT and XR(I)) or (XL(I) and XR(I));
| |
− | end loop;
| |
− | return RESULT;
| |
− | end ADD_UNSIGNED;
| |
− | </syntaxhighlight>
| |
− | :* Exercício 4.17: Discussão de possibilidades de implementação
| |
− | :: Ver pag. 108 a 119, 140 a 142 de <ref name="PEDRONI2010b"/>
| |
− | <!--
| |
− | ;Aula 13 (11 mar):
| |
− | -->
| |
− |
| |
− | *Tempo livre para implementar/testar o [EL3 - Conversor de Binário para BCD].
| |
− |
| |
− | ===Unidade 4===
| |
− | ;Aula 13 (27 Abr):
| |
− | *Código Concorrente.
| |
− | :* Uso de Operadores
| |
− | :* WHEN, SELECT;
| |
− | :* Exemplo 5.1 + 5.2 mux: com 3 tipos de arquiteturas (com operadores, com WHEN, com SELECT)
| |
− | <syntaxhighlight lang=vhdl>
| |
− | LIBRARY ieee;
| |
− | USE ieee.std_logic_1164.all;
| |
− |
| |
− | ENTITY mux IS
| |
− | GENERIC (N: INTEGER :=8);
| |
− | PORT (x0, x1, x2, x3: IN STD_LOGIC_VECTOR(N-1 DOWNTO 0);
| |
− | sel: IN STD_LOGIC_VECTOR(1 DOWNTO 0);
| |
− | y: OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0));
| |
− | END mux;
| |
− | -- Arquitetura para a implementação discreta através de portas AND e OR
| |
− | ARCHITECTURE Operator_only OF mux IS
| |
− | signal sel0_8: STD_LOGIC_VECTOR(N-1 DOWNTO 0);
| |
− | signal sel1_8: STD_LOGIC_VECTOR(N-1 DOWNTO 0);
| |
− | BEGIN
| |
− | sel0_8 <= (OTHERS => sel(0));
| |
− | sel1_8 <= (OTHERS => sel(1));
| |
− | y <= (NOT sel1_8 AND NOT sel0_8 AND x0) OR
| |
− | (NOT sel1_8 AND sel0_8 AND x1) OR
| |
− | (sel1_8 AND NOT sel0_8 AND x2) OR
| |
− | (sel1_8 AND sel0_8 AND x3);
| |
− | END operators_only;
| |
− | </syntaxhighlight>
| |
− |
| |
− | :* Para selecionar uma entre várias arquiteturas para a mesma ENTITY use a CONFIGURATION.
| |
− | <syntaxhighlight lang=vhdl>
| |
− | CONFIGURATION which_mux OF mux IS
| |
− | FOR Operator_only END FOR;
| |
− | -- FOR with_WHEN END FOR;
| |
− | -- FOR with_SELECT END FOR;
| |
− | END CONFIGURATION;
| |
− | </syntaxhighlight>
| |
− | ::Ver pag. 121 a 127 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 14 (28 Abr):
| |
− | *Código Concorrente.
| |
− | :* Uso de GENERATE
| |
− |
| |
− | <i><code>
| |
− | label: FOR identificador IN faixa GENERATE
| |
− | [Parte_Declarativa
| |
− | BEGIN]
| |
− | Instruções_concorrentes
| |
− | ...
| |
− | END GENERATE [label];
| |
− | </syntaxhighlight> </i>
| |
− |
| |
− | ::Exemplo 5.4 - Decodificador genérico de endereços.
| |
− | ::Exemplo 5.5 - Instanciação de COMPONENTE com GENERATE.
| |
− | ::Ver pag. 127 a 134 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 15 (2 Mai):
| |
− | *Código Concorrente.
| |
− | :*Exemplo de uso de operadores e SELECT.
| |
− | ::Exemplo 5.3 - Unidade de Lógica e Aritmética (ALU).
| |
− | ::Alteração do código da ALU:
| |
− | ::* Inclusão de um sinal que indica "erro" quando ocorre ''overflow''/''underflow'' nas operações de soma, incremento ou decremento.
| |
− | ::* Inclusão de um circuito que satura o sinal no máximo positivo ou negativo nas situações de erro.
| |
− | ::* Teste da ALU usando simulação funcional.
| |
− |
| |
− | ;Aula 16 (4 Mai):
| |
− | *Código Concorrente.
| |
− | :* Implementação de circuitos aritméticos com operadores.
| |
− | :* Para o uso dos operadores o mais adequado é utilizar o padrão industrial '''STD_LOGIC_VECTOR'''. Internamente os valores das portas devem ser convertidos ou para valores '''INTEGER''' ou para '''UNSIGNED'''/'''SIGNED'''. para tal é necessário utilizar a biblioteca ''numeric_std''.
| |
− | :* Também é fundamental considerar a faixa de valores coberta por <math> N </math> bits. Para tipos '''UNSIGNED''' a faixa é de <math> 0 </math> até <math> 2^{N}-1 </math>, enquanto que para '''SIGNED''' a faixa é de <math> -2^{N-1} </math> até <math> 2^{N-1}-1 </math>. Assim com 3 bits é possível representar valores entre -4 até 3 com um tipo SIGNED e 0 até 7 com um tipo UNSIGNED.
| |
− | :* Para uso adequado dos operadores também é necessário considerar o tamanho (número de bits) requirido para o resultado em função do tamanho dos operandos.
| |
− | ::* Para operações de "+" ou "-": O tamanho do resultado é igual ao tamanho do maior operando.
| |
− | :::Exemplo: r[7..0] = a[7..0] + b[4..0]; a -> 8 bits; b -> 5 bits então r -> 8 bits.
| |
− | ::* Para a operações "*": O tamanho do resultado é igual a soma do tamanho dos dois operandos.
| |
− | :::Exemplo: r[12..0] = a[7..0] * b[4..0]; a -> 8 bits; b -> 5 bits então r -> 8+5 = 13 bits.
| |
− | ::* Para "/": O tamanho do resultado é igual ao tamanho do numerador.
| |
− | :::Exemplo: r[5..0] = a[5..0] / b[8..0]; a -> 6 bits; b -> 9 bits então r -> 6 bits.
| |
− | :* No caso da operações de "*" e "/" não ocorre ''overflow'', no entanto no caso da "+" e "-", o ''overflow'' pode ocorrer e precisa ser tratado. Isso pode ser feito acrescentando um bit adicional a saída para conter o ''overflow'' ou então sinalizar a sua ocorrência.
| |
− | :* Aula de exercícios:
| |
− | ::5.3 - Porta AND e NAND Genérica.
| |
− | ::5.4 - Gerador de Paridade Genérico.
| |
− | ;Aula 17 (9 Mai):
| |
− | *Código Concorrente.
| |
− | :* Aula de exercícios: Escreve um código VHDL genérico que implemente os seguintes circuitos:
| |
− | :: Ex1 - Conversor de Binário para Gray genérico;
| |
− | <center> [[Arquivo:RTL_Bin2Gray4bits.png | Bin2Gray| 300 px]] <br> '''Fig 16. código RTL do conversor binário para Gray '''</center>
| |
− | :: Ex2 - Conversor de Gray para Binário genérico;
| |
− | <center> [[Arquivo:RTL_Gray2Bin4bits.png | Gray2Bin| 400 px]] <br> '''Fig 17. código RTL do conversor Gray para binário '''</center>
| |
− | :: Ex3 - Utilizando os dois circuitos anteriores e um incrementador binário escreva um código VHDL que implemente um incrementador Gray;
| |
− | <center> [[Arquivo:RTL_Inc_Gray4bits.png | Inc_Gray| 800 px]] <br> '''Fig 18. código RTL do incrementador de código Gray '''</center>
| |
− | <center> [[Arquivo:SF_Inc_Gray4bits.png | Inc_Gray| 800 px]] <br> '''Fig 19. Simulação Funcional do incrementador de código Gray '''</center>
| |
− | :Ver também [[Código Gray]];
| |
− |
| |
− | ;Aula 18 e 19 (11 e 12 Maio):
| |
− | *Código Concorrente.
| |
− | :* Aula de exercicios:
| |
− | ::5.4 - Generic Parity Generator;
| |
− | ::5.6 - Generic Binary-to-Gray Converter;
| |
− | ::5.7 - Hamming Weight with GENERATE;
| |
− | ::5.10/11 - Arithmetic Circuit with INTEGER/STD_LOGIC;
| |
− | ::5.15/16/17/18 - (Un)signed Multiplier/Divider;
| |
− | ::5.19 - Frequency Multiplier.
| |
− |
| |
− | ===Unidade 5===
| |
− | ;Aula 20 (16 Mai):
| |
− | *Código Sequencial.
| |
− | :*Diferenças entre código concorrente e sequencial <=> circuitos combinacional e sequencial
| |
− | :*Diferenças entre os objetos SIGNAL e VARIABLE
| |
− | :*Tipos de elementos de memória: Latch x Flip-flop
| |
− | ::* Latch D
| |
− | ::* Flip-flop tipo D com reset assíncrono e com reset (clear) síncrono
| |
− | :*Seção de código sequencial '''PROCESS''': lista de sensibilidade
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] PROCESS [(lista_de_sensibilidade)] [IS]
| |
− | [parte_declarativa]
| |
− | BEGIN
| |
− | afirmação_sequencial;
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | END PROCESS [rótulo];
| |
− | </syntaxhighlight>
| |
− | :*Instrução '''IF'''
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] IF condição THEN
| |
− | afirmação_sequencial;
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | ELSIF condição THEN
| |
− | afirmação_sequencial;
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | ELSE
| |
− | afirmação_sequencial;
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | END IF [rótulo];
| |
− | </syntaxhighlight>
| |
− | ::*Exemplos: DFFs with Reset and Clear (Variação Ex 6.1), Basic Counter (Ex. 6.2), Shift Register (Ex. 6.3)
| |
− | :*Instrução '''WAIT''': WAIT UNTIL, WAIT FOR (simulação apenas), WAIT ON (não implementada no Quartus II).
| |
− | ::Algumas instruções de '''WAIT''' serão utilizadas na criação de '''TestBench''' em VHDL para a simulação com o '''MODELSIM'''.
| |
− | ::Recomenda-se utilizar a lista de sensibilidade do PROCESS e a instrução IF no lugar do WAIT.
| |
− | :*Ver pag. 161 a 160 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 21 (18 Mai):
| |
− | *Código Sequencial.
| |
− | :*Instruções do tipo '''LOOP''': LOOP incondicional, FOR-LOOP, WHILE-LOOP, NEXT, EXIT
| |
− |
| |
− | ::*LOOP incondicional:
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] LOOP
| |
− | afirmação_sequencial;
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | END LOOP [rótulo];
| |
− | </syntaxhighlight>
| |
− |
| |
− | ::*FOR-LOOP:
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] FOR identificador IN faixa LOOP
| |
− | afirmação_sequencial;
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | END LOOP [rótulo];
| |
− | </syntaxhighlight>
| |
− |
| |
− | ::*WHILE-LOOP:
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] WHILE condição LOOP -- Executa as "afirmações enquanto a "condição" for verdadeira
| |
− | afirmação_sequencial;
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | END LOOP [rótulo];
| |
− | </syntaxhighlight>
| |
− |
| |
− | ::*LOOP com EXIT:
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] [FOR identificador IN faixa] LOOP
| |
− | afirmação_sequencial;
| |
− | EXIT [rótulo] [WHEN condição]; -- Se a "condição" é verdadeira, termina o "LOOP"
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | END LOOP [rótulo];
| |
− | </syntaxhighlight>
| |
− |
| |
− | ::*LOOP com NEXT:
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] [FOR identificador IN faixa] LOOP
| |
− | afirmação_sequencial;
| |
− | NEXT [rótulo] [WHEN condição]; -- Se a "condição" é verdadeira, não executa as linhas até a linha "END LOOP"
| |
− | -- e incrementa o "identificador".
| |
− | afirmação_sequencial;
| |
− | ...
| |
− | END LOOP [rótulo];
| |
− | </syntaxhighlight>
| |
− |
| |
− | ::* Exemplos: Carry-Ripple Adder (FOR-LOOP) (Ex 6.4),
| |
− | :*Ver pag. 161 a 164 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 22 (23 Mai):
| |
− | *Código Sequencial.
| |
− | :*Instrução '''CASE'''
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] CASE expressão IS
| |
− | WHEN valor => atribuições; -- valor único
| |
− | ...
| |
− | WHEN valor1 | valor2 | ... | valorN => atribuições; -- lista de valores
| |
− | ...
| |
− | WHEN valor1 TO valor2 => atribuições; -- faixa de valores
| |
− | ...
| |
− |
| |
− | END CASE;
| |
− | </syntaxhighlight>
| |
− | :*Exemplos:
| |
− | ::* Leading Zeros (LOOP com EXIT) (Ex 6.5)
| |
− | ::* Contador de 0 a 9 segundos com saída SSD (Ex 6.6)
| |
− | ::* Projeto ruim com CASE incompleto (Ex. 6.7)
| |
− | :*Exercícios do Capitulo 6
| |
− | :*Ver pag. 164 a 176 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ;Aula 23 (25 Mai):
| |
− | *Código Sequencial.
| |
− | :* Exercícios do Capítulo 6.
| |
− | Ex 6.2 - Katharine Fertig, Lucas Lucindo, Anderson Demétrio
| |
− | Ex 6.5 - Fabiano Kraemer, Thiago Grisolfi,
| |
− | Ex 6.7 - Kristhine Schaeffer Fertig, Tamara Arrigoni
| |
− | EX 6.10 - Gustavo Constante, Gabriel Cantu
| |
− | Ex 6.11 - Lucas Lucindo, Marcos Pinho, André Felippe Weber
| |
− | Ex.6.14 - Iago Soares, Helen Cechinel
| |
− | Ex.6.15 - Maria Luiza Theisges, Leticia Coelho
| |
− | * Durante a aula os alunos foram orientados na resolução dos exercícios, e simulação usando o QSIM.
| |
− | * Os alunos devem enviar o arquivo QAR contendo o projeto e simulação para o email do professor.
| |
− | * Discuta com os colegas como resolveram o Exercicio proposto para eles. Cada aluno deverá saber solucionar todos os exercícios.
| |
− |
| |
− | ; Aula 24 (30 Mai)
| |
− | *Avaliação A1
| |
− |
| |
− | ; Aula 25 (1 Jun)
| |
− | *Correção da Avaliação A1 - Unidades 2, 3 e 4
| |
− | *Resolução dos exercícios:
| |
− | :* EX 6.10 (Timer de dois digitos) Versão realizada por Gustavo Constante (5 processos) e Gabriel Cantu (processo único). Comparação das diferenças entre as implementações, ''f_{max}, e número de elementos.
| |
− | :* Ex.6.15 (Serializador de dados) Versão realizada por Maria Luiza Theisges
| |
− |
| |
− | ===Unidade 6===
| |
− | ; Aula 26 (6 Jun):
| |
− | *Projeto a nível de Sistema.
| |
− | :* O '''PACKAGE''' e '''PACKAGE BODY''': onde declarar e como usar.
| |
− | :* O '''COMPONENT''': declaração (cópia da '''ENTITY''') e instanciação.
| |
− | ::* Associação dos nomes das portas aos sinais. PORT -> '''PORT MAP''':
| |
− | ::* Mapeamento por posição e nominal.
| |
− | ::* Métodos de declaração de '''COMPONENT'''.
| |
− | :::*Exemplo: Registrador Circular Ex. 8.2
| |
− | :* Ver pag. 201 a 208 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | *Resolução dos exercícios:
| |
− | :*Ex 6.7 (Ordenador Binário) Tamara Arrigoni
| |
− |
| |
− | ; Aula 27 (8 Jun):
| |
− | *Projeto a nível de Sistema.
| |
− | :* Criação de '''COMPONENT''' redimensionáveis. GENERIC -> '''GENERIC MAP'''
| |
− | ::*Exemplo: Porta E com N entradas.
| |
− | ::*Exemplo: Detector de Paridade Ex. 8.3
| |
− | :* Instanciação de '''COMPONENT''' com '''GENERATE'''.
| |
− | ::*Exemplo: Registrador de deslocamento M x N Ex. 8.4
| |
− | :* Ver pag. 208 a 213 de <ref name="PEDRONI2010b"/>
| |
− |
| |
− | ; Aula 28 (13 Jun):
| |
− | *Projeto a nível de Sistema.
| |
− | :* Uso da instrução '''CONFIGURATION'''.
| |
− | ::* Ligação direta: ARCHITECTURE-ENTITY.
| |
− | ::* Ligação da instanciação dos componentes: COMPONENT-ENTITY(ARCHITECTURE).
| |
− | ::*Exercício 28.1: Inserir as duas soluções de ARCHITECTURE do exercício EX 6.10 (Timer de dois digitos) em uma única ENTITY. Utilizar CONFIGURATION para fazer a ligação com a arquitetura desejada.
| |
− |
| |
− | <syntaxhighlight lang=vhdl>
| |
− | entity counter60seg is
| |
− | generic (fclk: integer := 2); -- valor usado para simulação.
| |
− | -- generic (fclk: integer := 50_000_000); -- valor usado para implementação com clk de 50 MHz.
| |
− | port (
| |
− | clk, rst : in std_logic;
| |
− | ssd_un, ssd_dz: out std_logic_vector(6 downto 0));
| |
− | end entity ;
| |
− |
| |
− | architecture version1 of counter60seg is
| |
− | -- Versão proposta por Gabriel Cantu (processo único)
| |
− | ...
| |
− | begin
| |
− | ...
| |
− | end architecture ;
| |
− |
| |
− | architecture version2 of counter60seg is
| |
− | -- Versão proposta por Gustavo Constante (5 processos)
| |
− | ...
| |
− | begin
| |
− | ...
| |
− | end architecture ;
| |
− |
| |
− | configuration counter60seg_cfg of counter60seg is
| |
− | for version1 end for;
| |
− | -- for version2 end for;
| |
− | end configuration;
| |
− |
| |
− | </syntaxhighlight>
| |
− | :* Exercício 28.2: Componentização do circuito conversor de binário para display de sete segmentos. Também modifique a descrição vhdl de modo que a interface dos componentes sejam do tipo '''std_logic''' ou '''std_logic_vector'''.
| |
− | <syntaxhighlight lang=vhdl>
| |
− | entity bin2ssd is
| |
− | port (
| |
− | bin: in std_logic_vector(3 downto 0);
| |
− | ssd: out std_logic_vector(6 downto 0));
| |
− | end entity ;
| |
− |
| |
− | architecture with_case of bin2ssd is
| |
− | ...
| |
− | begin
| |
− | ...
| |
− | end architecture ;
| |
− | </syntaxhighlight>
| |
− |
| |
− | ; Aula 29 (15 Jun):
| |
− | *Projeto a nível de Sistema.
| |
− | FUNCTION e PROCEDURE (são chamados de subprogramas), e podem ser construidos em um PACKAGE, ENTITY, ARCHITECTURE, ou PROCESS.
| |
− |
| |
− | A instrução '''ASSERT''' é útil para verificar as entradas de um subprograma. Seu propósito não é criar circuito, mas assegurar que certos requisitos são atendidos durante a sintese e/ou simulação. Pode ser condicional ou incondicional (condição_booleana = FALSE). A sintaxe da instrução é:
| |
− |
| |
− | <syntaxhighlight lang=vhdl>
| |
− | [rótulo:] assert condição_booleana
| |
− | [report mensagem]
| |
− | [severity nivel_severidade];
| |
− | </syntaxhighlight>
| |
− |
| |
− | A mensagem pode ser criada usando STRINGs que podem ser concatenadas.
| |
− |
| |
− | O nível de severidade pode ser NOTE (para passar informação para o compilador/simulator), WARNING (para informar que algo não usual ocorreu), ERROR (para informar que alguma condição não usual "sério" ocorreu), ou FAILURE (para informar que uma condição não aceitável ocorreu). Normalmente o compilador para quando ocorre um ERROR ou FAILURE. NOTE é o valor "default".
| |
− |
| |
− | :* A '''FUNCTION''': declaração, uso, mapeamento posicional x nominal, PURE x IMPURE.
| |
− |
| |
− | <syntaxhighlight lang=vhdl>
| |
− | function nome_funçao (lista_parametros_entrada) return tipo_saida is
| |
− | declarações
| |
− | begin
| |
− | afirmações sequenciais
| |
− | end function;
| |
− | </syntaxhighlight>
| |
− |
| |
− | :* Uso de '''FUNCTION''' e '''ASSERT'''.
| |
− | ::* Exemplo: Declaração em ARCHITECTURE Ex.9.1
| |
− | ::* Exemplo: Declaração em PACKAGE Ex. 9.2
| |
− | ::* Exemplo: Declaração em ENTITY Ex. 9.3
| |
− |
| |
− |
| |
− | Abaixo segue um exemplo de cálculo do '''log2''' de um número inteiro. Pode ser usado para determinar o número de bits necessário para um número natural.
| |
− |
| |
− | <syntaxhighlight lang=vhdl>
| |
− | function log2c (n : integer) return integer is
| |
− | variable m , p : integer;
| |
− | begin
| |
− | m := 0;
| |
− | p : = 1;
| |
− | while p < n loop
| |
− | m : = m + 1;
| |
− | p := p * 2;
| |
− | end loop;
| |
− | return m;
| |
− | end log2c;
| |
− | </syntaxhighlight>
| |
− |
| |
− | ===Unidade 7===
| |
− | ; Aula 30 (16 Jun):
| |
− | :Simulação com o ModelSim X Qsim
| |
− | :*Simular o circuito utilizando QSIM e ModelSim.
| |
− | :*Executar Modelsim a partir do Quartus II. Simulação usando comandos gráficos.
| |
− | :*Criação de arquivo wave.do (para armazenamento dos sinais e formatos).
| |
− | :*Criação do arquivo tb_circuito.do (para compilar, simular, definir os estimulos e executar 48 hr de simulação).
| |
− | :*Análise dos gráficos temporais e correção do hardware implementado.
| |
− | *Complementos:
| |
− | :*[[Media:modelsim_tut.pdf |ModelSim® Tutorial]] -v10.0d
| |
− | :*[[Media:modelsim_pe_ref.pdf |ModelSim® Reference Manual]] -v10.0d
| |
− | :*[[Media:modelsim_pe_user.pdf |ModelSim® User’s Manual]] -v10.0d
| |
− | :*[[Media:m_qk_guide.pdf |ModelSim® Quick Guide]] -v10.0d
| |
− | :*[[Media:modelsim_se_gui_refv10_2c.pdf |ModelSim® SE GUI Reference Manual]] -v10.2c
| |
− | *Resolução de exercícios: Comparação do uso do QSIM e Modelsim para simular o Ex.6.14 (Relógio Digital) Helen Cechinel
| |
− |
| |
− | ; Aula 31 (20 Jun):
| |
− | :*Uso de '''PROCEDURE'''.
| |
− |
| |
− | <syntaxhighlight lang=vhdl>
| |
− | procedure nome_procedimento (lista_parametros_entrada, lista_parametros_saída) is
| |
− | declarações
| |
− | begin
| |
− | afirmações sequenciais
| |
− | end procedure;
| |
− | </syntaxhighlight>
| |
− |
| |
− | ::*Exemplo: min_max Ex.9.4
| |
− | ::*Exercícios: 9.1 a 9.4, 9.6 a 9.9
| |
− | :* Ver pag. 213 a 239 de <ref name="PEDRONI2010b"/>)
| |
− | :Simulação com o ModelSim
| |
− | :*Seguir o tutorial [http://www.vhdl.us/Book_VHDL_2ed_unrestricted/Pedroni_VHDL_2ed_tutorial_ModelSim_10.1d_v2.pdf]
| |
− | :*Para usar o ModelSim 10.1d na CLOUD-IFSC abra um terminal e digite:
| |
− | /opt/altera/13.0sp1/modelsim_ase/bin/vsim
| |
− | :*Para usar o ModelSim 10.1d no LabProg abra um terminal e digite:
| |
− | /opt/altera/13.0/quartus/modelsim_ase/linux/vsim
| |
− |
| |
− | :*Ler também [ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Tutorials/VHDL/Using_ModelSim.pdf Using ModelSim to Simulate Logic Circuits in VHDL Designs]
| |
− | :*Ver também [http://quartushelp.altera.com/13.1/mergedProjects/eda/simulation/modelsim/eda_pro_msim_func_sim.htm Performing a Functional Simulation with the ModelSim-Altera Software], e [http://quartushelp.altera.com/13.1/mergedProjects/eda/simulation/modelsim/eda_pro_msim_timing_sim.htm Performing a Timing Simulation with the ModelSim-Altera Software].
| |
− | :*[[Seguindo o tutorial da ALTERA para o MODELSIM]] - exemplo de um somador serial de 8 bits (projeto hierárquico com componentes: shift register, full adder e FSM)
| |
− |
| |
− |
| |
− | *Resolução dos exercícios:
| |
− | :*Ex 6.2 (Contador Gray) Katharine Fertig
| |
− | :*Ex 6.5 (Registrador de deslocamento com Carga) Fabiano Kraemer, Thiago Grisolfi
| |
− | :*Ex 6.11 (Medidor de Frequências) Lucas Lucindo, Marcos Pinho, André Felippe Weber
| |
| | | |
| ==UNIDADE 8== | | ==UNIDADE 8== |