Forum: FPGA, VHDL & Co. inout Signal und die Simulation


von noname (Gast)


Lesenswert?

Ich probiere 2 Bytes parallel einzulesen (auf Clock getaktet), wenn die 
Werte der beiden dem entsprechen, was ich erwarte, möchte ich auf die 
gleiche Leitung ein Byte ausgeben, welches beim nächsten Clock vom µC 
eingelesen werden soll. Die Simulation geht aber bis zu dem Punkt, wo 
ich die 2 Bytes eingelesen habe und wo das Byte ausgegeben werden soll, 
ist alles vorbei. Mach ich was falsch mit dem "inout"? Zum Anfang 
initialisiere ich die Leitung als T-State:
DATA : inout STD_LOGIC_VECTOR(7 downto 0);
...
ext_rw_data: process(CLK, CLEAR)
...
begin
DATA  <=(others =>'Z');

.............
1
if (RW='0') then
2
byte_count := byte_count + 1;
3
4
if byte_count   = 1 then
5
  var_start   := DATA;
6
end if;
7
          
8
 if var_start = X"AA" then 
9
  if byte_count = 2 AND DATA < 16 then
10
      var_addr   := DATA;
11
      TEMP_ADDR  :=  conv_integer(var_addr);
12
    else
13
    byte_count  := 0;
14
    end if;
15
                            
16
  if byte_count   = 3 then
17
    var_data := MEM(TEMP_ADDR);
18
    DATA   <= var_data;  
19
20
    byte_count :=  0;  
21
  end if;  
22
              
23
  else 
24
    byte_count :=  0;
25
 end if;            
26
end if;

  

von Johnsn (Gast)


Lesenswert?

Was meinst du mit "ist alles vorbei"? Gibt es Fehlermeldungen im 
Simulator, wird das Byte einfach nicht auf den Bus gelegt, stürzt dein 
PC ab oder naht das Ende der Welt?

von noname (Gast)


Lesenswert?

Die Simulation ist dann vorbei.
Da wo das Byte ausgegeben werden muss, hören die Signale in Modelsim 
auf.

von noname (Gast)


Angehängte Dateien:

Lesenswert?

Da wo ich die Stelle rot markiert habe, sollte in der Simulation das 
Byte ausgegeben werden, da hört die Simu. aber auf.

von Johnsn (Gast)


Lesenswert?

Auf deinem Screenshot sehe ich aber noch, dass die Simulation 
weiterläuft.

µController-seitig hast du den Bus auch auf HIGH-Z gesetzt? Ich würde 
dir vorschlagen den Tristate-Bus folgendermaßen zu beschreiben:
1
signal WriteEnable : std_ulogic;
2
signal WriteData   : std_logic_vector(7 downto 0);
3
signal ReadData    : std_logic_vector(7 downto 0);

als Concurrent Statement:
1
DATA     <= WriteData when WriteEnable = '1' else (others => 'Z');
2
ReadData <= DATA;

Danach nur mehr mit Write/ReadData und WriteEnable arbeiten, so hast du 
eine saubere Beschreibung des Tri-States.

Gibt der Simulator Meldungen aus?

von noname (Gast)


Lesenswert?

Das Problem besteht hauptsächlich darin, dass ich in einem 
"Write-Zustand" zuerst aber 2 Bytes einlesen muss und erst auf die 
Leitung beim 3ten Byte schreibe und danach diese Leitung wieder als "in" 
haben muss.

Clk'event -> Byte_1 (DATA ist in)
Clk'event -> Byte_2 (DATA ist in)
Clk'event -> Byte_3 (DATA ist out)
. jetzt muss DATA wieder als "in" fundieren...
Clk'event -> Byte_1 (DATA ist in)
Clk'event -> Byte_2 (DATA ist in)
Clk'event -> Byte_3 (DATA ist out)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.