Forum: FPGA, VHDL & Co. Block RAM zu langsam?


von Jürgen D. (Firma: Student) (freacky2002)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

vielleicht könnt ihr mir bei meiner Verwirrung helfen. Ich haben einen 
LCD Interface auf einem Spartan 6 aufgesetzt, das super funktioniert. 
Ich wollte nun Graustufenwerte in einem Block RAM ablegen und dann 
synchron mit meinem Pixeltakt die Werte auslesen und anzeigen. 
Merkwürdigerweise wird jedoch nicht zu jedem Takt ausgeselen obwohl sich 
die Addresse für das RAM im Takt ändert. Ich habe euch mal meine 
Simulation als Bild angehängt. Hier ist das Signal clk_in der Takt der 
ins RAM geht, address ist die RAM-Addresse, dataout sind die Grauwerte 
die ich aus dem RAM lese, das Signal test habe ich zum debugin genommen 
es wechselt immer dann den Pegel wenn Daten aus dem RAM gelesen werden.

Anbei noch meine Code:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.std_logic_arith.all;
4
 
5
use IEEE.STD_LOGIC_UNSIGNED.ALL; 
6
7
library unisim;
8
use unisim.vcomponents.all;
9
10
entity sineWaveGen is
11
port ( address  :  in integer;
12
    clk_in   :  in  std_logic;
13
    we      :  in std_logic;
14
      dataout   :   out std_logic_vector (7 downto 0);
15
    datain   :   in integer
16
      );
