Счетчик программ Verilog с разветвлением

Мне нужно создать модуль Verilog, который принимает часы, сброс, непосредственное значение из командного слова (младший байт) и нулевой вывод из АЛУ в качестве входов и генерирует 8-битный программный счетчик (ПК) для выход. Назначение говорит, что в этой архитектуре, когда у нас есть ветвь, следующее значение ПК должно быть текущим значением ПК плюс смещение, которое извлекается из инструкции ветвления. Смещение представлено в виде дополнения до двух, поэтому диапазон целевого значения перехода составляет от ПК - 128 до ПК + 127. Обратите внимание, что значение ПК не должно превышать 0xFF, так как у нас имеется память с глубиной 256 команд. Вам не нужно проверять это состояние на вашем оборудовании.

Вот что у меня есть, но я знаю, что это неполно, и я не уверен, что делать с немедленным или нужно ли что-то добавить для инструкции перехода. Любая помощь / предложения?

module pc(input clk,
    input rst,
    input [7:0] immediate,
    input alu_output,
    output [7:0] pc)

reg [7:0] pc;

always@(posedge clk)
    begin
        if(rst)
            begin
                pc <= 0;
            end
        else
            begin
                pc <= pc + 1;
            end             
    end
endmodule

3 ответа

Должен быть вход, связанный, чтобы указать, является ли это инструкциями ветвления или нет.

Как правило, с точки зрения процессора, поднабор команды используется для указания того, должен ли ПК обычно увеличиваться или есть команда перехода / перехода.

В вашем случае мы можем сделать дополнительный ввод для указания инструкции перехода.

always @ (posedge clk)
begin
  if (rst)
    pc <= 'h0;
  else if (branch_inst) // Extra input port "branch_inst"
    pc <= pc + immediate; // immediate in 2's complement, signed form
  else 
    pc <= pc + 1'b1;
end

Вы сделали большую часть работы самостоятельно. Почему бы вам не добавить еще один элемент управления, назовите его branch, когда branch 0, ты пишешь pc <= pc +1 как у вас уже есть. когда branch 1, вы пишете:

begin
    next_pc = pc +{ {{24{immediate[8] }}, immediate[8:0] };
    if (next_pc > 255)
        next_pc = 255;

    pc  <= next_pc;
end

где {{24{immediate[8] }} знак удлиняет знак бита немедленного, т.е. повторяется немедленно [8], 24 раза.

Обычно я не занимаюсь домашним заданием для других людей, поэтому постараюсь помочь вам. (Также как тот раздражающий учитель, который никогда не ответит на ваши вопросы напрямую.)

Хотя в вашем тексте ничего не указано, я также предполагаю, что вы должны иметь возможность выполнять абсолютные переходы (также известные как переходы).

Для разветвления нужно использовать сумматор. Вы уже использовали сумматор для вас PC = PC + 1 операция, было бы очень хорошо повторно использовать этот сумматор для разветвления. Этот сумматор должен находиться где-то перед вашим ПК-регистратором. Что добавить, должно решаться вашей схемой.

Ваш программный счетчик должен уметь: загружать сразу из командного слова или добавлять значение ветви или добавлять 1. Одна из этих трех операций будет выполнена при определенных условиях. В цифровых цепях мультиплексоры являются отличным способом принятия решений на основе условий. Я предлагаю вам выяснить, каковы ваши условия и нарисовать себе хорошую картину того, как это должно работать. Затем вы пытаетесь запрограммировать его потом.

Другие вопросы по тегам