Счетчик программ 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. Одна из этих трех операций будет выполнена при определенных условиях. В цифровых цепях мультиплексоры являются отличным способом принятия решений на основе условий. Я предлагаю вам выяснить, каковы ваши условия и нарисовать себе хорошую картину того, как это должно работать. Затем вы пытаетесь запрограммировать его потом.