17
end sineWaveGen;
18
19
architecture Behavioral of sineWaveGen is
20
type ram_t is array (0 to 1279) of integer range 0 to 255;
21
22
signal test : std_logic := '1';
23
24
--ROM for storing the sine values generated by MATLAB.
25
signal ram : ram_t :=(128, 129, 129, 130, 131, 131, 132, 132,
26
 133, 134, 134, 135, 136, 136, 137, 137, 138, 139, 139, 140, 141, 141,
27
 142, 142, 143, 144, 144, 145, 146, 146, 147, 147, 148, 149, 149, 150,
28
 151, 151, 152, 152, 153, 154, 154, 155, 155, 156, 157, 157, 158, 158,
29
 159, 160, 160, 161, 162, 162, 163, 163, 164, 165, 165, 166, 166, 167,
30
 168, 168, 169, 169, 170, 171, 171, 172, 172, 173, 173, 174, 175, 175,
31
 176, 176, 177, 178, 178, 179, 179, 180, 180, 181, 182, 182, 183, 183,
32
 184, 184, 185, 186, 186, 187, 187, 188, 188, 189, 189, 190, 191, 191,
33
 192, 192, 193, 193, 194, 194, 195, 195, 196, 196, 197, 198, 198, 199,
34
 199, 200, 200, 201, 201, 202, 202, 203, 203, 204, 204, 205, 205, 206,
35
 206, 207, 207, 208, 208, 209, 209, 210, 210, 211, 211, 212, 212, 213,
36
 213, 213, 214, 214, 215, 215, 216, 216, 217, 217, 218, 218, 219, 219,
37
 219, 220, 220, 221, 221, 222, 222, 222, 223, 223, 224, 224, 225, 225,
38
 225, 226, 226, 227, 227, 227, 228, 228, 229, 229, 229, 230, 230, 230,
39
 231, 231, 232, 232, 232, 233, 233, 233, 234, 234, 234, 235, 235, 235,
40
 236, 236, 236, 237, 237, 237, 238, 238, 238, 239, 239, 239, 240, 240,
41
 240, 241, 241, 241, 241, 242, 242, 242, 243, 243, 243, 243, 244, 244,
42
 244, 245, 245, 245, 245, 246, 246, 246, 246, 246, 247, 247, 247, 247,
43
 248, 248, 248, 248, 249, 249, 249, 249, 249, 250, 250, 250, 250, 250,
44
 250, 251, 251, 251, 251, 251, 252, 252, 252, 252, 252, 252, 252, 253,
45
 253, 253, 253, 253, 253, 253, 254, 254, 254, 254, 254, 254, 254, 254,
46
 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
47
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
48
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
49
 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
50
 255, 255, 255, 255, 255, 255, 255, 255, 254, 254, 254, 254, 254, 254,
51
 254, 254, 254, 253, 253, 253, 253, 253, 253, 253, 252, 252, 252, 252,
52
 252, 252, 252, 251, 251, 251, 251, 251, 250, 250, 250, 250, 250, 250,
53
 249, 249, 249, 249, 249, 248, 248, 248, 248, 247, 247, 247, 247, 246,
54
 246, 246, 246, 246, 245, 245, 245, 245, 244, 244, 244, 243, 243, 243,
55
 243, 242, 242, 242, 241, 241, 241, 241, 240, 240, 240, 239, 239, 239,
56
 238, 238, 238, 237, 237, 237, 236, 236, 236, 235, 235, 235, 234, 234,
57
 234, 233, 233, 233, 232, 232, 232, 231, 231, 230, 230, 230, 229, 229,
58
 229, 228, 228, 227, 227, 227, 226, 226, 225, 225, 225, 224, 224, 223,
59
 223, 222, 222, 222, 221, 221, 220, 220, 219, 219, 219, 218, 218, 217,
60
 217, 216, 216, 215, 215, 214, 214, 213, 213, 213, 212, 212, 211, 211,
61
 210, 210, 209, 209, 208, 208, 207, 207, 206, 206, 205, 205, 204, 204,
62
 203, 203, 202, 202, 201, 201, 200, 200, 199, 199, 198, 198, 197, 196,
63
 196, 195, 195, 194, 194, 193, 193, 192, 192, 191, 191, 190, 189, 189,
64
 188, 188, 187, 187, 186, 186, 185, 184, 184, 183, 183, 182, 182, 181,
65
 180, 180, 179, 179, 178, 178, 177, 176, 176, 175, 175, 174, 173, 173,
66
 172, 172, 171, 171, 170, 169, 169, 168, 168, 167, 166, 166, 165, 165,
67
 164, 163, 163, 162, 162, 161, 160, 160, 159, 158, 158, 157, 157, 156,
68
 155, 155, 154, 154, 153, 152, 152, 151, 151, 150, 149, 149, 148, 147,
69
 147, 146, 146, 145, 144, 144, 143, 142, 142, 141, 141, 140, 139, 139,
70
 138, 137, 137, 136, 136, 135, 134, 134, 133, 132, 132, 131, 131, 130,
71
 129, 129, 128, 127, 127, 126, 125, 125, 124, 124, 123, 122, 122, 121,
72
 120, 120, 119, 119, 118, 117, 117, 116, 115, 115, 114, 114, 113, 112,
73
 112, 111, 110, 110, 109, 109, 108, 107, 107, 106, 105, 105, 104, 104,
74
 103, 102, 102, 101, 101, 100, 99, 99, 98, 98, 97, 96, 96, 95, 94, 94,
75
 93, 93, 92, 91, 91, 90, 90, 89, 88, 88, 87, 87, 86, 85, 85, 84, 84, 83,
76
 83, 82, 81, 81, 80, 80, 79, 78, 78, 77, 77, 76, 76, 75, 74, 74, 73, 73,
77
 72, 72, 71, 70, 70, 69, 69, 68, 68, 67, 67, 66, 65, 65, 64, 64, 63, 63,
78
 62, 62, 61, 61, 60, 60, 59, 58, 58, 57, 57, 56, 56, 55, 55, 54, 54, 53,
79
 53, 52, 52, 51, 51, 50, 50, 49, 49, 48, 48, 47, 47, 46, 46, 45, 45, 44,
80
 44, 43, 43, 43, 42, 42, 41, 41, 40, 40, 39, 39, 38, 38, 37, 37, 37, 36,
81
 36, 35, 35, 34, 34, 34, 33, 33, 32, 32, 31, 31, 31, 30, 30, 29, 29, 29,
82
 28, 28, 27, 27, 27, 26, 26, 26, 25, 25, 24, 24, 24, 23, 23, 23, 22, 22,
83
 22, 21, 21, 21, 20, 20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 17, 16, 16,
84
 16, 15, 15, 15, 15, 14, 14, 14, 13, 13, 13, 13, 12, 12, 12, 11, 11, 11,
85
 11, 10, 10, 10, 10, 10, 9, 9, 9, 9, 8, 8, 8, 8, 7, 7, 7, 7, 7, 6, 6, 6,
86
 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 2, 2,
87
 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
88
 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
89
 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
90
 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5,
91
 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10,
92
 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15,
93
 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21,
94
 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28,
95
 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 35, 35, 36, 36,
96
 37, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 43, 44, 44, 45,
97
 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54,
98
 55, 55, 56, 56, 57, 57, 58, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64,
99
 65, 65, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 72, 72, 73, 73, 74, 74, 75,
100
 76, 76, 77, 77, 78, 78, 79, 80, 80, 81, 81, 82, 83, 83, 84, 84, 85, 85, 86,
101
 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 95, 96, 96, 97, 98,
102
 98, 99, 99, 100, 101, 101, 102, 102, 103, 104, 104, 105, 105, 106, 107, 107,
103
 108, 109, 109, 110, 110, 111, 112, 112, 113, 114, 114, 115, 115, 116, 117, 117,
104
 118, 119, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 125, 126, 127, 127);
