Lothar Miller schrieb:
> Das muß nicht alles in 1 Prozess, dann passiert es auch nicht, dass
> unnötige Signale in der Sensitivliste auftauchen (data)...
Hatte ich sogar anfangs versucht, wurde aber durch "multiple drivers"
Fehler frustriert.
> Die Richtungsumschaltung machst du besser concurrent:
>
1 | > signal din : STD_LOGIC_VECTOR (7 downto 0);
|
2 | > signal dout : STD_LOGIC_VECTOR (7 downto 0);
|
3 | > :
|
4 | > :
|
5 | > -- Schreiben
|
6 | > process (res,wr) begin
|
7 | > if (res = '0') then
|
8 | > p0reg <= (others => '0');
|
9 | > ddr0 <= (others => '0');
|
10 | > elsif rising_edge(wr) then --< ressourcenschonender
|
11 | > -- elsif (wr='0') then --< eigentlich richtiger
|
12 | > if(addr = '0') then
|
13 | > p0reg <= din;
|
14 | > else
|
15 | > ddr0 <= din;
|
16 | > end if;
|
17 | > end if;
|
18 | > end process;
|
19 | >
|
20 | > -- Daten fürs Lesen bereitstellen
|
21 | > dout <= p0 when addr = '0' else
|
22 | > ddr0;
|
23 | >
|
24 | > -- Busverwaltung
|
25 | > din <= data;
|
26 | > data <= (others => 'Z') when rd='1' or cs='1' else
|
27 | > dout;
|
28 | >
|
Ah, super. Das ist natuerlich deutlich eleganter :)
>> Erstes Projekt sollte ein 8-bit I/O Port mit Datenrichtungsregister
>> (Port laesst sich bitweise auf Eingang oder Ausgang umschalten) und
>> Intel-Bus (z.B. fuer 8051) sein.
> Diese Busse sind eigentlich nicht getaktet (auch nicht auf rd bzw. wr).
> Sondern da wird bei low-aktivem Signal gelatcht.
Ich hatte als erstes eine Level-getriggerte Version versucht, aber die
ganzen Warnungen bzgl. "Latch found" haben mich dann auf die obige
Version gefuehrt.
> Der richtige Zeitpunkt zur Datenübernahme ist also die steigende
> Flanke des wr-Signals...
Das hatte ich aber anders gelesen:
"If the 8051 is writing data, it appears on the bus following the
address information, and the active-low write signal, WR_, indicates
that the data is available. The falling edge of WR_ is typically used to
capture the data from the bus."
http://www.design-reuse.com/articles/8692/fpga-design-from-the-outside-in.html
Fuer RD ist die kombinatorische Variante natuerlich viel eleganter.
>> Das ganze ist uebrigens fuer ein CPLD gedacht (XC9500).
> Das hätte ganz an den Anfang der Frage hingehört. Es ist nämlich ein
> eklatanter Unterschied, ob du ein synchrones Design auf einem FPGA hast,
> oder irgendwelche Tricksereien auf einem CPLD... :-/
Wieso dieses? Koennte man obigen Code so nicht in ein FPGA packen?
Danke uebrigens fuer den Code und die Erklaerungen!
Lattice User schrieb:
> Fertig hinschreiben hätte meine Ansicht nach nicht sein müssen, was
> lernt er jetzt noch?
Ich glaube fuer einen Anfaenger ist es schon extrem hilfreich, wenn man
einen kompletten lauffaehigen Code hat, an dem man sich orientieren
kann. Ausserdem ist das ja nur ein Hello World. Als naechstes kommt eine
DMA Engine fuer einen 6502 :D