首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将仿真(MyHDL)和wxPython结合使用

将仿真(MyHDL)和wxPython结合使用
EN

Stack Overflow用户
提问于 2011-03-02 07:28:34
回答 1查看 376关注 0票数 2

我正在使用包MyHDL进行硬件模拟,但我希望在其周围设置一个GUI,以便用户可以交互地更改信号并查看其他信号的更新。

问题是,MyHDL使用仿真器如下所示

generators

  • Each

  • 模拟器有几个发生器,它们可以监听信号变化,也可以调用屈服延迟(X),以便让模拟器等待再次调用它来执行x个指令。
  • call Simulator.run()将simulation
  • Runs循环的启动循环完成

wxPython显然使用了一个事件循环。因此,我显然不能在不把另一个绑起来的情况下运行这两个。

我的第一个(哑巴)方法如下

代码语言:javascript
复制
    def Hack():
        @instance
        def inst():
            yield delay(1)
            self._app.MainLoop()
        return inst
    MyHack = Hack()
    self._instances.append(MyHack)
    self._simulator = Simulation(*self._instances)
    self._simulator.run()

这是可行的,但是inst()生成器只能运行一次,所以仿真实际上什么也没做。

然后我意识到这是一种需要多线程的情况。我尝试了以下几点:

代码语言:javascript
复制
    self._simulator = Simulation(*self._instances)
    p = Process(target=StartSim, args=(self._simulator,))
    p.start()
    #self._simulator.run()
    self._app.MainLoop()
    p.join()

def StartSim(sim):
    sim.run()

当然,我一开始并没有考虑线程安全问题。而且,我在模拟器中拥有的所有生成器函数都不能传递给线程。

我在想,我可以花一些时间来处理一个实线程工作者类,这个类是在前面创建的,它可以通过某种消息传递来获得所需的生成器函数。然而,在我看来,如果我能够为wxPython循环的每一步定义一种叫做“产生延迟(1)”的生成器,那就容易多了。在课堂上是这样的:

代码语言:javascript
复制
def OnIdle(self):
    yield delay(10)

然后用我原来的方法。问题是,我需要这样的代码:

代码语言:javascript
复制
    def Hack():
        @instance
        def inst():
            self._app.InitMainLoop()
            while(self._app.InMainLoop())
                yield delay(1)
                self._app.DoMainLoopBody()
        return inst

那么,在冗长的解释之后,有什么好办法吗?我可以定义我自己的MainLoop或者以某种方式改变它吗?或者有人曾与MyHDL和线程一起工作过?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-02 17:56:56

不过,我用app.ExitLoop()“解决”了它。

我意识到我可以将自己的循环包装在app.MainLoop()周围,每当我得到模拟器关心的事件时,处理程序调用app.ExitLoop(),将控制权交给模拟器,然后再次启动wx的主循环。

这并不完美,这绝对是一次黑客攻击,但它起作用了

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5164594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档