问题标签 [program-counter]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6727 浏览

cpu - VHDL程序计数器使用信号和以前制作的组件?

我目前正在进行一个项目,我正在尝试设计一个单周期 CPU。我这样做没有任何管道衬里,因为这会大大增加设计的复杂性。当我了解到这一点时,我只是在采取婴儿步骤。我发现自己被困在这部分,我只是尝试使用以前制作的组件编写程序计数器(PC)。

我设计的模型在这里看起来像这张照片。抱歉,不知道为什么它变黑了,但是如果您单击它,它会正确显示。PC 和 theMUX 都是 32 位组件,所以我假设加法器也是如此。

这是我得到的代码,我的实现从第 41 行的 begin 语句开始。暂时不要注意它,它只是我正在尝试的一堆随机乱码。

我对此很陌生,所以我对信号的工作原理只有一个模糊的概念,也不知道我应该如何将组件实现到设计中。我也很困惑,我没有被要求提前构建加法器。现在有必要将它用作我猜测的组件吗?

无论如何,我尝试过搜索时偶然发现的不同事物,例如您看到的端口映射。但是我总是遇到某种错误,目前我收到的错误是对象 Q、clr 和 D 已使用但未声明。我如何声明它们?如果我摆脱这些陈述,错误只会重复对象 X0、X1 和 Y。任何正确方向的帮助将不胜感激。多谢你们!

此外,以防万一您需要它们,

和多路复用器

编辑 好的,不知道我是否正确执行此操作,但我重写了端口映射。我遇到端口名称(sel、clk、X0、X1..etc)被“使用但未初始化”的错误。这就是为什么 clr、clk 和 ld 具有初始值的原因。再一次,不知道这是否正确,但是它使错误消失了。我还意识到我从未将 register32 和 mux2to1_32 VHDL 文件添加到我的项目中,并且在这样做之后摆脱了我遇到的其他错误。

就目前而言,代码可以编译,我在项目中包含了一个用于测试的 VWF 模拟文件,但我知道结果会不正确。

我还不知道有什么问题,但我知道我需要对 PC_add_4 做点什么。这个值基本上需要是(PC_current + 4),但我不知道该怎么做。

这是代码的更新部分(其他一切都相同)

而且,如果他们有帮助,我的错误列表..我猜测与引脚相关的错误是因为我还没有进行任何硬件分配。

  1. 警告 (10541):pc_update.vhd(38) 处的 VHDL 信号声明警告:使用信号“PC_add_4”的隐式默认值,因为从未为信号分配值或显式默认值。使用隐式默认值可能会引入意外的设计优化。

  2. 警告 (10492): pc_update.vhd(61) 处的 VHDL 流程声明警告:在流程声明中读取信号“clk”,但不在流程声明的敏感度列表中

  3. 警告:输出引脚卡在 VCC 或 GND

  4. 警告:设计包含 34 个不驱动逻辑的输入引脚

  5. 警告:发现 32 个输出引脚没有输出引脚负载电容分配

  6. 警告:未指定保留所有未使用的引脚设置,默认为“作为输出驱动接地”。

  7. 警告:无法生成编程文件,因为您当前正在评估模式下使用 Quartus II 软件

  8. 警告:找不到时序分析的路径

  9. 严重警告:总共 66 个引脚中的 66 个引脚没有准确的引脚位置分配

第二次编辑 所以是的,我通过添加 PC_add_4 <= (PC_current + 4 ); 来修复我的代码 在端口映射之后,并将“clk”添加到进程敏感度列表中。但是,我相信我在模拟中的波形仍然是错误的,如此处所示

它似乎将 incH_lDL 视为一个清除信号,而不是简单地将 PCInput 传递给 InstrAddr。这很可能是由于我在端口映射中将其设置为默认的“0”。我之前这样做是因为它给了我“使用但未声明”的错误。生病尝试弄乱它并发布我的发现。

第三次编辑

我已经编辑了我的代码:

我的模拟现在显示,当 incH_lDL = 0 时,PCInput 被加载到 InstrAddr,但是,当 incH_lDL = 1 时,它只是加载值“4”,并且不会像它应该的那样在每个时钟周期开始时递增......我需要使用 PC_current,但我不确定如何......因为你不能将一个信号分配给另一个信号,例如“PC_current <= PCInput”。我会尝试更多的东西,同时,任何指针都将不胜感激。

第四次编辑 感谢仍在阅读本文并阅读所有内容的任何人。

我曾尝试在我的实现中使用 PC_next 和 PC_current,但遇到了“用于网络“PC_next”错误的多个常量驱动程序。

我的流程代码:

我知道在循环中进行这些分配时会出现此错误吗?我真的不知道接下来要尝试什么。

0 投票
1 回答
1846 浏览

c - 如何在 C 或汇编中修改堆栈上的返回地址

如您所知,当子程序调用时,当前 PC(程序计数器)值存储在堆栈中。我想在子程序中修改它,如下所示。我想使用 gcc 编译器在 Intel Core-i7 3632QM 上执行此操作。

0 投票
1 回答
1013 浏览

signals - VHDL程序计数器,多个常量驱动错误

我目前正在尝试使用以前制作的组件设计程序计数器(PC)。我设计的模型在这里看起来像这张照片

我遇到的问题是将我的 MUX 组件连接到 PC 寄存器组件。我应该使用给定的信号,但我不确定如何准确连接它们。AS代表,编译后我收到

错误 (10028):无法在 pc_update.vhd(52) 解析网络“PC_next[31]”的多个常量驱动程序

...

