2016-09-02 1 views
1

J'ai donc suivi un guide fourni par EmbeddedMicro sur la production d'une simple CPU 16 bits en utilisant leur HDL Lucid. Mon but est de convertir ceci à Verilog dans Quartus II. Le problème que j'ai est d'essayer de stocker les bits alloués pour la destination de mes données dans une plage spécifique de bits dans le registre désigné. Le deuxième problème que j'ai est d'utiliser une constante globale comme une des valeurs de cas. J'ai été capable de contourner cela en remplaçant simplement par la valeur constante. J'ai déjà ajouté le fichier include dans les paramètres du projet. Je suis encore nouveau à Verilog, donc leur pourrait être un abondant de mauvais code.Verilog: Stocker des bits dans une plage spécifique de bits d'un module initialisé

L'erreur recieved est en ligne 57

shift_r.D[DEST] = DIN; //supposed to be storing the data coming in into register 

Erreur Readout: Verilog Erreur de syntaxe, texte près: "=". Vérifier et corriger les erreurs de syntaxe qui apparaissent immédiatement avant ou au mot clé spécifié

`include "CPU_8/my_incl.vh" 


module CPU(CLK,RST,WRITE,READ,ADDRESS,DOUT,DIN); 
input RST,CLK; 
input [0:7] DIN; //DATA in 
output reg [0:7] ADDRESS; 
output reg [0:7] DOUT; //DATA OUT 
output reg WRITE,READ; 

reg [0:15] INST; 



//I am not sure if i set up the array for my registers correctly either 
shiftreg shift_r[0:15] (RST, CLK, D, Q); //initialize shift_r and create array of 16 registers. 
//Implicit net is created for the D and Q above when generating block file 

instRom_16 instRoms(ADDRESS, INST); //intialize InstRom_16 module 



reg [0:3]OP;  // opcode 
reg [0:3]ARG1;  // first arg 
reg [0:3]ARG2;  // second arg 
reg [0:3]DEST;  // destination arg 
reg [0:7]CONSTANT; //Constant 



[email protected](posedge CLK) 
begin 
    WRITE = 0;  // don't write 
    READ = 0;  // don't read 
    ADDRESS = 8'b0; // don't care 
    DOUT = 8'b0; // don't care 

    instRoms.ADDRESS = shift_r.D[0]; //Set shift_reg to be program counter 
    shift_r.D = shift_r.Q[0] + 1; //increment program counter. 




    OP = instRoms.INST[15:12]; // opcode first 4 bits 
    DEST = instRoms.INST[11:8]; // destination one 4 bits 
    ARG1 = instRoms.INST[7:4]; // argument2 is next 4 bits 
    ARG2 = instRoms.INST[3:0]; // ARGUMENT2 is last 4 bits 
    CONSTANT = instRoms.INST[7:0]; 

    //PERFORM OPERATIONS 
     case (OP) 
      4'd1: //tried to use `LOAD but that wouldn't point to the value in my include file 
       READ = 1;         // request a read 

       //line that is failing 
       shift_r.D[DEST] = DIN; //supposed to be storing the data coming in into register 

     //4'd2: 


    endcase 

    end 


endmodule 

Ceci est mon fichier include

`ifndef _my_incl_vh_ 
`define _my_incl_vh_ 

`define NOP = 4'd0; // 0 filled 

`define LOAD = 4'd1; // load 

`endif 

Répondre

0

Vous avez fait une petite erreur: shiftreg shift_r [00:15] (RST, CLK, D, Q);

instancie un tableau de shift_r, chaque instance dont une RST, CLK, D et Q.

Alors shift_r.D [DEST} devrait shift_r devenir [DEST] .D et shift_r.Q [0] devrait devenir shift_r [0] .Q.

Pour shift_r.D, supposez que vous voulez un vecteur 0:15. Vous devrez affecter tous les 16 bits à un fil intermédiaire de 15 bits en utilisant par ex. une boucle pour.

Hope this helps

+0

Salut, s'il vous plaît expliquer ce que vous entendez par « ne pas être en mesure d'avoir plusieurs cas », qui ne semble pas avoir de sens. S'il vous plaît voter si ma réponse était de toute aide. – chrisvp

+0

Je voulais dire plusieurs déclarations par cas. Je devrais probablement supprimer ce commentaire. Editer: Ancien commentaire supprimé car mauvaise faute de frappe, voici le correctif avec le libellé correct "Ajout d'un début et une fin pour un cas multi-instruction corrigé mon erreur de ne pas avoir plusieurs instructions par cas" – Laburtz