Ein komplett verwirrter Ansatz wäre sowas: asynchrones,
schnellstmögliches Setzen des Ausgangs, mit gleichzeitigem Laden eines
Zählers. Wenn der Eingang low wird, bleibt der Ausgang noch high, bis
der Zähler abgelaufen ist:
1 | signal counter : integer;
|
2 | :
|
3 | process
|
4 | if eingangssignal='1' then
|
5 | ausgangssignal <= '1';
|
6 | counter<=0;
|
7 | elsif rising_edge(clk) then
|
8 | if counter=3 then
|
9 | ausgangssignal<='0';
|
10 | else
|
11 | counter<=counter+1;
|
12 | end if;
|
13 | end if;
|
14 | end process;
|
ABER damit hat man einen asynchronen Eingang an der Backe, der auf
eine State-Machine (Zähler) geht. Und das kann böse ins Auge gehen:
http://www.lothar-miller.de/s9y/categories/34-Getakteter-Prozess
http://www.lothar-miller.de/s9y/archives/64-State-Machine-mit-asynchronem-Eingang.html
Deshalb meine Fragen nach der Synchronität des externen Signals...
Und auch der Vorschlag mit der OR ist nicht garantiert glitchfrei. Da
könnte mit einem einfachen OR sogar im ungünstigsten Fall ein kompletter
Takt lang das falsche Signal am Ausgang herauskommen. Wenn alle 4 Bits
verodert werden, dann dürfte das aber klappen:
1 | signal sr : std_logic_vector(3 downto 0);
|
2 | :
|
3 |
|
4 | sr <= sr(2 downto 0)&eingangssignal;
|
5 | ausgangssignal <= '0' when eingangssignal='0' and sr="0000" else '1'; -- kürzere Schreibweise mit AND
|