Forum: FPGA, VHDL & Co. SDRAM mit Videobuffer für VGA Ausgabe


von GS (chromosoma)


Angehängte Dateien:

Lesenswert?

Abend.
Ich will ein Bild auslesen, im SDRAM speichern und schließlich  auf VGA 
Bildschirm anzeigen.
Da der direkte Lesevorgang aus SDRAM unmöglich ist,  verwende ich  VRAM:
2x RAM (je 751 byte).

Das Ding läuft folgendermaßen ab:
Sobald  ein mild fertig ist (IMGRDY=1) wird das gespeicherte Bild  Zeile 
für Zeile ausgegeben.
Während der Buffer1 gelesen wird, wird in den Buffer2 geschrieben und 
vice versa.

Gelesen wird  mit 49.5 MHZ (PLL_CLOCK für VGA), geschrieben mit 200MHZ 
(SDRAm CLOCK).
Leider alles was ich auf dem Bild sehe ist folgendes Bild. Das Bild 
bleibt konstant, un zittert nur ein wenig.
Ich bekomme das Gefühl, dass die Videodaten nicht aus dem SDRAM kommen, 
irgendwie.

Anbei mein Code, zT Gekürzt, weil einige stellen  hier uninteressant 
sind.
Ich wäre wirklich dankbar, wenn jemand mir  sagt, was ich falsch mache, 
danke:)
PS


AV_RDVALID und AV_WRQ kommt von SDRAM controller(Avalon memory mapped 
slave):
AV_RDVALID: readdatavalid
AV_WRQ:waitrequest
1
component single_port_ram is
2
   port 
3
  (
4
    clk    : in std_logic;
5
    addr  : in natural range 0 to 751;
6
    data  : in std_logic_vector(7 downto 0);
7
    we    : in std_logic := '1';
8
    q    : out std_logic_vector(7 downto 0)
9
  );
10
 end component single_port_ram;
11
vram1: component single_port_ram
12
        port map (
13
       clk  =>VRAM_CLK1,
14
       addr  =>VRAM_ADDR1,
15
       data  =>VRAM_IN1,
16
       we    =>VRAM_WE1,
17
       q    =>VRAM_OUT1
18
      );
19
vram2: component single_port_ram
20
        port map (
21
       clk  =>VRAM_CLK2,
22
       addr  =>VRAM_ADDR2,
23
       data  =>VRAM_IN2,
24
       we    =>VRAM_WE2,
25
       q    =>VRAM_OUT2
26
      );    
27
28
29
VRAM_CLK1<=SDRAM_CLK WHEN VB='0' ELSE PLL_CLK;
30
VRAM_CLK2<=SDRAM_CLK WHEN VB='1' ELSE PLL_CLK;
31
PROCESS  (SDRAM_CLK)
32
BEGIN  
33
IF rising_edge(SDRAM_CLK) THEN
34
35
-----------------------wirte to SDRAM-------------------
36
IF (IMGRDY='0')THEN
37
         IF(to_integer(unsigned(SDRAM_ADDR))>437082)THEN----img done
38
          IMGRDY<='1';
39
          VRAM_ADDR1<=0;
40
          VRAM_ADDR2<=0;
41
          VB<='0';
42
          VB_DONE1<='1';
43
          VB_DONE2<='0';
44
          SDRAM_ADDR<=(OTHERS=>'0');
45
      END IF;
46
    
47
      AV_RD_N<='1';
48
      AV_WR_N<='0';
49
   .................
50
51
END IF;
52
---------------read from SDRAM-----------------------------
53
IF(IMGRDY='1')THEN
54
55
56
    AV_RD_N<='0';
57
    AV_WR_N<='1';
58
      -------------fill video buffer
59
      IF(VB='0')THEN----------fill 1st buffer
60
        VRAM_ADDR2<=VGA_ADDR;
61
62
         IF(VB_DONE1='0'AND VGA_ADDR=0)THEN -----if buffer 1 is full and new line begins
63
        VB<='1';
64
        END IF;
65
       
66
        VRAM_WE1<='1';
67
        VRAM_WE2<='0';
68
        VB_DONE2<='1';
69
       IF(AV_RDVALID='1' and AV_WRQ='0')THEN
70
           VRAM_IN1<=AV_RDDATA(7 downto 0);
71
          IF(VRAM_ADDR1<751 AND VB_DONE1='1')THEN----- fill buffer1
72
          VRAM_ADDR1<=VRAM_ADDR1+1;
73
           SDRAM_ADDR<=STD_LOGIC_VECTOR(unsigned(SDRAM_ADDR)+1);
74
          ELSE
75
          VB_DONE1<='0';
76
          VRAM_ADDR1<=0;
77
           END IF;
78
        END IF;
79
      END IF;
80
      
81
      IF(VB='1')THEN--------fill 2nd video buffer
