Forum: FPGA, VHDL & Co. synchrones Ram-Modul imit Verilog.


von peter (Gast)


Lesenswert?

Hallo, guten Tag.
Wie wird bitte in Verilog ein synchrones Ram-Modul angelegt?
Ich habe das DE1.

Wenn ich das in Verilog schreibe:
reg [7:0] memory_ram_d [40000:0];
kommt keine Fehlermeldung mit einem irgend welchen Überlauf.
Es wird aber auch kein Ram-Modul angelegt.

Wenn ich das in VHDL schreibe:
Type rom_vec is ARRAY (0 to 8192) OF unsigned(7 downto 0);
signal speicher_vec : rom_vec;
wird ein synchrones Ram-Modul angelegt.

Wenn ich das in VHDL schreibe:
Type rom_vec is ARRAY (0 to 40000) OF unsigned(7 downto 0);
signal speicher_vec : rom_vec;
kommt eine Fehlermeldund von Quartus 13 , das es diese Datenmenge nicht 
schafft.

Wie wird bitte in Verilog ein synchrones Ram-Modul angelegt und warum 
kommt bei 40000 kein Überlauf?

Danke.
Gruss

von peter (Gast)


Lesenswert?

Kann raus...
Frage ist geklärt, kann jetzt ein Ram anlegen und es wird auch als 
Baugruppe angezeigt im RTLviever nach dem compilieren mit Verilog.


Gruss

von Cle (Gast)


Lesenswert?

peter schrieb:
> Kann raus...
> Frage ist geklärt, kann jetzt ein Ram anlegen und es wird auch als
> Baugruppe angezeigt im RTLviever nach dem compilieren mit Verilog.
>
> Gruss

Und vielleicht noch erzählen wie, dann freut sich der nächste der das 
sucht...

von peter (Gast)


Lesenswert?

Aus einer Sammlung von Verilog, funktioniert wunderbar:
1
module ram_sp_sr_sw (
2
clk         , // Clock Input
3
address     , // Address Input
4
data        , // Data bi-directional
5
cs          , // Chip Select
6
we          , // Write Enable/Read Enable
7
oe            // Output Enable
8
); 
9
10
parameter DATA_WIDTH = 8 ;
11
parameter ADDR_WIDTH = 13 ;
12
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
13
14
//--------------Input Ports----------------------- 
15
input                  clk         ;
16
input [ADDR_WIDTH-1:0] address     ;
17
input                  cs          ;
18
input                  we          ;
19
input                  oe          ; 
20
21
//--------------Inout Ports----------------------- 
22
inout [DATA_WIDTH-1:0]  data       ;
23
24
//--------------Internal variables---------------- 
25
reg [DATA_WIDTH-1:0] data_out ;
26
reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];
27
reg                  oe_r;
28
29
//--------------Code Starts Here------------------ 
30
31
// Tri-State Buffer control 
32
// output : When we = 0, oe = 1, cs = 1
33
assign data = (cs && oe && !we) ? data_out : 8'bz; 
34
35
// Memory Write Block 
36
// Write Operation : When we = 1, cs = 1
37
always @ (posedge clk)
38
begin : MEM_WRITE
39
   if ( cs && we ) begin
40
       mem[address] = data;
41
   end
42
end
43
44
// Memory Read Block 
45
// Read Operation : When we = 0, oe = 1, cs = 1
46
always @ (posedge clk)
47
begin : MEM_READ
48
  if (cs && !we && oe) begin
49
    data_out = mem[address];
50
    oe_r = 1;
51
  end else begin
52
    oe_r = 0;
53
  end
54
end
55
56
endmodule

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


Lesenswert?

peter schrieb:
> Wenn ich das in VHDL schreibe:
> Type rom_vec is ARRAY (0 to 40000) OF unsigned(7 downto 0);
> signal speicher_vec : rom_vec;
> kommt eine Fehlermeldund von Quartus 13 , das es diese Datenmenge nicht
> schafft.
Der Cyclone2 auf dem DE1 hat 52 M4K RAM-Blöcke mit je 4kbit, also 
insgesamt 240kbit. Du willst im VHDL Code 8*40001 Bits, also 320kb. 
Fazit: dein FPGA kann dir das, was du willst, nicht geben. Das wird dann 
auch mit Verilog nicht gehen.

Weil du aber im Verilog Code nur 2**13*8 Bits, also 8192*8 Bits = 65kb 
willst, geht das natürlich...

