Universidade Federal do Piauí Centro de Tecnologia Curso de Engenharia Elétrica PROJETO DE CIRCUITOS INTEGRADOS VLSI Prototipagem Prof. Marcos Zurita zurita@ufpi.edu.br www.ufpi.br/zurita Teresina - 2013
Prototipagem de um Modelo HDL em FPGA Uma vez um sistema descrito em uma linguagem HDL foi simulado com êxito, o mesmo pode ser prototipado em FPGA. Para isto, o primeiro passo é associar cada terminal externo do modelo à um pino do FPGA escolhido. Geralmente, para a modelagem de um sistema VLSI, adota-se uma placa de desenvolvimento em FPGA cujas características se adequem ao sistema alvo. Conhecendo-se a placa de desenvolvimento adotada, a determinação dos pinos do FPGA a serem utilizados torna-se bastante simples, bastando para isso uma rápida análise do manual da placa. 2
Prototipagem Placa de Desenvolvimento Adotada Altera Nios II Development Kit - Stratix II Edition Ethernet USER I/O Stratix II FPGA EP2S60F672C5ES RS232 RS232 USER I/O Memória SRAM Memória FLASH FLASH Card MAX CPLD Memória DRAM USER LEDs USER Keys USER Displays 3
Associando Terminais do Modelo à Pinos do FPGA A associação dos terminais externos de um modelo HDL à pinos do FPGA no Quartus II pode ser feita basicamente de quatro formas: Utilizando o Pin Planner; Utilizando o Assignment Editor; Edição manual do arquivo.qsf ; Inserção de atributos de síntese no código HDL. A fim de ilustrar as formas possíveis de associação de pinos, considere o modelo a seguir: 4
Divisor de Clock Divisor do clock de entrada (50MHz) com resposta visual: LEDs 0 à 3: correspondem ao clock de entrada dividido por 2 26 à 2 23, respectivamente; LEDs 4 à 7: correspondem ao estado das teclas user_pb[0] à user_pb[3], respectivamente. Vcc clock (50MHz) reset user_pb[0] user_pb[1] user_pb[2] user_pb[3] clk rst_n clock_divider ledg[0] ledg[1] ledg[2] ledg[3] ledg[4] ledg[5] ledg[6] ledg[7] 5
Código de Implementação Divisor de Clock module clock_div(input logic clk, rst_n, output logic [7:0] ledg, input [3:0] user_pb); logic [25:0] c; logic [1:0] scaler; always_ff @(posedge clk, negedge rst_n) c[0] <= (~rst_n)? 1'b0 : ~c[0]; Terminais externos do módulo clock_div genvar i; // variável de indexação para o 'generate-for' generate for (i=0; i < 25; i++) begin : clocks always_ff @(posedge c[i], negedge rst_n) c[i+1] <= (~rst_n)? 1'b0 : ~c[i+1]; end endgenerate always_comb begin for (int j=0; j<4; j++) begin ledg[j] = c[25-j]; ledg[j+4] = ~user_pb[j]; end end endmodule 6
Diagrama RTL para o divisor de clock Detalhe dos 6 últimos FFs da cadeia: 7
Quartus II Pin Planner Janelas de tarefas e relatório Mapa de pinos do FPGA adotado Listagem dos pinos do FPGA 8
Quartus II Pin Planner: Mapa de Pinos do FPGA Pinos atribuídos ao projeto 9
Quartus II Pin Planner Exibe a legenda dos pinos Nome do terminal no código HDL Pino associado no FPGA Padrão de I/O relacionado Direção do sinal Banco de I/O correspondente ao o pino Grupo de alimentação correspondente 10
Quartus II Assignment Editor 11
Arquivo.qsf Gerado automaticamente pelo Quartus na criação do projeto, tendo o mesmo nome base; Atualizado automaticamente a cada síntese; Reúne diversas configurações relativas à síntese do projeto, dentre elas, a configuração dos pinos do FPGA e os terminais do modelo para os quais apontam; No.qsf, cada pino do FPGA pode ser atribuído a um terminal do modelo HDL por uma instrução específica. Sintaxe: set_location_assignment nome_do_terminal -to PIN_ID_DO_PINO -comment "comentário opcional" set_location_assignment PIN_ID_DO_PINO -to nome_do_terminal -comment "comentário opcional" Exemplos: set_location_assignment PIN_AF15 -to clock set_location_assignment addr[10] -to PIN_M20 -comment "Endereço da ROM" 12
Adicionalmente, é possível especificar também o padrão de tensão de I/O para um terminal já associado. Sintaxe: set_instance_assignment -name IO_STANDARD "Padrão_Adotado" -to nome_do_terminal Exemplo: set_instance_assignment -name IO_STANDARD "3.3 V" -to addr[10] Por fim, pode-se também configurar, se necessário, a força do sinal de saída em um pino já associado. Sintaxe: set_instance_assignment -name CURRENT_STRENGTH_NEW "ForçaDoSinal" -to nomedoterminal Exemplo: set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to addr[10] 13
Acrescentar ao final do arquivo.qsf: Pinagem do Clock, Reset, LEDs e Chaves set_global_assignment -name AUTO_RESTART_CONFIGURATION OFF set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED" # MAIN CLOCK ======================================== set_location_assignment PIN_AF15 -to clk # MAIN RESET BUTTON ================================= set_location_assignment PIN_AA15 -to rst_n # USER LEDS ========================================= set_location_assignment PIN_AD26 -to ledg[0] set_location_assignment PIN_AD25 -to ledg[1] set_location_assignment PIN_AC25 -to ledg[2] set_location_assignment PIN_AC24 -to ledg[3] set_location_assignment PIN_AB24 -to ledg[4] set_location_assignment PIN_AB23 -to ledg[5] set_location_assignment PIN_AB26 -to ledg[6] set_location_assignment PIN_AB25 -to ledg[7] # USER KEYS ========================================= set_location_assignment PIN_W24 -to user_pb[0] set_location_assignment PIN_W23 -to user_pb[1] set_location_assignment PIN_Y24 -to user_pb[2] set_location_assignment PIN_Y23 -to user_pb[3] 14
Inserção de Atributos de Síntese no Código HDL Outra forma de associar os terminais do top-level de um modelo à pinos do FPGA é fazê-lo diretamente em SV. Neste caso deve-se inserir o atributo 'chip_pin' entre comentários especiais, (* *), na mesma linha da declaração da porta a ser associada. Exemplo: module clock_div( (* chip_pin = "AF15" *) input logic clk, (* chip_pin = "AA15" *) input logic rst, (* chip_pin = "AB25,AB26,AB23,AB24,AC24,AC25,AD25,AD26" *) output logic [7:0]ledg, (* chip_pin = "Y23,Y24,W23,W24" *) input [3:0] user_pb); // código de implementação do módulo... endmodule Associação dos Pinos Diretamente em SystemVerilog 15
Bibliografia Quartus II Handbook Version 12.1 Volume 2: Design Implementation and Optimization, Altera Corp., 2012. Karim, M.A., Chen, X., Projeto Digital: Conceitos e Princípios Básicos, LTC, 2009. 16