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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.