VHDL, Xilinx ISE und Coolrunner II

02/10/2007 - 16:02 von Mathias Weierganz | Report spam
Ich habe jetzt mehr als eine Woche mit folgendem Problem verbracht:
Ein größeres VHDL-Design für einen Coolrunner CPLD XC2C64 tat nicht
was es sollte, bis ich darauf gekommen bin, dass der folgende VHDL-Code
nicht zum beabsichtigten Ergebnis führte:


entity rs_ff_test is
Port ( width_in, delay_in : in std_logic;
pulse_out : out std_logic;
pulse_inv : out std_logic
);
end rs_ff_test;

architecture Behavioral of rs_ff_test is
signal pulse : std_logic;

begin

pulse_out <= pulse;
pulse_inv <= not pulse;


process (delay_in, width_in)
begin
if (width_in = '1') then
pulse <= '0';
elsif (delay_in = '1') then
pulse <= '1';
end if;
end process;

end Behavioral;

Es soll also ein Flip-Flop realisiert werden, dass durch das Signal
delay_in gesetzt und durch width_in rückgesetzt wird, wobei width_in
Prioritàt hat.

Das CPLD hat nach dem Programmieren folgendes Verhalten:

width_in delay_in pulse_out pulse_inv

0 0 last_state /last_state
0 1 1 0
1 0 0 1
1 1 0 0 !!!
Das ist ja fast das Verhalten des seligen 74LS74, wenn Set und Reset
zugleich aktiv sind.

Kennt jemand dieses Problem, das mit der Xilinx ISE 4.2WP3x und 8.2.01i
reproduzierbar auftritt. Modelsim zeigt mir der Postfit-Simulation
diesen Fehler nicht.
Das Problem hat meiner Begeisterung für VHDL und programmierbare Logik
erstmal einen ordentlichen Dàmpfer versetzt.


Mathias
 

Lesen sie die antworten

#1 Frank Buss
02/10/2007 - 16:28 | Warnen spam
Mathias Weierganz wrote:

process (delay_in, width_in)
begin
if (width_in = '1') then
pulse <= '0';
elsif (delay_in = '1') then
pulse <= '1';
end if;
end process;



Das ist kein Flip-Flop und ISE sollte dir einiges an Warnungen um die Ohren
hauen. pulse wird hier auf 0 gesetzt, solange an width_in 1 anliegt. Liegt
dort 0 an, dann wird es auf 1 gesetzt, solange an delay_in 1 anliegt.

width_in delay_in pulse_out pulse_inv

0 0 last_state /last_state
0 1 1 0
1 0 0 1
1 1 0 0 !!!



Somit entspricht dieses Verhalten deiner Programmierung. Letzte Zeile: an
width_in liegt 1 an, also wird pulse auf 0 gesetzt und somit auch
pulse_out.

Vielleicht hilft dir die Funktion rising_edge bzw. falling_edge weiter.

Frank Buss,
http://www.frank-buss.de, http://www.it4-systems.de

Ähnliche fragen