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