mikrocontroller.net

Forum: FPGA, VHDL & Co. SRAM SPI Tristate Problem


Autor: Alex F. (alex86)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich hab folgendes Problem und bin fast wieder am verzweifeln:
Ich entwickle ein VHDL-Code zur Ansteuerung vier SRAMs inkl. SPI 
Interface.
Dafür verwende ich zwei getaktete Processe. Alles klappt soweit ganz 
gut.
Programmablauf ist folgender:
1. Schreibe SRAM Daten(jeweils immer 16Bit) in SRAMs
2. Lese ein 16 Bit- Packet
3. Freigabe an AVR
4. mittels SPI Takt vom AVR(Master) wird dann das 16Bit- Paket über SPI 
zum AVR übergeben
5. Lese ein weiteres 16 Bit-Packet
6.......
Ziel soll ein LA sein.

Problem:
Beim SPI Process ist der unsigned_sram_data Port nicht hochohmig(also 
ein Eingang) sondern als Ausgang definiert, obwohl vorher sram_data <= 
(others => 'Z') im Process 1 gesetzt wurde;

Werden hier die Pins zu Ausgängen?
sig_AVR_MOSI   <= unsigned_sram_data(to_integer(sig_counter)); -- 16 Bit werden übertragen zum AVR
Wie könnte ich es besser machen?
Leider weiss ich nicht mehr weiter.
Ich verwende ein GPLD von Xilinx XC9572.
Wäre sehr froh, wenn Ihr mir helfen könntet.
Gruss
Alex

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Alex F. (alex86)

>Beim SPI Process ist der unsigned_sram_data Port nicht hochohmig(also
>ein Eingang) sondern als Ausgang definiert, obwohl vorher sram_data <=
>(others => 'Z') im Process 1 gesetzt wurde;

Interne Signale verwenden kein Tristate. Auch verwendet man intern 
zwischen Modulen oder Prozesssen nur unidirektionale Signale.

>sig_AVR_MOSI   <= unsigned_sram_data(to_integer(sig_counter)); -- 16 Bit

Naja, kann man so machen, aber ein Schieberegister ist einfacher und im 
Extremfall schneller.

>Ich verwende ein GPLD von Xilinx XC9572.

CPLD

>elsif rising_edge(spi_clk)and HS_AVR = '0' and sig_HS_CPLD = '1' then

Solche Sachen sollte der Compiler nicht durchgehen lassen. rising_edge() 
muss immer allein in einer IF Abfrage sein.

Die Formatierung deines Quelltextes ist grausam. UNd wenn den den beim 
nächsten Mal mit der Endung .vhd anhängst, wir er sogar schön mit 
Syntaxhighlighting dargestellt.

Mfg
Falk

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hast du einen Effekt wie in Beitrag "integer zu logic_vector und zurück"

Bei den Libs solltest dich für die Good Old School
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
oder die modernere Variante
use IEEE.NUMERIC_STD.ALL;  
entscheiden.

SPI basiert auf Schieberegistern. Warum machst du dann nicht einfach den 
MOSI (müsste eigenlich richtig MISO heissen, der Master ist der AVR) zum 
ersten Bit eines Schieberegisters? Ok, ok, ich sehe ein, dass auf dem 
CPLD FFs ein wenig rar sind, aber dafür gibts ja FPGAs (z.B. die 
schnuckeligen kleinen MachXO von Lattice)...


Pass aber gut auf, dass deine 2 Taktdomänen gegeneinander verriegelt 
(oder synchronisiert) sind:
> ... rising_edge(clk) ...
> ... rising_edge(spi_clk) ...

@ Falk
>>elsif rising_edge(spi_clk)and HS_AVR = '0' and sig_HS_CPLD = '1' then
>Solche Sachen sollte der Compiler nicht durchgehen lassen
Tut er aber.
Ich konnte es auch nicht glauben, habe es dann aber ausprobiert.

Siehe da, es geht:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.ALL;

entity EdgeUndLogik is
    Port ( clk : in  STD_LOGIC;
           inp : in  STD_LOGIC_VECTOR (7 downto 0);
           outA : out  STD_LOGIC_VECTOR (7 downto 0);
           outB : out  STD_LOGIC_VECTOR (7 downto 0);
           selA : in  STD_LOGIC;
           selB : in  STD_LOGIC);
end EdgeUndLogik;

architecture Behavioral of EdgeUndLogik is

begin
   process (clk, selA)
   begin
      if rising_edge(clk) and (selA='1') then
         outA <= inp;
      end if;
   end process;

   process (clk)
   begin
      if rising_edge(clk) then
         if (selB='1') then
            outB <= inp;
         end if;
      end if;
   end process;
end Behavioral;

Beides mal wird das selbe generiert: Einfach nur ein Clock-Enable.
RTL-Schematic siehe Anhang.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.