Verilog: хранить биты в определенном диапазоне битов инициализированного модуля.

Поэтому я следовал руководству EmbeddedMicro по созданию простого 16-битного ЦП с использованием их HDL Lucid. Моя цель - преобразовать это в Verilog в Quartus II. Проблема, с которой я сталкиваюсь, заключается в попытке сохранить биты, выделенные для назначения моих данных, в определенный диапазон битов внутри назначенного регистра. Вторая проблема, с которой я сталкиваюсь, - это использование глобальной константы в качестве одного из значений case. Я смог обойти это, просто заменив постоянным значением. Я уже добавил включаемый файл в настройки проекта. Я все еще новичок в Verilog, поэтому у них может быть много плохого кода.

Полученная ошибка находится в строке 57

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

Считывание ошибки: синтаксическая ошибка Verilog, рядом с текстом: "=". Проверьте и исправьте любые синтаксические ошибки, которые появляются непосредственно перед указанным ключевым словом или рядом с ним.

`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



always@(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

Это мой включаемый файл

`ifndef _my_incl_vh_
`define _my_incl_vh_

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

`define LOAD  = 4'd1; // load

`endif

person Laburtz    schedule 02.09.2016    source источник


Ответы (1)


Вы немного ошиблись:

shiftreg shift_r[0:15] (RST, CLK, D, Q);

Создает массив shift_r, каждый экземпляр которого имеет RST, CLK, D и Q.

Таким образом, shift_r.D[DEST] должно стать shift_r[DEST].D, а shift_r.Q[0] должно стать shift_r[0].Q.

Для shift_r.D предположим, что вам нужен вектор 0:15. Вам нужно будет назначить все 16 бит промежуточному проводу из 15 бит, используя, например, цикл for.

person chrisvp    schedule 02.09.2016