首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MyHDL中接收输入总线?

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

Stack Overflow用户
提问于 2018-11-30 18:31:57
回答 1查看 197关注 0票数 2

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

代码语言:javascript
复制
@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,我使用了另一个函数:

代码语言:javascript
复制
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的惊人函数来运行模拟,我能够通过使用输入和权重的信号列表,用以下代码正确地模拟一个简单的感知器:

代码语言:javascript
复制
@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中,块不能使用信号列表作为端口,并且根据this chapter,我应该将信号列表转换为ConcatSignal,我就是这样做的:

代码语言:javascript
复制
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赋值,并且如果我手动将Verilog文件中in_busw_busoutput更改为input,那么代码是可综合的。如果我看一下Vivado在这些更改之后的精心设计,这个模块似乎就是我想要的。

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

你知道我错过了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-03 10:41:15

您不能将list-of-signals用作顶级端口,您需要创建一个只有一个输入的包装器,创建您的list-of-signals,然后将其传递给泛型。

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

https://stackoverflow.com/questions/53555723

复制
相关文章

相似问题

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