首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态实例化:如何在myHDL中动态连接接口

动态实例化:如何在myHDL中动态连接接口
EN

Stack Overflow用户
提问于 2016-06-28 17:58:15
回答 1查看 204关注 0票数 1

我正在尝试制作一个python库,以便使用pySerial使用myHDL 1.0dev动态地在PC和FPGA之间创建一个UART接口。

它获取数据类型及其属性的名称,并实例化RAM块,并允许访问PC上的读/写命令。然而,我遇到了动态连接RAMs的问题。

对于一个最小的工作示例,我有这两个类。

代码语言:javascript
复制
class RamBus(object):
    def __init__(self):
        self.clk     = Signal(bool(0))

class UartBus(object):
    def __init__(self):
        self.interfaces = dict()
    def add(self, name, bus):
        self.interfaces[name] = bus
        setattr(self,name,bus)

UartBus是用来容纳许多RamBuses的。现在,我将尝试将它们与arbiter块动态连接。

代码语言:javascript
复制
@block
def arbiter(clk,uartbus):
    modules = []
    for key in uartbus.interfaces:
        print key

        @block
        def electrician(rambus=uartbus.interfaces[key]):
            @always_comb
            def wiring():
                rambus.clk.next = clk
            return wiring
        f = electrician
        modules.append(electrician())
    return modules

如果使用此代码进行转换,则会得到不正确的转换。

代码语言:javascript
复制
uartbus = UartBus()

uartbus.add('power',RamBus())
uartbus.add('freq',RamBus())

#attempt conversion
clk = Signal(bool(0))
arbiter(clk,uartbus).convert()

这是不正确的verilog。

代码语言:javascript
复制
`timescale 1ns/10ps

module arbiter (
    clk
);


input clk;

wire electrician_0_rambus_clk;
wire electrician_0_rambus_clk;

assign electrician_0_rambus_clk = clk;
assign electrician_0_rambus_clk = clk;

endmodule

两根电线的名字都一样!在侧使用字典,@always_comb无法工作,因为到目前为止,任何版本的myHDL都不支持字典进行转换。如何正确地实现动态布线?

EN

回答 1

Stack Overflow用户

发布于 2016-06-28 18:04:07

所以我在写这篇文章的时候找到了答案,因为我认为知道这个问题是个有用的技巧,所以我决定无论如何把这个问题发出去。

代码语言:javascript
复制
@block
def arbiter(clk,uartbus):
    modules = []
    for key in uartbus.interfaces:

        #note that there is no @block here!
        def electrician(rambus=uartbus.interfaces[key]):
            @always_comb
            def wiring():
                rambus.clk.next = clk
            return wiring

        #here we can redefine the name that electrician 
        #has so that myHDL converts it with that name.
        electrician.func_name = key
        #then we apply the block decorator
        electrician = block(electrician)

        modules.append(electrician())
        print key

    return modules

这是正确的verilog。

代码语言:javascript
复制
// File: arbiter.v
// Generated by MyHDL 1.0dev
// Date: Tue Jun 28 14:03:01 2016

`timescale 1ns/10ps

module arbiter (
    clk
);


input clk;

wire freq_0_rambus_clk;
wire power_0_rambus_clk;

assign freq_0_rambus_clk = clk;
assign power_0_rambus_clk = clk;

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

https://stackoverflow.com/questions/38083166

复制
相关文章

相似问题

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