Hallo zusammen,
ich möchte gerne einen SJA1000 softcore auslesen. Dazu schalte ich nach
einem "ALE" das "RD" Signal auf high, um ein automatisches Auslesen
anzustossen. Leider funktioniert das Auslesen nicht, wenn ich "RD" nur
für einen Takt auf high setze. Siehe Variante (A).
Variante (A) mit SJA1000_rd für 1 clk auf high gesetzt:
1 | always @(posedge clk)
|
2 | begin : SJA1000_autoread_proc
|
3 | integer rd_ctr = 0 ; // Just a sample counter for rd signal
|
4 | begin
|
5 |
|
6 | SJA1000_rd = 0;
|
7 | if (SJA1000_ale == 1)
|
8 | begin
|
9 | rd_ctr = 0 ;
|
10 | end
|
11 | if (rd_ctr < 1) // SJA1000_rd high for ONE clk cycle
|
12 | begin
|
13 | SJA1000_rd = 1;
|
14 | rd_ctr = rd_ctr + 1;
|
15 | end
|
16 | end
|
17 | end
|
Wenn ich "RD" dagegen für zwei Takte auf high setze, klappt alles
wunderbar. Das Kuriose ist jedoch: Es kommen bereits schon beim ersten
Takt gültige Werte auf dem Port! Siehe Variante (B).
Variante mit SJA1000_rd für 2 clk gesetzt:
1 | always @(posedge clk)
|
2 | begin : SJA1000_autoread_proc
|
3 | integer rd_ctr = 0 ; // Just a sample counter for rd signal
|
4 | begin
|
5 |
|
6 | SJA1000_rd = 0;
|
7 | if (SJA1000_ale == 1)
|
8 | begin
|
9 | rd_ctr = 0 ;
|
10 | end
|
11 | if (rd_ctr < 2) // SJA1000_rd high for TWO clk cycles
|
12 | begin
|
13 | SJA1000_rd = 1;
|
14 | rd_ctr = rd_ctr + 1;
|
15 | end
|
16 | end
|
17 | end
|
(Die Simulationsergebnisse findet ihr jeweils im Anhang.)
Warum ist das so? Zum Zeitpunkt des ersten Taktes mit "RD" auf high
müssten doch beide Simulationsergebnisse gleich sein! Der Simulator kann
doch noch gar nicht wissen, ob "RD" auch den zweiten Takt auf high
bleibt?!
Kann mir das jemand von Euch erklären?