inout Signal und die Simulation

Gast #548846
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;

  
Gast #548958
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?
Gast #549477
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren