我有一个用于图像编解码器的纯 C 代码。我的目标是开发一个高效的 C 模型,该模型将使用 Verilog 或一些此类硬件描述语言在硬件中采用和实现。我想知道的是:
1.) 需要对现有 C 代码结构进行哪些修改以使其硬件高效
2.)是否需要修改数据结构。是否有任何与数组/缓冲区相关的约束(就像它们应该用存储类寄存器声明一样。
3.)我听说硬件模型不应该有条件或尽可能少。那是关于什么的?
(考虑使用一些 FPGA 的通用硬件实现,Verilog 没有关于总线、时钟等的详细信息。)
-广告
在 always 块中,“<=”(非阻塞)和“=”阻塞分配之间存在差异。阻塞分配就像您在软件中所拥有的一样,所有内容都是逐行评估的,这往往会综合为性能较低的优先级编码顺序逻辑。使用非阻塞语句,always 块中的所有赋值都会被同时评估,这往往会产生更多的并行结构。在将软件移植到硬件时,这可能是您最需要关注的部分。
在 RTL 友好的 Verilog 中,您可以使用组合逻辑(逻辑方程的连续分配)和内存分配(寄存器和锁存器)来保持一段时间内的状态。您编码为 RTL 的数据结构可能会在逻辑综合期间推断出寄存器和锁存器。在 Verilog 中正确编码时,您的数据结构可能会工作,但在微处理器上执行有意义的方法可能不是在硬件中构建它的最佳方式。再次取决于。
“if”可用于组合逻辑和内存逻辑(保持状态)“if”在编写为三元运算符时(Verilog 与 C 具有相同的语法)综合到多路复用器(mux)。“if”也可用于寄存器的逻辑描述中,以查看在始终阻止事件列表触发后复位引脚是否被置位(这只是一个示例)。小心“If”:当打算使用 always 块创建组合逻辑时(事件列表没有 posedge clk 或 negedge clk、posedge 复位、negedge 复位等),并将组合逻辑变量赋值为一个“if”语句,然后忘记“else”语句,在综合期间将推断出一个锁存器。“if”没有匹配的“else”语句
“reg”类型用于描述组合逻辑和内存逻辑;合成什么逻辑取决于总是阻塞事件列表和完整案例的存在。C 代码通常转换为 always 块中使用的样式。
“wire”类型用于连续分配(组合逻辑)。
ImpulseC是一个看起来很有趣的软件到硬件编译器。 HDL Coder是MATLAB / Simulink的配套产品,可自动生成您的硬件描述。
即使您使用这些软件工具为您创建硬件描述,您仍然想了解它们生成的内容。