错误 (10028):无法在 pc_update.vhd(52) 解析网络“PC_next[14]”的多个常量驱动程序

错误 (10029):pc_update.vhd(63) 中的常量驱动程序

错误:无法详细说明顶级用户层次结构

我知道那是因为我有两个组件试图写入同一个信号,这是错误的,我只是不知道应该如何修复它。任何帮助表示赞赏。

这是我得到的代码,我的实现从第 41 行的 begin 语句开始。

编辑因为它似乎需要。这是 mux2to1_32 和 register32 register32 的代码

mux2to1_32

0 投票
1 回答
1472 浏览

memory-management - 堆栈指针的值是多少?

考虑一个具有字节可寻址存储器的处理器。假设所有寄存器,包括程序计数器 (PC) 和程序状态字 (PSW),大小为 2 字节。主内存中的堆栈是从内存位置 (0100)hex 实现的,并且它向上增长。堆栈指针 (SP) 指向堆栈的顶部元素。SP 的当前值为 (016E​​)hex。CALL 指令有两个字,第一个字是操作码,第二个字是子程序的起始地址(一个字 = 2 字节)。CALL 指令实现如下:

  1. 将 PC 的当前值存储在堆栈中
  2. 将 PSW 寄存器的值存入堆栈
  3. 加载PC中子程序的起始地址

取 CALL 指令之前 PC 的内容是 (5FA0)hex。执行 CALL 指令后,堆栈指针的值为

A. 016A

B. 016C

C. 0170

D. 0172

这个问题是在 GATE 2015 计算机科学中提出的。

我将 D 标记为答案,请帮助我验证我的答案,因为我不确定我是否做对了。

提前致谢。

0 投票
2 回答
788 浏览

assembly - ARM架构下添加命令和程序计数器

我专注于add使用它的命令的 ARM 程序集片段。如下所示的代码片段简单地指出:在程序计数器的地址上加上计算出的偏移量,以找到存储在的字符串的位置L._str,其中L._str是包含在数据段中的字符串的符号(地址)。

前两条指令 (movwmovt) 加载表示该字符串地址的 32 位数字。我在拇指模式,对吧?好的,这么说,我很难弄清楚整体内存布局。以下是内存代码段的正确表示吗?另外,字符串的地址是LPC1_0L._str基地址吗?每个盒子的尺寸是多少?32 位或 64 位取决于架构。add r0, pcA simple string

pc如果是这样,我可以使用差异检索偏移量(将添加到) L_.str-LPC1_0。但是,这里+4也考虑到了。

来自ADD、pc 或 sp 相对

添加 Rd,Rp,#expr

如果 Rp 是 pc,则使用的值是:(当前指令的地址 + 4)AND &FFFFFFFC。

因此,如果pc是的话,Rp我似乎还需要考虑+4偏移量的更多字节。行。那么,这些字节是在哪里添加的呢?为什么将这 4 个字节考虑在mov指令中而不是在add命令之前?这是编译器引入的优化功能吗?

0 投票
4 回答
8999 浏览

assembly - 返回中断处理程序后程序计数器去了哪里?

嗨,我想知道当程序从中断服务程序返回时程序计数器去哪里了?我知道当中断事件发生时,PC 被推入堆栈。但是下一个或同一个(刚刚执行的)压入堆栈的地址是什么?当我们有

或者

我的意思是,PC 是指向在 ISR 入口之前执行的指令,还是指向下一条指令(从 ISR 返回之后)?我希望你能明白。

0 投票
1 回答
727 浏览

operating-system - 为什么修改程序计数器不是特权指令?

程序计数器存储在 PCB 中,即在内核空间中。但是修改程序计数器不是特权指令。这是为什么?

0 投票
1 回答
1460 浏览

c - 是否可以读取另一个线程的程序计数器?

线程 A 是否可以(在 C 或 C++ 程序中,在 64 位英特尔架构的 Linux 下运行)读取线程 B 的程序计数器寄存器的值,而不需要对线程 B 的代码进行任何特殊检测?

(我意识到这是一件奇怪的事情;这种愿望只是因为我很好奇线程 A 是否可以使用它来检测线程 B 是否陷入失败的系统调用,如此所述)

0 投票
1 回答
1372 浏览

8085 - 8085 中的程序计数器实际上是如何工作的?

我一直在阅读有关 8085 的程序计数器。这里的材料指出,程序计数器的功能是指向要从中获取下一个字节的内存地址。当一个字节(机器代码)被取出时,程序计数器加一以指向下一个内存位置。我的问题是,如果指令大小不同,它如何处理这种情况。假设当前指令是 3 个字节,那么 PC 应该指向当前地址+3。PC如何知道当前指令的大小?我是 8085 的新手,任何帮助将不胜感激。谢谢

0 投票
2 回答
445 浏览

memory-address - 为什么 32 位处理器只能寻址 4GiB 的内存,即使是大字长?

到目前为止,我认为 32 位处理器可以使用 4 GiB 的内存,因为 2 32是 4 GiB,但是这种方法意味着处理器的word size = 1 byte。因此,具有 32 位程序计数器的进程可以寻址 2 32 个不同的内存字,因此我们有 4 GiB。

但是如果处理器的字长大于 1 字节,我相信现在大多数处理器都是这种情况(我的理解是字长等于数据总线的宽度,所以具有 64 位数据总线的处理器必须有一个字大小= 8字节)。

现在具有 32 位程序计数器的同一处理器可以寻址 2^32 个不同的内存字,但在这种情况下,字大小为 8 个字节,因此它可以寻址更多与 4 GiB 相矛盾的内存,那么我的论点有什么问题?