vhdl Q?

Z

ZeleC

Guest
im tentando fazer um gerador de pulsos a ser implementado em um CPLD
a idéia é fazer com que um pulso de saída de 280 nos derivados de um relógio de 25kHz
o pulso começa na borda de subida de trig
Eu escrevi este e funcionou como expecteted quando eu simulada em ModelSim
timer280us entidade é
Port (Clk25k: in std_logic;
Trig: in std_logic;
Saída: out std_logic);
timer280us final;

Behavioral arquitetura de timer280us é
contador de sinal: std_logic_vector (2 downto 0): = "000";
Timer_on sinal: std_logic: = '0 ';
output_temp sinal: std_logic: = '1 ';
começo
count: processo (Clk25k, Trig)
começo
Se trig = '1 'then
- Se Timer_On = '1 'then
counter <= "000";
Timer_on <= '1 ';
- End if;
elsif Clk25k'event e (Clk25k = '1 ') then
Se Timer_On = '1 'then
counter <= counter 1;
Output_temp <= '0 ';
Se contador = "110", então
Timer_On <= '0 ';
Output_temp <= '1 ';

END IF;
END IF;
END IF;
end process;

- Reset: processo (trig)
- begin
- Se rising_edge trig () então
- Contador <= "000";
- Timer_On <= '1 ';

- End if;
- O processo final;
output <= output_temp;end Behavioral;

mas o problema foi que, quando um pulso de disparo ocorreu e enquanto o trig = '1 'o contador não começar, o que eu quero fazer é começar imediatamente na borda de subida de trig
Então, como posso reescrever o meu código para fazer isso.

 
Acho que você pode fazer apenas uma mudança: "Se trig = 1" então "Se trog = 0"
você acha isso?

 
tente o seguinte:
timer280us entidade é
Port (Clk25k: in std_logic;
reset: in std_logic;
trig: in std_logic;
Saída: out std_logic);
timer280us final;

Behavioral arquitetura de timer280us é
contador de sinal: unsigned (2 downto 0);
delay_Trig sinal: std_logic;
output_temp sinal: std_logic;
começo
count: processo (Clk25k, reset)
começo
if reset = '1 'then
counter <= "000";
delay_trig <= '0 ';
Output_temp <= '1 ';
elsif Clk25k'event e (Clk25k = '1 ') then
delay_trig <= trig;
if ((trig = '1 ') e (delay_trig = '0')) ou ((counter> 0) e (contador <7)) então
counter <= counter 1;
Output_temp <= '0 ';
diferente
counter <= "000";
Output_temp <= '1 ';
END IF;
END IF;
end process;
output <= output_temp;
end Behavioral;<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />
 
thx a lot remy
e eu mudei o código um pouco a remoção de reset
O resultado foi como eu queria, mas por favor leia o meu q?no final
meu código
Timer280us entidade é
Port (Clk25k: in std_logic;
Trig: in std_logic: = '0 ';
- Reset: in std_logic;
Saída: out std_logic: = '1 ');
Timer280us final;Behavioral arquitetura de timer280us é
contador de sinal: unsigned (2 downto 0);
delay_Trig sinal: std_logic;
output_temp sinal: std_logic;
começo
count: processo (Clk25k)
começo
- Se reset = '1 'then
- Contador <= "000";
- Delay_trig <= '0 ';
- Output_temp <= '1 ';
Se Clk25k'event e (Clk25k = '1 ') then
delay_trig <= trig;
if ((trig = '1 ') e (delay_trig = '0')) ou ((counter> 0) e (contador <7)) então
counter <= counter 1;
Output_temp <= '0 ';
diferente
counter <= "000";
Output_temp <= '1 ';
END IF;
END IF;
end process;
output <= output_temp;

end Behavioral;Mas há uma pergunta que eu quero perguntar-lhe, na verdade eu sou apenas um iniciante VHDL e estou tentando aprender por mim mesma
Eu estava tentando entender o código ur especialmente a linha dois
delay_trig <= trig;
if ((trig = '1 ') e (delay_trig = '0')) ou ((counter> 0) e (contador <7)) então