82
         VRAM_ADDR1<=VGA_ADDR;
83
84
         IF(VB_DONE2='0' AND VGA_ADDR=0)THEN
85
        VB<='0';
86
        
87
        END IF;
88
    
89
         VRAM_WE1<='0';
90
        VRAM_WE2<='1';
91
        VB_DONE1<='1';
92
       IF(AV_RDVALID='1' and AV_WRQ='0')THEN
93
        VRAM_IN2<=AV_RDDATA(7 downto 0);
94
          IF(VRAM_ADDR2<751 AND VB_DONE2='1')THEN-----fill buffer 2
95
          VRAM_ADDR2<=VRAM_ADDR2+1;
96
           SDRAM_ADDR<=STD_LOGIC_VECTOR(unsigned(SDRAM_ADDR)+1);
97
          ELSE
98
          VB_DONE2<='0';
99
          VRAM_ADDR2<=0;
100
           END IF;
101
        END IF;
102
        END IF;
103
      
104
      
105
        IF (IMGDONE='1') THEN-----record new image
106
        SDRAM_ADDR<=(OTHERS=>'0');
107
        IMGRDY<='0';
108
      END IF;
109
110
END IF;
111
END IF;
112
  
113
  
114
END PROCESS;
115
PROCESS (PLL_CLK) ---------------VGA OUTPUT
116
BEGIN
117
IF rising_edge(PLL_CLK) THEN
118
   
119
     IF(IMGRDY='0' AND IMGDONE='1')THEN
120
    
121
    IMGDONE<='0';
122
    
123
    END IF;
124
  IF(XPOS<1055)THEN
125
  XPOS<=XPOS+1;
126
  ELSIF(XPOS=1055)THEN
127
    
128
  VGA_ADDR  <=0;
129
  XPOS<=0;
130
  YPOS<=YPOS+1;
131
  END IF;
132
  IF(YPOS=624)THEN
133
  YPOS<=0;
134
  END IF;
135
   IF(XPOS>815 AND XPOS<895)THEN
136
  VGA_HS<='0';
137
  ELSE
138
  VGA_HS<='1';
139
  END IF;
140
  IF(YPOS>601 AND YPOS<605)THEN
141
  VGA_VS<='0';
142
     IF(IMGRDY='1' )THEN----check prior new  frame, if img is available
143
      READIMG<='1';
144
     END IF;
145
  ELSE
146
  VGA_VS<='1';
147
  END IF;
148
  
149
  IF(XPOS>800 OR YPOS>600)THEN
150
151
  VGA_B<=(others=>'0');
152
  VGA_G<=(others=>'0');
153
  VGA_R<=(others=>'0'); 
154
  END IF;
155
  
156
  IF(XPOS<752 AND YPOS<582)THEN-----visible img
157
     
158
    IF (READIMG='1')THEN
159
        CASE VB IS
160
        WHEN '0'=>
161
             VID_DATA<=VRAM_OUT2;
162
        WHEN '1' =>
163
            VID_DATA<=VRAM_OUT1;
164
        WHEN OTHERS=>NULL;
165
        END CASE;
166
      
167
      
168
        IF(VGA_ADDR<751)THEN
169
        VGA_ADDR<=VGA_ADDR+1;
170
        END IF;
171
        
172
        VGA_B<=VID_DATA;
173
        VGA_G<=VID_DATA;
174
        VGA_R<=VID_DATA; 
175
      
176
     ELSE
177
        VGA_B<=(others=>'0');
178
        VGA_G<=(others=>'0');
179
        VGA_R<=(others=>'0'); 
180
181
     END IF;
182
  ELSE               
183
           
184
        VGA_B<=(others=>'0');
185
        VGA_G<=(others=>'0');
186
        VGA_R<=(others=>'0'); 
187
   END IF;
188
  IF(YPOS=582  AND IMGRDY='1' AND READIMG='1')THEN
189
  IMGDONE<='1';
190
   READIMG<='0';
191
  
192
  END IF;
193
END IF;
194
END PROCESS;
195
END MAIN;

: Bearbeitet durch User
von Alejandro P. (alejandro_p79)


Lesenswert?

Ich habe das schon versucht, so was änhliches. Und gefunden verschiedene 
Probleme:

I wusste nicht ob die SDRAM richtig geschrieben und gelesen wurde... !
Wo war das Problem ? Lesen oder Schreiben ?
(Ich habe mein iegenes SDRAM controller geschrieben....)

Kannst du ein festes Bild von den Puffern darstellen ? (Ohne 
SDRAM->Puffer) ?
Geht es ?...
Lesen und schreiben von SDRAM funktioniert, oder ?

Ich sehe daß du wartest bis SDRAM->Puffer fertig ist... ich wurde nicht 
warten, Gerade Linien direct von Puffer 0 (gefüllt eine Linie vorher) 
und Ungerade von Puffer 1.

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.