我需要创建一个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
答案 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