我正在尝试制作一个python库,以便使用pySerial使用myHDL 1.0dev动态地在PC和FPGA之间创建一个UART接口。
它获取数据类型及其属性的名称,并实例化RAM块,并允许访问PC上的读/写命令。然而,我遇到了动态连接RAMs的问题。
对于一个最小的工作示例,我有这两个类。
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块动态连接。
@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都不支持字典进行转换。如何正确地实现动态布线?
发布于 2016-06-28 18:04:07
所以我在写这篇文章的时候找到了答案,因为我认为知道这个问题是个有用的技巧,所以我决定无论如何把这个问题发出去。
@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;
endmodulehttps://stackoverflow.com/questions/38083166
复制相似问题