-1

我需要创建一个 Verilog 模块,它接受时钟、复位、指令字的立即值(最低有效字节)和 ALU 的零输出作为输入,并为输出。分配说要注意,在这个架构中,当我们有一个分支时,下一个 PC 值应该是当前 PC 值加上从分支指令中提取的偏移量。偏移量用二进制补码表示,因此分支目标的范围是从 PC - 128 到 PC + 127。注意 PC 的值不应超过 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
4

3 回答 3

0

必须有一个与指示相关的输入,不管是不是分支指令。

通常,从处理器的角度来看,指令的子集用于指示 PC 是否应该正常递增或是否存在分支/跳转指令。

在您的情况下,我们可以采用额外的输入来指示分支指令。

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
于 2016-04-10T16:58:52.403 回答
0

我一般不做其他人的家庭作业,所以我会尽力帮助你。(就像那个永远不会直接回答你问题的烦人的老师一样。)

尽管您的文本没有指定,但我还假设您应该能够执行绝对分支(也称为跳转)。

对于分支,您需要使用加法器。您已经有一个用于PC = PC + 1操作的加法器,重新使用此加法器进行分支会非常好。这个加法器必须放在你的 PC 寄存器前面的某个地方。添加什么必须由您的电路决定。

您的程序计数器必须能够:从指令字立即加载添加分支值添加 1。这三个操作之一将在特定条件下执行。在数字电路中,多路复用器是根据条件做出决策的好方法。我建议你弄清楚你的条件是什么,然后给自己画一个很好的图来说明这需要如何工作。然后你尝试在之后对其进行编程。

于 2016-04-04T06:38:36.467 回答
0

你自己完成了大部分工作。为什么不再添加一个控制输入,调用它branch。当为 0 时,您按照已有的branch方式编写。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] }}sign扩展了immediate的符号位,即重复immediate[8],24次。

于 2016-04-05T21:17:12.773 回答