Chargement…
Chargement…
Le mu0 est un processeur 16 bits a accumulateur. Il possede :
io_data (16b) et io_addr (12b), plus o_memrq / o_rnw pour dialoguer avec la RAMChaque instruction s'execute en 2 cycles (un FETCH + un EXECUTE).
| Signal | Direction | Largeur | Description |
|---|---|---|---|
i_clk | Entree | 1 bit | Horloge |
i_reset | Entree | 1 bit | Reset asynchrone actif haut |
io_data | In/Out | 16 bits | Bus de donnees bidirectionnel |
io_addr | In/Out | 12 bits | Bus d'adresse bidirectionnel |
o_memrq | Sortie | 1 bit | Requête memoire (1 = acces memoire) |
o_rnw | Sortie | 1 bit | 1 = lecture, 0 = ecriture |
Chaque mot d'instruction : IR[15:12] = opcode, IR[11:0] = addr.
| Mnemonique | Opcode | Action |
|---|---|---|
LDA addr | 0000 | ACC <- mem[addr] |
STO addr | 0001 | mem[addr] <- ACC |
ADD addr | 0010 | ACC <- ACC + mem[addr] |
SUB addr | 0011 | ACC <- ACC - mem[addr] |
JMP addr | 0100 | PC <- addr |
JGE addr | 0101 | si ACC(15)='0' alors PC <- addr |
JNE addr | 0110 | si ACC /= 0 alors PC <- addr |
STP | 0111 | Arret du processeur |
AND addr | 1000 | ACC <- ACC and mem[addr] |
OR addr | 1001 | ACC <- ACC or mem[addr] |
XOR addr | 1010 | ACC <- ACC xor mem[addr] |
LDR addr | 1011 | R <- addr (chargement immediat) |
LDI | 1100 | ACC <- mem[R] ; R <- R+1 |
STI | 1101 | mem[R] <- ACC ; R <- R+1 |
Le sequenceur pilote les signaux suivants :
o_selA (2 bits) : choix pour le bus d'adresse io_addr - "00" -> pc_out (FETCH par defaut)
- "01" -> r_out (acces indirect LDI / STI)
- "10" -> non utilise (zero)
- "11" -> ir_addr (adressage direct)
o_selB (1 bit) : entree B de l'UAL - '0' -> "0000" & io_addr (zero-extension de l'adresse, pour les sauts / incrementations de PC ou R)
- '1' -> io_data (lecture memoire, pour LDA/ADD/SUB/AND/OR/XOR)
o_selC (1 bit) : entree de chargement de l'ACC - '0' -> sortie de l'UAL
- '1' -> io_data (LDI)
o_acc_ld, o_pc_ld, o_r_ld, o_ir_ld : signaux de chargement des registreso_acc_oe : active la sortie trois-etats de l'ACC sur io_data (STO / STI)o_alufs : operation de l'UALo_memrq, o_rnw : controle memoire (rnw='1' = lecture)Quatre etats : INIT, FETCH, EXECUTE, STOP.
o_raz='1', transition vers FETCH au prochain cycle.selA="00" (PC), selB='0', alufs=ALU_B_INC, ir_ld='1', pc_ld='1'. Transition vers EXECUTE.Valeurs par defaut dans le processus combinatoire : o_selA="00", o_selB='0', o_selC='0', tous les ld a '0', o_acc_oe='0', o_alufs=ALU_B_INC, o_memrq='1', o_rnw='1'.
La RAM (fournie) contient un programme de 30 instructions qui couvre les 14 opcodes. A la fin du programme, le testbench verifie l'etat de 9 cases memoire (mem[0x30]..mem[0x38]) correspondant a autant de chemins testes : chaines arithmetiques (LDA+ADD+STO, chaine SUB+AND+OR+XOR+STO), branches prises et non-prises de JGE et JNE, JMP, adressage indirect (LDR+LDI+STO) et deux ecritures STI consecutives pour valider l'incrementation de R.