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


von Alex F. (alex86)


Angehängte Dateien:

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?
1
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

von Falk B. (falk)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

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
1
use IEEE.STD_LOGIC_ARITH.ALL;
2
use IEEE.STD_LOGIC_UNSIGNED.ALL;
oder die modernere Variante
1
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:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.ALL;
4
5
entity EdgeUndLogik is
6
    Port ( clk : in  STD_LOGIC;
7
           inp : in  STD_LOGIC_VECTOR (7 downto 0);
8
           outA : out  STD_LOGIC_VECTOR (7 downto 0);
9
           outB : out  STD_LOGIC_VECTOR (7 downto 0);
10
           selA : in  STD_LOGIC;
11
           selB : in  STD_LOGIC);
12
end EdgeUndLogik;
13
14
architecture Behavioral of EdgeUndLogik is
15
16
begin
17
   process (clk, selA)
18
   begin
19
      if rising_edge(clk) and (selA='1') then
20
         outA <= inp;
21
      end if;
22
   end process;
23
24
   process (clk)
25
   begin
26
      if rising_edge(clk) then
27
         if (selB='1') then
28
            outB <= inp;
29
         end if;
30
      end if;
31
   end process;
32
end Behavioral;

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

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.