105
106
attribute ram_style: string;
107
attribute ram_style of ram : signal is "block";
108
109
begin
110
  PROCESS(clk_in)
111
  BEGIN
112
    if(rising_edge(clk_in)) then
113
        if(we='1') then
114
            ram(address) <= datain;
115
        end if;
116
        dataout <= conv_std_logic_vector(ram(address),8);
117
      test <= not test;
118
    end if;
119
END PROCESS;
120
121
end Behavioral;

we wird stest auf LOW gehalten. Wäre toll wenn jemand von euch eine Idee 
hätte, habe gerade einen Balken vrom Kopf....

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


Lesenswert?

Jürgen Dürrwang schrieb:
> Merkwürdigerweise wird jedoch nicht zu jedem Takt ausgeselen obwohl
> sich die Addresse für das RAM im Takt ändert.
Oh doch. Nur ändert sich der ausgelese Wert nicht. Sieh mal deine 
Tabelle an, da stehen viele gleiche Zahlen hintereinander:
> 246, 246, 246, 246, 245, 245, 245, 245, 244, 244, 244, 243, 243, 243,
> 243, 242, 242, 242, 241, 241, 241, 241, 240, 240, 240, 239, 239, 239,
Z.B. 3x 244, 4x 243,  3x 242, 4x 241 usw...

von Jürgen D. (Firma: Student) (freacky2002)


Lesenswert?

OH Gott wie böld bin ich den....das ist es natürlich, vielen Dank dir! 
Dachte nicht das sich so schnell ne Lösung findet :-)

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Jürgen Dürrwang schrieb:
> --ROM for storing the sine values generated by MATLAB.
> signal ram : ram_t :=(128, 129, 129, 130, 131, 131, 132, 132,

Ein Sinus ändert seinen Wert nun mal nicht immer mit jedem Schritt bei 
der kleinen Auflösung.

Tom

von BRAM-Benutzer (Gast)


Lesenswert?

So nebenbei: Dass Du einen Versatz bezüglich Schreiben und We hast, ist 
dir bewusst, ja?

von Jürgen D. (Firma: Student) (freacky2002)


Lesenswert?

BRAM-Benutzer schrieb:
> So nebenbei: Dass Du einen Versatz bezüglich Schreiben und We hast, ist
> dir bewusst, ja?

Du meinst das ich ein Versatz hätte wenn ich eine "Zelle" im RAM 
beschreiben möchte oder?

Also im Moment generiere ich mir die Daten mit MATLAB und lege diese 
fest in den RAM. Vorab möchte ich da noch nichts schreiben. Wenn alles 
mal tut dann werde ich mich wohl auch ans beschreiben machen.

von Jürgen D. (Firma: Student) (freacky2002)


Lesenswert?

Thomas Reinemann schrieb:
> Jürgen Dürrwang schrieb:
>> --ROM for storing the sine values generated by MATLAB.
>> signal ram : ram_t :=(128, 129, 129, 130, 131, 131, 132, 132,
>
> Ein Sinus ändert seinen Wert nun mal nicht immer mit jedem Schritt bei
> der kleinen Auflösung.
>
> Tom

Ja das hätte ins Auge fallen müssen, kommt davon wenn man den ganzen Tag 
vorm Bildschirm sitzt und irgendwelche Timing-Diagramme im 
Simulationstool anschaut. Da war ich auf ner ganz falschen Fährte....

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.