Forum: FPGA, VHDL & Co. MC8051 Oregano Modelsim


von Andreas (Gast)


Lesenswert?

Hallo,

ich bin gerade damit beschäftigt den MC8051 zum laufen in Modelsim zu 
bringen. Dabei habe ich mir gedacht ich erstelle mir ein Rom und lasse 
dies dan im Modelsim laufen um die Veränderungen im Waveformwindow 
beobachten zu können.

Als ASM habe ich folgenden Text geschrieben
1
 mov  P0, #0;  schreibt Konstante in das Por0 -> gesammtes Port auf High
2
3
nop
4
nop
5
nop
6
nop
7
8
mov  P0, #255;  schreibt Konstante in das Por0 -> gesammtes Port auf High
9
10
nop
11
nop
12
nop
13
nop
14
15
mov  A, P0;    schreibt vom Port0 ins Arbeitsregister
16
17
nop
18
nop
19
nop
20
nop
21
22
end

das Rom file dazu sieht folgender Masen aus:
1
 ARCHITECTURE struct OF mc8051_rom_rw_p0 IS
2
3
   -- Architecture declarations
4
5
   -- Internal signal declarations
6
7
8
   -- ModuleWare signal declarations(v1.9) for instance 'U_0' of 'rom'
9
   TYPE MW_U_0ROM_TYPE IS ARRAY(65535 DOWNTO 0) OF std_logic_vector(7 DOWNTO 0);
10
   SIGNAL mw_U_0rom_table : MW_U_0ROM_TYPE;
11
   SIGNAL mw_U_0addr_int : INTEGER := 0 ;
12
13
14
BEGIN
15
   -- ModuleWare code(v1.9) for instance 'U_0' of 'rom'
16
   mw_U_0addr_int <= (CONV_INTEGER(unsigned(rom_adr_i)));
17
   u_0rom_table_proc : PROCESS ( mw_U_0addr_int )
18
   BEGIN
19
      CASE mw_U_0addr_int IS 
20
         WHEN 0 => mw_U_0rom_table(0) <= "10000000";
21
         WHEN 1 => mw_U_0rom_table(1) <= "11100101";
22
         WHEN 2 => mw_U_0rom_table(2) <= "00000000";
23
         WHEN 3 => mw_U_0rom_table(3) <= "00000000";
24
         WHEN 4 => mw_U_0rom_table(4) <= "00000000";
25
         WHEN 5 => mw_U_0rom_table(5) <= "00000000";
26
         WHEN 6 => mw_U_0rom_table(6) <= "11111111";
27
         WHEN 7 => mw_U_0rom_table(7) <= "10000000";
28
         WHEN 8 => mw_U_0rom_table(8) <= "01110101";
29
         WHEN 9 => mw_U_0rom_table(9) <= "00000000";
30
         WHEN 10 => mw_U_0rom_table(10) <= "00000000";
31
         WHEN 11 => mw_U_0rom_table(11) <= "00000000";
32
         WHEN 12 => mw_U_0rom_table(12) <= "00000000";
33
         WHEN 13 => mw_U_0rom_table(13) <= "00000000";
34
         WHEN 14 => mw_U_0rom_table(14) <= "10000000";
35
         WHEN 15 => mw_U_0rom_table(15) <= "01110101";
36
         WHEN 16 => mw_U_0rom_table(16) <= "00000000";
37
         WHEN 17 => mw_U_0rom_table(17) <= "00000000";
38
         WHEN 18 => mw_U_0rom_table(18) <= "00000000";
39
         WHEN 19 => mw_U_0rom_table(19) <= "00000000";
40
         WHEN OTHERS => mw_U_0rom_table(mw_U_0addr_int) <= (OTHERS => 'X') ;
41
      END CASE;
42
   END PROCESS ;
43
  
44
   u_0rom_read_proc : PROCESS ( clk )
45
   BEGIN
