gpt4 book ai didi

python - 动态实例化: How to dynamically wire interfaces in myHDL

转载 作者:行者123 更新时间:2023-12-01 03:52:00 26 4
gpt4 key购买 nike

我正在尝试创建一个Python库,用于使用myHDL 1.0dev使用pySerial在PC和FPGA之间动态创建UART接口(interface)

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

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

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用于容纳许多RamBus。现在我将尝试将它们与 arbiter block 动态连接。

@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

如果我使用此代码进行转换,则会得到错误的转换

uartbus = UartBus()

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

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

这是错误的 verilog。

`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 都不支持字典进行转换。如何正确实现动态连线?

最佳答案

所以我在写这篇文章时找到了答案,并且因为我认为这是一个有用的技巧,所以我决定无论如何都要发布这个问题。

@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。

// 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

关于python - 动态实例化: How to dynamically wire interfaces in myHDL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38083166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com