§ Получение опкода

Перед декодированием метода адресации необходимо получить опкод, после чего можно начинать что-то декодировать. Но перед этим надо знать, в какой позиции сейчас находится исполнение микрокодов.
reg [ 4:0] tstate = 0;
reg [ 7:0] opcode;
Первая позиция tstate=0, это считывание опкода, и номер опкода в opcode.
// Основная тактовая частота
always @(posedge clock) begin

    case (tstate)
        0: opcode <= data;
    endcase

end
Так, на позитивном фронте clock, если tstate = 0, в opcode появится значение, полученное с шины данных, по умолчанию указывающих на bus=0, то есть с текущего указателя счетчика инструкции.
После получения опкода, необходимо установить новый tstate, который уже будет зависеть от того, какой именно метод адресации будет использоваться. Взять код для verilog можно отсюда.
// Считывание опкода
0: begin

    casex (data)

        8'bxxx_000_x1: tstate <= NDX;
        8'bxxx_010_x1,
        8'b1xx_000_x0: tstate <= IMM;
        8'bxxx_100_x1: tstate <= NDY;
        8'bxxx_110_x1: tstate <= ABY;
        8'bxxx_001_xx: tstate <= ZP;
        8'bxxx_011_xx,
        8'b001_000_00: tstate <= ABS;
        8'b10x_101_1x: tstate <= ZPY;
        8'bxxx_101_xx: tstate <= ZPX;
        8'b10x_111_1x: tstate <= ABY;
        8'bxxx_111_xx: tstate <= ABX;
        8'bxxx_100_00: tstate <= REL;
        8'b0xx_010_10: tstate <= ACC;
        default:       tstate <= IMP;

    endcase

    opcode <= data;

end
Здесь tstate принимает такие значения как NDX, IMM, и другие. Это - номера, которые пока что не определены и будут определяться по мере написания кода. Я пока что не знаю, к какому tstate, или даже правильно так сказать, метке, будет переход.

§ Indirect X (NDX)

Пример
LDA ($00,X)
Операнд получается с индексно-косвенной адресации. Считывается байт, следующий за опкодом, к этому полученному значению прибавляется регистр X. Однако если значение получилось более 255, то старшие разряды просто не учитываются. Допустим X=$FE, а считанное значение $03; 03h + FEh = 01h, перенос не учитывается.
После того, как указатель был получен, начинается считывание 16-битного адреса из этого указателя. Причем, опять-таки, если указатель стоит в $FF, то следующий будет не $100, а $00. Получается, что младший байт адреса будет находиться в $FF, а старший в $00.
EA = (FETCH_BYTE() + X) & FFh -- Считываем 1 байт и добавляем X, срезаем старшие биты
AD = READ(EA) + 256*READ( (EA+1)&255 ) -- Считываем 2 байта из EA
9 окт, 2020
© 2007-2022 Суперприз - права на автомобиль