46
      IF  (clk'EVENT AND clk='1')  THEN
47
         rom_data_o <= mw_U_0rom_table(mw_U_0addr_int);
48
      END IF;
49
   END PROCESS ;
50
51
   -- Instance port mappings.
52
53
END struct;

Wie in aus dem VHDL-File hervorgeht sind dort FF eingebaut. Dies hat zur 
Folge, dass der Prozessor zwar anläuft aber nach 2-3Takten sofort ein 
Sprung zur ROM-Adr ~60000 erfolgt, wo nichts mehr definiert ist. Dann 
läuft die Simulation weiter bis der PC überläuft und dann beginnt das 
Spiel von vorn.

Wenn aber die FF entfernt werden und das Datenwort sofort zur Adresse 
anliegt bekomme ich nach ca. 1000ns Simulationszeit folgende Warnung 
auftritt "# ** Warning: CONV_INTEGER: There is an 'U'|'X'|'W'|'Z'|'-' in 
an arithmetic operand, and it has been converted to 0." einen Takt 
später bricht die Simulation dann ab.


Nun zu meiner Frage, was könnte ich noch ändern, bzw. eine Idee was ich 
noch ausprobieren könnte?

Vielen Dank für die Antworten!


mfg
andreas

von Duke Scarring (Gast)


Lesenswert?

Andreas schrieb:
> WHEN OTHERS => mw_U_0rom_table(mw_U_0addr_int) <= (OTHERS => 'X') ;
...
> Wie in aus dem VHDL-File hervorgeht sind dort FF eingebaut. Dies hat zur
Also ich sehe da 'X' an den undefinierten Speicherstellen, keine 0xFF.

Wird denn der Prozess u_0rom_table_proc überhaupt von mw_U_0addr_int 
getriggert?

Du kannst Dir im Modelsim mit View -> Memory List den aktuellen Inhalt 
von mw_U_0rom_table anschauen. Steht im Speicher was sinnvolles drin?


1
There is an 'U'|'X'|'W'|'Z'|'-' ...
Das liegt daran, daß rom_adr_i nicht interpretierbar ist.

Duke

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe die Belegung bei when others auf '1' geändert, somit steht im 
gesammten restlichen ROM 0xFF. Leider hat dies nicht den gewünschten 
Erfolg gebracht. Hier sind die entsprechenden Waveformwindows. Einmal 
für den getakteten Rom und einmal für den ungetakteten. Meine Frage 
bezieht sich vor allem auf den Umsatnd warum sofort nach dem das erste 
Wort aus dem ROM gelesen wurde ein Sprung auf die ROM-Adresse 65511 
erfolgt?


Über weitere Ideen würde ich mich sehr freuen!


beste Grüße

Andreas

von Duke Scarring (Gast)


Lesenswert?

Andreas schrieb:
> Einmal
> für den getakteten Rom und einmal für den ungetakteten. Meine Frage
> bezieht sich vor allem auf den Umsatnd warum sofort nach dem das erste
> Wort aus dem ROM gelesen wurde ein Sprung auf die ROM-Adresse 65511
Im ungetakteten ROM liegt der Speicherinhalt noch im selben Takt am 
Prozessor an.

Beim getakteten ROM hast Du einen Takt Latency. Du legst die 
Leseadresse an und hast erst einen Takt später die zugehörigen Daten. 
Woher auch immer die 0x80 von data_o während der Initialisierung 
herkommen, sie werden in Deinem Design als SJMP [1] interpretiert.

Duke

[1] http://www.keil.com/support/man/docs/is51/is51_opcodes.htm

P.S.: Du kannst die Lesbarkeit der Waveforms erhöhen, indem Du Dir die 
Werte hexadezimal anzeigen läßt.

von Andreas (Gast)


Lesenswert?

Hallo,

ich habe den Fehler gefunden, es lag in der Generierung des ROM-Files. 
;it dem Programm von der Homepage:

http://www.e.kth.se/~e93_daw/vhdl/download/hex2rom_0244_Win32.zip

ging dann die Simulation fehlerfrei!


beste Grüße

andreas

von Andreas (Gast)


Lesenswert?

Hallo,

vielen Dank für die Antworten!!!!!


beste Grüße

Andreas

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.