Steve D.
|
Erstellt: 14.11.10, 23:57 Betreff: Code-Parser (Tabelle -> FSM) |
|
|
Hallo zusammen, ich arbeite zur Zeit an einem Projekt für die Uni. Darin geht es darum einen Mikroprozessor-Kern zu schreiben. Dazu gibt es ein Rechenwerk und zwei verschiedene Steuerwerke - eines als State-Machine (FSM) und eines ist mikroprogrammierbar realisiert. Am Ende sollen diese beiden Lösungen dann verglichen werden.
Meine Aufgabe war zunächst die FSM-Beschreibung des Steuerwerks.
Als ich angefangen habe mir Gedanken über den Aufbau der FSM zu machen kam meinem Prof eine neue Idee: Ich soll eine Prozedur schreiben, die aus der nachfolgend dargestellten Tabelle automatisch die FSM erzeugt.
Auszug aus der Tabelle: ______________________________ TYPE TWord IS RECORD adr: TAdr; -- Folgeadresse: 9 Bitstellen sel1: std_logic; -- Multiplexer1: 1 Bitstelle, 0 from uIR, 1 from IR sel2: std_logic; -- Multiplexer2: 1 Bitstelle cntrl: TCntrl; -- Steuervektor: 36-11=25 Bitstellen END RECORD;
TYPE TRam IS ARRAY (natural RANGE <>) OF TWord;
CONSTANT mem: TRam(0 TO SIZE-1) := ( -- Reset-Sequenz: -- 1. PC := 0x07FE, SP := 0x3F, CCR := "00000" 16#000# => ( 16#001#, '0', '0', (wen_uCR=>'0', wen_AC=>'0', wen_IX=>'0', sel_data=>"00000", adr_mode=>IMM_MODE, fnt_PC=>PC_RST, fnt_SP=>SP_RST, ENA=>'0', ENB=>'0', WEA=>'0', wen_CF=>'1', wen_NZ=>'1', wen_HF=>'1', wen_IF=>'1', hlt=>'0') ), -- 2. MR := M[PC], PC := PC + 1 /* low address byte */ 16#001# => ( 16#002#, '0', '0', (wen_uCR=>'0', wen_AC=>'0', wen_IX=>'0', sel_data=>"00000", adr_mode=>IMM_MODE, fnt_PC=>PC_INC, fnt_SP=>SP_NCG, ENA=>'1', ENB=>'0', WEA=>'0', wen_CF=>'0', wen_NZ=>'0', wen_HF=>'0', wen_IF=>'0', hlt=>'0') ), -- 2. AR := M[PC] /* high address byte */ 16#002# => ( 16#003#, '0', '0', (wen_uCR=>'0', wen_AC=>'0', wen_IX=>'0', sel_data=>"00000", adr_mode=>IMM_MODE, fnt_PC=>PC_NCG, fnt_SP=>SP_NCG, ENA=>'0', ENB=>'1', WEA=>'0', wen_CF=>'0', wen_NZ=>'0', wen_HF=>'0', wen_IF=>'0', hlt=>'0') ), -- 3. PC := MR & AR 16#003# => ( 16#004#, '0', '0', (wen_uCR=>'0', wen_AC=>'0', wen_IX=>'0', sel_data=>"00000", adr_mode=>EXT_MODE, fnt_PC=>PC_ULD, fnt_SP=>SP_NCG, ENA=>'0', ENB=>'0', WEA=>'0', wen_CF=>'0', wen_NZ=>'0', wen_HF=>'0', wen_IF=>'0', hlt=>'0') ), ______________________________
Die Zustände der FSM wären ja einfach die Zahlen (16#000#). In C wüsste ich auch sofort wie ich das machen soll (einlesen, parsen, ...), in VHDL aber weniger. Mit den Befehlen READ und WRITE habe ich mich bereits grundlegend vertraut gemacht.
Aber: Wie lese ich den Code aus der selben Datei ein? und Wie soll ich darüber parsen? (Also die einzelnen Nutzdaten aus den Zeilen extrahieren)
Danke im voraus
|
|