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
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
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...
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
|
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.