> Wie macht man sowas den richtig?
Der Ansatz passt schon:
1. Schritt: asynchrones Übernehmen der Daten (und der Adresse) in ein
lokales Pufferregister mit der steigenden Flanke von WR
2. Schritt: Einsynchronisieren von WR und eine synchrone
Flankenerkennung der steigenden Flanke, dabei die Daten synchron aus dem
lokalen Pufferregister übernehmen
> Aber dann hab ich zwei asynchrone Takte im System
> was die Sache auch nicht wirklich vereinfacht.
Das ist hier nicht schlimm, denn mit der WR-Signal kann sauber die
Datenübergabe geregelt werden.
So wie du es machst:
1 | if CS = '0' and WR = '0' then
|
2 |
|
3 | if ADR = "10000" then -- write to 16 (spi output)
|
4 | spi_reg_out <= DATA;
|
5 | elsif ADR = "10010" then -- write to 18 (gpio output)
|
6 | gpio_out <= DATA;
|
7 | end if;
|
müssen die Adressen bereits bei der fallenden Flanke des WR-Signals
stabil sein, sonst könnten irgendwelche Daten an die falsche Adresse
geschrieben werden.