1

这将有点长,可能比任何特定语言都与计算机科学相关(尽管我需要使用 Java)。你被警告了。

我正在尝试对平行线上的电信号传播进行建模,以模拟基本的计算机硬件。每条路径上都有各种元素,导致我的原始信号延迟、放大和其他此类转换。

这是我刚刚制作的图像:

我试图代表的一个简单例子

谢天谢地,我不想代表任何复杂的信号——只是 0 和 1。在示例中,有 4 个输入;假设用户选择它们为 1011。然后我需要通过电线将这些输入发送到门中,门产生适当的输出并继续传播信号。

问题是时机。我为每根电线和每一个门分配了一个时间延迟。例如,如果最左上角的线有 0.5 的时间延迟,那么第一个门需要 0.5 个单位的时间来接收输入。我将每个门都绘制为多输入,因此可能会发生以下情况(考虑与门): input1 在 1.1 个时间单位内到达,并且很高;输出仍然为零。但随后输入 2(也为高)有 1.3 个单位的延迟才能到达那里,因此 0.2 个单位后输出将被重新计算为变高。事实上,每个门本身都会有延迟,所以说与门需要 0.5 个单位来计算;最终的高输出将需要 (1.3 + 0.5) = 1.8 个单位才能变高。

我目前的编程模型是这样的:电线和门是可以相互连接并向前发送信号的对象。例如,wireA_input 连接到实际输入,wireA_output 连接到门。所以输入信号进来了(从之前的值改变),那个动作应该调用 send_signal(wireA, input)。此函数将wireA 上的值更改为wireA_delay 之后的输入值。然后wireA执行send_signal(gateA,wireA_value),这会导致门重新计算其值,然后在gateA_delay等之后将其转发给下一个对象。

但我需要并行传播信号——我不能只关注一条串行路径!所以我的想法是为每个输入创建多个线程。最多我想我需要32个输入信号,所以32个线程。我很想按循环顺序安排它们以实现平等,我不确定我是否可以用 JVM 做到这一点。无论哪种方式,他们都将获得相同的优先级。

现在第 i 个输入线程执行我上面描述的操作 - 它向下传播信号。但是,当一条路径分支成多条路径时会发生什么?

重要的是要注意门可以有多个“扇出”,即从它们的输出链接到其他地方。该值通常最多为 4。所以在gateA 设置后,它知道它需要调用send_signal(wireB->E,gateA_value) 4 次,每个扇出调用一次。

理想情况下,我不想分支到不同的线程,这对于更大的设计来说真的很糟糕而且可能是不可能的,但是嘿,也许线程的整个概念一开始就没有必要。我不需要以荒谬的速度进行模拟,就足以对人类用户做出响应。

所以回到我可能的实现——一个输入线程沿着串行路径传播,直到 BAM——它分支到 4 个不同的路径。这是我的想法:现在让同一个线程有 4 条路径。每条路径都有自己的延迟(例如:1.4、2.2、3.6、1.1)。将每个延迟乘以 100,并循环 N 次迭代,其中 N 对应于最大延迟(在本例中:360)。在对应于其他延迟(i = 110、140、220)的循环中的各个检查点,将这些不同的路径向前传播一步(即,将信号发送到路径上的紧邻下一个对象)。但随后我们需要将此对象添加到循环列表中,并再次计算适当的迭代次数,然后再沿着该特定路径进一步传播。

当 1 到 4 条路径的所有 4 条路径都分支到另外 4 条路径时(依此类推),那么我有点搞砸了;但也许这种方法足以让我开始?

同样,我可能会从完全错误的方向来解决这个问题,我愿意退后一步重新考虑它。所以我问你们。

非常感谢您的任何意见,甚至阅读这该死的东西。干杯。

4

1 回答 1

2

如果您的所有延迟都是非负的(安全假设)和确定性的(合理安全的假设),那么每次发生事件时,您都会自动知道它触发了哪些事件以及它们何时发生

为什么不直接为事件使用优先级队列并在它们发生时处理它们?当有事情发生时,计算所有结果事件的时间并将它们添加到队列中;然后从队列中抓取下一个事件并处理它。

于 2012-05-20T15:54:17.937 回答