- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习 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_bus
和w_bus
感知器的输入在 Verilog 中定义为 output
端口而不是 input
端口。由于这个 2 wires
对于这些端口,也会生成它们,并为其分配值 None
.
有趣的是,Verilog 代码的其余部分是正确的,如果我简单地删除生成的 wires
和None
分配,如果我手动更改 output
至input
对于in_bus
和w_bus
在 Verilog 文件中,代码是可综合的。如果我看看 Vivado 在这些更改之后的详细设计,该模块似乎正是我想要的。
虽然我可以在 Verilog 文件中手动修复这个问题,但我觉得这个问题来自于我对 MyHDL 的错误使用/缺乏理解。我不明白为什么使用 ConcatSignal
突然变成了input
端口进入output
端口。
知道我在这里缺少什么吗?
最佳答案
您不能使用信号列表作为顶级端口,您将需要创建一个具有单个输入的包装器,创建信号列表,然后将其传递给泛型。
关于python - 如何在 MyHDL 中接收输入总线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53555723/
目录 总线是什么? 常见总线类型有哪些? 总线的串行和并行的区别? 数据总线 地址总线
从下面的代码我在 map 上添加标记,每 15 秒刷新一次并从数据库中获取新的纬度和经度。标记(巴士图像)已成功添加到 map 上并从一个位置平稳移动到另一个位置,就像汽车在路上行驶一样。现在我想要的
如果在小端处理器上运行的程序将未缓存的值 0xaabbccdd 写入地址 0,并且处理器使用 32 位宽的 AXI4 总线,那么 WDATA 的第 31-24 位是 0xaa 还是 0xdd? AXI
是否存在用于将进程内服务消息传递给另一个服务的扭曲机制?我写了一个原型(prototype)总线,看起来像 from collections import defaultdict ch
我修改了设备树文件并使用 4 个 GPIO 引脚启用了 spi,这些引脚支持 pinmux 并从 gpio 切换到 spi 功能。但是在 Linux 内核代码中,代码如何知道使用了哪个 spi 总线/
我正在使用控创嵌入式计算机通过 I2C 与 ST 微 Controller 通信。我正在使用开发适配器与 I2C 接口(interface),使用描述的简单 read() 和 write() 函数 h
我有一个需要 PEC 的 I2C/SMBus 设备我正在为它编写一个内核空间驱动程序。 在 Linux 2.6.37 上我使用 i2c_board_info实例化客户端并在那里设置标志,但现在驱动程序
我想确认我的消息已经通过 socketCAN 库保存在 CAN 总线上。socketCAN 文档描述了使用 recvmsg() 函数时的这种可能性,我对其实现有疑问。 我要实现的功能是确认我的消息在仲
下面是我的代码 #import #import int main(int argc, const char *argv[]) { char *str = "First string";
在大量使用 D-Bus 的应用程序中获得更好的时间性能有哪些好的做法? ? 以下是我们的团队通过硬敲学校学到的一些知识: 尝试将数据实体组合成一个单一的大型结构/对象,以通过 D-Bus IPC 发送
我正在Akka内核下运行Akka应用程序,该程序在其他系统上也可以正常工作。 akka { loggers = ["akka.event.slf4j.Slf4jLogger"] log
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我是 C 语言新手,对于家庭作业考试,我必须实现一个简单的服务器套接字程序,该程序在循环中发送一些数据,并且如果客户端连接到服务器套接字(已使用 Arduino 完成,但需要相同的功能)在 raspb
我正在构建一个由许多(> 100)个相同节点组成的系统,所有节点均通过 CAN 总线连接。这个想法是所有节点必须具有相同的信息,任何节点都可以生成事件并通过 CAN 广播它。对于这些事件,CAN 帧提
您好,我在解析 IIB Toolkit 中的任何 JSON 时遇到问题。 java计算节点抛出的异常为:java.lang.NoClassDefFoundError: org.json.JSONObj
我买了这个传感器: http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Sensors/Weather/RHT03.pdf 输出为“MaxDetect 1-w
我正在用户空间编写包装器 API,用于在嵌入式 Linux 平台上用 C 语言控制 I2C 总线。我能够使用 read() 和 write() 方法以及 ioctl() 调用来选择从属设备,从而从传感
在我的软件(用 C++ 编写)中,我使用 Linux 标准函数打开 CAN 总线套接字并执行 I/O 操作。 套接字的打开和使用如下: /* Create the socket */ if ((
每天——大约 5 到 10 次——我的 USB 摄像头从系统中消失。它从第一天开始就发生了,因为制造商驱动程序与 Linux 不兼容。 lsusb 和 dmesg 一开始正确显示,但在较长时间后有时会
我分发了包含多个 Go 服务的应用程序。其中一些使用 Kafka 作为数据总线。我能够使用 Jaeger 的 opentracing 追踪服务之间的调用。我在图表上绘制 Kafka 跨度时遇到问题,它
我是一名优秀的程序员,十分优秀!