Como esta condição se reunirá "(trig = '1 ') e (delay_trig = '0')" se sempre antes, delay_trig obtém o valor da trigonometria, por isso, se é trig 1 delay_trig é 1
e se 0 trig dlay é zero.Eu só quero saber se algo im mal-entendido.thx u novamente r_e_m_y

 
Oi,

Nunca se esqueça de que você está descrevendo registrar flip flop e combinações de porta lógica quando você escreve vhdl synthesisable.

Quando eu escrevo delay_trig <= trig, o que significa que eu quero a minha entrada D do flip-flop para ser ligado ao sinal de trig.
em vista RTL, você terá:
delay_trig.D <= trig
quando eu escrever se delay_trig = '0 'e trig = '1', isso significa que eu quero ter o resultado de uma porta AND com a saída Q do flip_flop eo sinal de trig.
em vista RTL, você terá:
Se delay_trig.Q = '0 'e trig = '1'

Assim, delay_trig, como é dito em seu nome, é o sinal de trig adiada por 1 ciclo de relógio.na borda de subida de trig, trig delay_trig = 1, mas ainda não está em '1 '.
Faça uma simulação pós-layout deste código para entender isso.

E, pelo caminho, você deve manter um sinal de reset para o seu projeto ...

 
Obrigado r_e_m_y um lote para a sua ajuda, talvez o problema não é im pensando RTL
Você tem um link ou ebook que me dá um melhor entendimento de como funciona synthesisable vhdl?
u thk novamente

 
Eu encontrei uma coisa que está errado
Se o pulso é menor que Clk25k ciclo não iria funcionar assim eu adicionei isso e funcionou

Timer280us entidade é
Port (Clk_40us: in std_logic;
Width_Trig: in std_logic: = '0 ';
reset: in std_logic;
Pulse_End: out std_logic;
Pulse280us: out std_logic: = '1 ');
Timer280us final;
Behavioral arquitetura de timer280us é
contador de sinal: unsigned (2 downto 0);
delay_Trig sinal: std_logic;
sinal Pulse_End_Temp: std_logic;
temp sinal: std_logic: = '0 ';
output_temp sinal: std_logic: = '1 ';
começo
processo (Clk_40us, reset)
começo
if reset = '0 'then
counter <= "000";
delay_trig <= '0 ';
Output_temp <= '1 ';
temp <= '0 ';
elsif Width_Trig = '1 'then
temp <= '1 ';
elsif Clk_40us'event e (Clk_40us = '1 ') then
delay_trig <= Width_Trig;
if ((Width_Trig = '1 ') e (delay_trig = '0')) ou ((counter> 0) e (contador <7)) ou ((temp = '1 ') e (counter = "000")) então
counter <= counter 1;
Output_temp <= '0 ';
Pulse_End_Temp <= '0 ';
diferente
counter <= "000";
Output_temp <= '1 ';
Pulse_End_Temp <= '1 ';
temp <= '0 ';
END IF;
END IF;
end process;
Pulse280us <= output_temp;
Pulse_End <= Pulse_End_Temp;
end Behavioral;

 
Oi tudo,

Estou tentando fazer um gerador de pulsos a ser implementado em um CPLD
a idéia é fazer com que um pulso de saída derivado de um relógio de 80MHz.

A freqüência de saída é obtida pelos dados de 16 bits e um relógio.
por exemplo, 0000000000000001 indica 12.5ns saída de freqüência
0000000000000010 indica 25ns freqüência de saída.

A largura de pulso de saída é obtida pelos dados de 10 bits
por exemplo, 0000000001 indica 12.5ns largura de pulso
0000000010 indica 25ns largura de pulso

e não haverá entrada de 6 bits, através do qual pode selecionar 8 portas de saída.
quando selecionar outro sinal, o sinal anterior devem conservar os dados.pulse_gen entidade é
port (clk: in std_logic;
freq_data: in std_logic_vector (15 downto 0);
pulse_width_data: in std_logic_vector (9 downto 0);
wave_sel: in std_logic_vector (5 downto 0);
out_wave: out std_logic_vector (7 downto 0));
entidade final;

 

Welcome to EDABoard.com

Sponsor

Back
Top