Denn eines ist klar: wenn es mit Verilog geht, dann geht es auch mit 
VHDL. Es ist ja die selbe Hardware!

: Bearbeitet durch Moderator
von peter (Gast)


Lesenswert?

Ja, danke für die Info.

Wenn ich das in Verilog schreibe:
---------------------------------
reg [7:0] memory_ram_d [40000:0];
---------------------------------
kommt keine Fehlermeldung mit irgend welchen Überlauf.
Es wird aber auch kein Ram-Modul angelegt.

Wird der Überlauf vom Compiler nicht erkannt?
Wo werden da die Bytes angelegt, ist hier das herhalten identisch mit 
einem optischen RAM welches angelegt wird beim anderen Verfahren?

Der Nachteil von diesem RAM :
1
module ram_sp_sr_sw (
2
clk         , // Clock Input
3
address     , // Address Input
4
data        , // Data bi-directional
5
cs          , // Chip Select
6
we          , // Write Enable/Read Enable
7
oe            // Output Enable
8
); 
9
10
parameter DATA_WIDTH = 8 ;
11
parameter ADDR_WIDTH = 13 ;
12
parameter RAM_DEPTH = 1 << ADDR_WIDTH;
13
14
//--------------Input Ports----------------------- 
15
input                  clk         ;
16
input [ADDR_WIDTH-1:0] address     ;
17
input                  cs          ;
18
input                  we          ;
19
input                  oe          ; 
20
21
//--------------Inout Ports----------------------- 
22
inout [DATA_WIDTH-1:0]  data       ;
23
24
//--------------Internal variables---------------- 
25
reg [DATA_WIDTH-1:0] data_out ;
26
reg [DATA_WIDTH-1:0] mem [0:RAM_DEPTH-1];
27
reg                  oe_r;
28
29
//--------------Code Starts Here------------------ 
30
31
// Tri-State Buffer control 
32
// output : When we = 0, oe = 1, cs = 1
33
assign data = (cs && oe && !we) ? data_out : 8'bz; 
34
35
// Memory Write Block 
36
// Write Operation : When we = 1, cs = 1
37
always @ (posedge clk)
38
begin : MEM_WRITE
39
   if ( cs && we ) begin
40
       mem[address] = data;
41
   end
42
end
43
44
// Memory Read Block 
45
// Read Operation : When we = 0, oe = 1, cs = 1
46
always @ (posedge clk)
47
begin : MEM_READ
48
  if (cs && !we && oe) begin
49
    data_out = mem[address];
50
    oe_r = 1;
51
  end else begin
52
    oe_r = 0;
53
  end
54
end
55
56
endmodule

ist, das er nur durch eine Drahtsteuerung zugänglich/funktionsfähig ist, 
gegenüber dem optischn RAM in VHDL, welches als Software(Befehl) 
gesteuert wird.


Danke.
Gruss

von peter (Gast)


Lesenswert?

Habe jetzt eine Lösung gefunden um ein RAM anzulegen und mit Daten 
füllen, die mit geladen werden, das RAM wird auch angezeigt im 
RTL-Viewer und auch die Memorysanzahl werden angezeigt:
1
module rom_file (
2
input clk ,
3
output [7:0] led_g   
4
);
5
6
reg [13:0] address;
7
reg [7:0]  data; 
8
reg [31:0] cnt;
9
//reg [7:0]  mem [0:255] ;  
10
          
11
(* ram_init_file = "test-bin.hex" *) reg [7:0] mem [254:0];
12
//initial begin
13
//  $readmemb("test-bin.txt", mem); 
14
//end
15
16
always @(posedge clk) 
17
begin
18
  if (cnt==20000000)
19
    begin
20
      address=address+1;
21
      data=mem[address];
22
      cnt=0;
23
    end
24
  else  
25
    cnt <= cnt+1;
26
end
27
28
assign led_g = data;
29
30
endmodule

Geladen werden Daten als Intel-Hex :
(* ram_init_file = "test-bin.hex" *) reg [7:0] mem [254:0];
ein mem braucht nicht extra angelegt werden, ist mit im Befehl.

oder als Binäre-Reihen:
initial begin
  $readmemb("test-bin.txt", mem);
end
da muss vorher aber ein mem angelegt werden :
reg [7:0]  mem [0:255] ;

hier das Format:
11111111
10000001
11111111
10000001
11111111
11110101
11001110
10010100

Gruss

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.