我正在为 FPGA 和 ASIC 开发通用图像处理核心。这个想法是将标准处理器与它连接起来。我遇到的问题之一是如何“编程”它。让我解释一下:核心有一个用于我的“自定义”扩展的指令解码器。例如:
vector_addition $vector[0], $vector[1], $vector[2] // (i.e. v2 = v0+v1)
还有更多类似的。该操作由处理器通过总线发送到内核,使用处理器进行循环、非向量操作等,如下所示:
for (i=0; i<15;i++) // to be executed in the processor
vector_add(v0, v1, v2) // to be executed in my custom core
程序是用 C/C++ 编写的。核心只需要指令本身,机器码
- 操作码 = vector_add = 0x12h
- register_src_1 = v0 = 0x00h
- register_src_2 = v1 = 0x01h
register_dst = v2 = 0x02h
机器码 = opcore | v0 | v1 | v2 = 0x7606E600h
(或其他任何东西,只是不同字段的连接以构建二进制指令)
一旦通过总线将其发送到内核,内核就能够使用专用总线从内存中请求所有数据,并在不使用处理器的情况下处理所有事情。最大的问题是:我怎样才能将前面的指令翻译成它的十六进制表示?(通过公共汽车发送不是问题)。想到的一些选择是
- 运行解释代码(在处理器中运行时转换为机器代码)-> 非常慢,即使使用某种内联宏
- 使用外部自定义编译器编译自定义部分,从外部存储器加载二进制文件并使用一些独特的指令将其移动到核心 --> 难以阅读/理解源代码,SDK 集成不佳,如果代码非常分段,则部分过多
- JIT 编译 --> 就为了这个复杂?
- 扩展编译器 --> 一场噩梦!
- 一个连接到自定义核心的自定义处理器来处理所有事情:循环、指针、内存分配、变量... --> 工作量太大
问题是关于软件/编译器的,但对于那些对该主题有深入了解的人来说,这是 FPGA 中的 SoC,主处理器是 MicroBlaze,IP 核采用 AXI4 总线。
我希望我解释正确......提前谢谢!