带分支的Verilog程序计数器

带分支的Verilog程序计数器,verilog,system-verilog,program-counter,Verilog,System Verilog,Program Counter,我需要创建一个Verilog模块,它接受时钟、复位、指令字的立即值(最低有效字节)和ALU的零输出作为输入,并为输出生成一个8位程序计数器(PC)。赋值要求注意,在这种架构中,当我们有分支时,下一个PC值应该是当前PC值加上从分支指令中提取的偏移量。偏移量用二的补码表示,因此分支目标的范围是从PC-128到PC+127。请注意,PC的值不应超过0xFF,因为我们有256深的指令内存。您不需要在硬件中检查这种情况 这是我到目前为止所拥有的,但我知道这是不完整的,我不确定如何处理立即数,或者是否需要

我需要创建一个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
模块pc(输入时钟,
输入rst,
立即输入[7:0],
输入alu_输出,
输出[7:0]pc)
注册[7:0]个人计算机;
始终@(posedge clk)
开始
如果(rst)
开始

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

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

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

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

大部分工作都是你自己完成的。为什么不再添加一个控件输入,称之为
branch
。当
branch
为0时,您将写入
pc255)
下一步_pc=255;

pc必须有一个与指示相关的输入,无论它是否是分支指令

通常,从处理器的角度来看,指令的子集用于指示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
始终@(posedge clk)
开始
如果(rst)

pc只是为了正确性,他想要的是一个相对的跳跃,而不是绝对的跳跃,因为他的即时值被添加到当前的pc中进行跳跃,而不是加载到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