gpt4 book ai didi

python - 如何在 MyHDL 中接收输入总线?

转载 作者:行者123 更新时间:2023-12-01 08:39:59 25 4
gpt4 key购买 nike

我正在尝试学习 MyHDL,为此我尝试创建一个非常简单的人工神经元,稍后可以在简单的人工神经网络中使用它。首先,我设计了一个只能处理单个输入和权重信号并返回输出信号的人工神经元。

@block
def input_perceptron(clk, max_res, in_signal, w_signal, out_signal):
'''a hidden layer neuron
out_signal is the result of: transfer_function( input_i x weight_i )
'''
@always(clk.posedge)
def logic():
# Multiply inputs and scale down with the shift
weighted_signal = (in_signal * w_signal) >> max_res+1
# Perform desired transfer function
tf_result = rect_transfer_func( weighted_signal, max_res )
# Assign new result
out_signal.next = tf_result
# The perceptron block must return this - MyHDL syntax
return instances()

为了将其转换为 Verilog,我使用了另一个函数:

def converter(max_res=16, hdl='Verilog'):
# Initialize Signals
max_val = 1 << max_res + 1
clk = Signal( bool(0) )
in_signal = Signal( intbv( randrange(max_val), min=0, max=max_val ) )
w_signal = Signal( intbv( randrange(max_val), min=0, max=max_val ) )
out_signal = Signal( intbv( 0, min=0, max=max_val ) )
# Instantiate component
perceptron_inst = input_perceptron(clk, max_res, in_signal, w_signal, out_signal)
# Convert component to desired HDL language
perceptron_inst.convert(hdl=hdl)

到目前为止一切都很顺利。模拟不仅向我展示了我的预期,而且转换后的代码是正确的,我能够在 Vivado 中综合它。然而,在神经网络中,隐藏层和输出层神经元必须能够处理来自多个源的信息,即信号列表或总线,这就是我遇到麻烦的地方。

通过使用 MyHDL 和 Python 的惊人函数来运行模拟,我能够通过使用输入和权重的信号列表,使用以下代码正确模拟一个简单的感知器:

@block
def perceptron(clk, max_val, max_res, in_bus, w_bus, out_signal):
''' Perceptron
out_signal is the result of: transfer_function( sum( input_i x weight_i ) )
'''
@always(clk.posedge)
def logic():
# Multiply inputs and scale down
sum_weighted_inputs = 0
for i in range(len(in_bus)):
weighted_input = in_bus[i] * w_bus[i] >> max_res+1
sum_weighted_inputs += weighted_input
# Perform desired transfer function
tf = step_transfer_func(sum_weighted_inputs, max_res, max_val)
# Assign new result to ouput port
out_signal.next = tf
return instances()

浏览完文档( docs )后,我了解到在 MyHDL 中, block 不能使用信号列表作为端口,并且根据 this chapter我应该将我的信号列表转换为 ConcatSignal,我这样做是这样的:

def converter(max_res, num_inputs, hdl='Verilog'):
# Clock parameters
clk = Signal( bool(0) )
# Signal parameters: inputs, weights and outputs
max_val = 1 << max_res + 1
out_signal = Signal( intbv( 0, min=0, max=max_val )[max_res+1:] )
in_list = [Signal( intbv( randrange(max_val), min=0, max=max_val )[max_res+1:] ) for i in range(num_inputs)]
w_list = [Signal( intbv( randrange(max_val), min=0, max=max_val )[max_res+1:] ) for i in range(num_inputs)]
# Converting to a bus in HDL
input_bus = ConcatSignal(*reversed(in_list))
weight_bus = ConcatSignal(*reversed(w_list))
# Instantiate component
perceptron_inst = perceptron(clk, max_val, max_res, input_bus, weight_bus, out_signal)
# Convert component to desired HDL language
perceptron_inst.convert(hdl=hdl)

当我尝试模拟设计时,一切都按预期工作,但是在转换时出现一个小错误:in_busw_bus感知器的输入在 Verilog 中定义为 output端口而不是 input端口。由于这个 2 wires对于这些端口,也会生成它们,并为其分配值 None .

有趣的是,Verilog 代码的其余部分是正确的,如果我简单地删除生成的 wiresNone分配,如果我手动更改 outputinput对于in_busw_bus在 Verilog 文件中,代码是可综合的。如果我看看 Vivado 在这些更改之后的详细设计,该模块似乎正是我想要的。

虽然我可以在 Verilog 文件中手动修复这个问题,但我觉得这个问题来自于我对 MyHDL 的错误使用/缺乏理解。我不明白为什么使用 ConcatSignal突然变成了input端口进入output端口。

知道我在这里缺少什么吗?

最佳答案

您不能使用信号列表作为顶级端口,您将需要创建一个具有单个输入的包装器,创建信号列表,然后将其传递给泛型。

关于python - 如何在 MyHDL 中接收输入总线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53555723/

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