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