Bit setzen ohne Takt

Gast #546686
Lesenswert?

Hallo,

ich habe ein Schaltung mit einem CoolrunnerII-CPLD XC2C64A, ein Paar 
Tastern und einer LED und möchte, dass die LED beim Betätigen der einen 
oder anderen Taste leuchtet und nach einem Reset-Signal wieder ausgeht. 
Leider habe ich keinen Takt in der Schaltung und ungefähr so versuche 
ich es zu machen:
1
LED_O: out std_logic;
2
SW1: in std_logic;
3
SW2: in std_logic;
4
...
5
signal LED_REG: std_logic;
6
signal SW_EVENT: std_logic;
7
...
8
SW_EVENT <= SW1 or SW2;
9
LED_O <= LED_REG;
10
process(RST, SW_EVENT, LED_REG)
11
begin
12
  if RST = '1' then
13
    LED_REG <= '0';
14
  elsif SW_EVENT = '1' then
15
    LED_REG <= '1';
16
  else
17
    LED_REG <= LED_REG;
18
  end if;
19
end process;
Nach der Synthese kommen zwei Warnungen, dass ein Latch entsteht und 
wahrscheinlich asynchroner Taktsignal verwendet wird.
Gibt es für so was vielleicht andere Möglichkeiten, ohne dass Latches 
entstehen? Es muss ja bloss ein Bit gesetzt werden, aber ohne Takt...

Gruß,
alex
Gast #546755
Lesenswert?

>Wieso taktest du nicht einfach auf die steigende Flanke von RST?

du meinst wahrscheinlich auf die steigende Flanke von SW_EVENT?
Nein, ich finde, es wäre noch schlimmer als ein Latch, weil SW_EVENT aus 
kombinatorischer Logik kommt (SW1 or SW2).
#546777
Lesenswert?

@ alex

>du meinst wahrscheinlich auf die steigende Flanke von SW_EVENT?
>Nein, ich finde, es wäre noch schlimmer als ein Latch, weil SW_EVENT aus
>kombinatorischer Logik kommt (SW1 or SW2).

Für solchen LED Spielkram kann man auch krude Logik konstruieren. So 
what.
Ein RS-Flip-Flop wäre sogar akademisch OK.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity RS_FF is
    Port ( sw1 : in std_logic;
           sw2 : in std_logic;
           rst : in std_logic;
           led : out std_logic);
end RS_FF;

architecture Behavioral of RS_FF is

signal led_int: std_logic;

begin

led <= led_int;

process(sw1, sw2, rst)
begin
  if rst='0' then
    led_int <= '0';
  elsif sw1='0' or sw2='0' then
    led_int <= '1';
  end if;
end process;

end Behavioral;

MfG
Falk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren