UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ DEPARTAMENTO ACADÊMICO DE ELETROTÉCNICA CURSO DE ENGENHARIA INDUSTRIAL ELÉTRICA MESTRADO EM SISTEMAS DE ENERGIA Lógica Reconfigurável - amauriassef@utfpr.edu.br paginapessoal.utfpr.edu.br/amauriassef 1
Conversão de códigos VHDL em blocos no Quartus II: Tem a função de facilitar a visualização bem como a documentação do projeto Todos as funções são simbolizadas através de blocos em um ou mais arquivos bdf São utilizados arquivos HDL (Linguagem de Descrição de Hardware) e blocos do MegaWizard VHDL Verilog AHDL 2
Exemplo: Conversor DC/AC com alinhamento central 3
Código MATLAB (disponível no página pessoal): clc; clear all; close all; f = 60; % Frequência 60Hz T = 1/f; % Período N_ref = 32; % Número de amostras da senoide Normalizacao = 2^15-1; % Valor máximo de normalização n_ref = 0:1:N_ref-1; N_triangular = 16; % N. pontos da port. triangular Modulacao_amplitude = 0.9; % índice entre 0 (0%) a 1 (100%) N_pontos = N_ref * N_triangular;% Numero total de amostras 4
%Calculo dos vetores da senoide e onda dente de serra for j=1:n_ref for i=1:n_triangular senoide(i+(j-1)*n_triangular) = sin(2*pi*(j-1)/n_ref); if i < (N_triangular+4)/2 % subida vetor_contador(i+(j-1)*n_triangular) = (i-1); else % descida vetor_contador(i+(j-1)*n_triangular) = (N_triangular+1-i); end; vetor_contador(i+(j-1)*n_triangular) = vetor_contador(i+(j-1)*n_triangular)/(n_triangular/2); end; end; 5
% Ajusta o índice de modulação em amplitude, normaliza os valores e soma offset senoide_norm = (senoide * (Normalizacao/2)* Modulacao_amplitude) + (Normalizacao/2); vetor_cnt_norm = vetor_contador * Normalizacao; %Calculo da tabela com a senoide para incluir na projeto do Quartus II indice = 0; for i=1:n_triangular:(n_pontos-n_triangular+1) indice = indice + 1; tabela_senoide(indice)=senoide_norm(i); end; 6
% Comparação para geração dos sinais PWM for i=1:n_pontos if senoide_norm(i) > vetor_cnt_norm(i) sinal_pwm(i) = 1;sinal_pwm_negado(i) = 0; else sinal_pwm(i) = 0;sinal_pwm_negado(i) = 1; end; end; indice = 1:1:N_pontos; % índice para os gráficos 7
% Gráficos subplot(2,1,1); stairs(indice,vetor_cnt_norm,'r'); hold on; stairs(indice,senoide_norm,'linewidth',2'); title(['índice de modulação em Amplitude = ',num2str(modulacao_amplitude*100),'%']); axis tight;xlabel('índice de amostras');ylabel('amplitude Normalizada'); legend(['n Triangular=',num2str(N_triangular)],['Ref Nref=',num2str(N_ref)]); subplot(2,1,2); stairs(indice,sinal_pwm); xlabel('índice de amostras');ylabel('pwm'); axis ([0 N_pontos 0 1.15]); legend('sinal PWM'); 8
Passo-a-passo: Criar um projeto no Quartus II 9
Selecionar o arquivo [nome_do_aquivo].bdf principal Salvar o arquivo com o mesmo nome do projeto (aula6_blocos.bdf) 10
1) Criar um arquivo VHDL com o código da portadora triangular (portadora_triangular.vhd) LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.numeric_std.all ; ENTITY portadora_triangular IS -- ENTITY GENERIC (N: INTEGER := 15); PORT ( clk,rst: IN STD_LOGIC; q, q_norm: OUT STD_LOGIC_VECTOR (N-1 DOWNTO 0)); END portadora_triangular; ARCHITECTURE behavior OF portadora_triangular IS -- ARCHITECTURE SIGNAL q_temp: INTEGER RANGE 0 TO 2**N-1 :=0; SIGNAL sentido: STD_LOGIC :='0'; CONSTANT MODULO : INTEGER := 16/2; CONSTANT NORMALIZACAO : INTEGER := (2**N-1)/MODULO; 11
BEGIN PROCESS(clk,rst,q_temp,sentido) BEGIN IF (rst='1') THEN -- ASSÍNCRONO q_temp <= 0; sentido <= '0'; ELSIF (rising_edge(clk)) THEN IF sentido = '0' THEN -- contador crescente IF (q_temp = MODULO) THEN q_temp <= q_temp - 1; sentido <= '1'; ELSE q_temp <= q_temp + 1;sentido <= '0'; END IF; END IF; END PROCESS; ELSE END IF; -- contador decrescente IF (q_temp = 0) THEN q_temp <= q_temp + 1; sentido <= '0'; ELSE q_temp <= q_temp - 1; sentido <= '1'; END IF; 12
-- Conversao de INTEGER para SLV q_norm <= std_logic_vector( to_unsigned( q_temp * NORMALIZACAO, N )); q <= std_logic_vector( to_unsigned( q_temp, N )); END behavior; 13
Na janela Project Navigator, menu inferior Files, selecionar o arquivo VHD gerado (portadora_triangular.vhd) com o botão direito do mouse Selecionar a opção Create Symbol Files for Current File 2 1 3 Caso a compilação aponte algum erro, fazer a correção e repetir o procedimento 14
Caso o arquivo não apareça no diretório na área da tela: Pressionar a pasta Files com o botão direito do mouse para adicionar o arquivo Na tela Settings, procurar o arquivo através da caixa... 15
Selecionar o arquivo desejado e os botões Abrir e depois Add e OK na janela anterior (obs: verificar se o diretório está correto) 16
2) Criar um arquivo VHDL com o código para leitura do vetor com a senoide de referência (senoide_referencia.vhd) --------------------------- LIBRARY ieee; USE ieee.std_logic_1164.all; use ieee.numeric_std.all; --------------------------- ENTITY senoide_referencia IS GENERIC (N : INTEGER := 15; TAMANHO_VETOR: INTEGER := 32); PORT (clk,rst: IN STD_LOGIC; q: OUT STD_LOGIC_VECTOR (N-1 DOWNTO 0)); END senoide_referencia; --------------------------- 17
ARCHITECTURE behavior OF senoide_referencia IS SIGNAL endereco : INTEGER RANGE 0 TO 2**N-1; SIGNAL contador : INTEGER RANGE 0 TO 2**N-1; TYPE vetor IS ARRAY (0 TO TAMANHO_VETOR-1 ) of INTEGER RANGE 0 TO 2**N-1; CONSTANT N_TRIANGULAR : INTEGER := 16; CONSTANT N_REF : INTEGER := 32; -- valores copiados do Matlab para índice de modulação 0.9 CONSTANT senoide_ref: vetor := ( 16384, 19260, 22026, 24575, 26810, 28644, 30006, 30845,... 13507 ); 18
BEGIN PROCESS (rst,clk,contador,endereco) BEGIN IF (rst = '1') THEN endereco <= 0; contador <= 0; ELSIF (RISING_EDGE (clk)) THEN IF (contador < N_TRIANGULAR-1) THEN contador <= contador + 1; -- incrementa contador de referencia ELSE contador <= 0; IF (endereco < N_REF-1) THEN endereco <= endereco + 1; ELSE endereco <= 0; END IF; END IF; END IF; END PROCESS; q <= STD_LOGIC_VECTOR(to_unsigned(senoide_ref(endereco),N)); END behavior; ---------------------------------------------------------- 19
Dados da senoide de referência para índice de modulação 0,9 Tabela_senoide = [16384; 19260; 22026; 24575; 26810; 28644; 30006; 30845; 31129; 30845; 30006; 28644; 26810; 24575; 22026; 19260; 16384; 13507; 10741; 8192; 5957; 4123; 2761; 1922; 1638; 1922; 2761; 4123; 5957; 8192; 10741; 13507] 20
Repetir o processo para criar o bloco do novo código Caso a compilação aponte algum erro, fazer a correção e repetir o procedimento 21
3) Incluir os dois blocos e completar o desenho Dois cliques na área do desenho 22
23
4) Incluir um bloco comparador de 15 bits via MegaWizard 24
Obs: Na última tela de configuração, selecionar a caixa Quartus II symbol file 25
Completar o desenho com os pinos de saída PWM 26
Resultados de simulação 27
Matlab 28
Referências: Notas de aula do professor Volnei A. Pedroni PEDRONI, Volnei A. Circuit design and simulation with VHDL. MIT press, 2010. HAMBLEN, James O.; HALL, Tyson S.; FURMAN, Michael D. Rapid prototyping of digital systems: SOPC edition. Springer Science & Business Media, 2007. TOCCI, Ronald J.; WIDMER, Neal S.; MOSS, Gregory L. Sistemas digitais: princípios e aplicações. Prentice Hall, 2003. 29