带有分支的Verilog程序计数器

时间:2016-04-03 17:50:00

标签: verilog system-verilog program-counter

我需要创建一个Verilog模块,它接受时钟,复位,指令字中的立即值(最低有效字节),以及ALU的零输出作为输入,并生成一个8位程序计数器(PC) )输出。赋值说要注意,在这个架构中,当我们有一个分支时,下一个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

3 个答案:

答案 0 :(得分:0)

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

虽然你的文字没有指明,但我也假设你应该能够执行绝对分支(也称为跳跃)。

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

您的程序计数器必须能够:从指令字<​​/ em>或添加分支值添加1 立即加载。在某些条件下,将执行这三个操作中的一个。在数字电路中,多路复用器是根据条件做出决策的好方法。 我建议你弄清楚你的条件是什么,并为自己画一个很好的数字,了解这是如何工作的。然后你尝试事后编程。

答案 1 :(得分:0)

你自己完成了大部分工作。为什么不再添加一个控制输入,称之为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次。

答案 2 :(得分: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