在Synthesizable Verilog中将1D或2D浮点数组定义为输入端口

时间:2013-07-31 02:13:29

标签: verilog fpga xilinx

我想定义一些浮点的输入和输出端口,所以我选择了真实的数据类型,但是根据我的搜索,我们不能将实际值作为输入端口传递,并且可用的转换不可合成。

input real [0:10] delta; 
parameter ndelta= 100;
input real [0:10] ly;
input real [0:10] nly;
output real [0:20] w[0:20];
output real [0:20] oldw[0:20];

*所有实际值都是C代码中的原始“浮动”值。

此外,我决定在ISE的CoreGenerator中使用浮点IP,但它只对两个32位向量进行操作,每个向量都呈现一个浮点值。如果我想对浮点数的1D或2D数组进行操作,我应该首先自定义FP核心,然后使用generate for循环创建说2D数组吗?是否有一些很好的教程可以学习如何在浮点数的一维数组上进行简单的加法?

generate
for(i=0; (i<100); i=i+1) begin: FPU_unit
    begin
        floating_point_v5_0 U_FPU_ins(
        .a(a[i]),
        .b(b[i]),
        .clk(clk),
        .result(result[i])
        );
    end
endgenerate

另外,当我将C代码转换为HDL级别时,我想知道是否有人建议我使用Vivado HLS将我的部分C代码转换为HDL语言。

比较Vivado HLS和ISE哪一个是处理浮点密集型计算的更有效方法?

1 个答案:

答案 0 :(得分:2)

(1)您需要使用$realtobits$bitstoreal在端口之间传递实际值。获取LRM - 您可以在网上找到草稿版本;提取下面。

“12.3.7端口连接中的实数

真实数据类型不应直接连接到端口。它应间接连接,如下例所示。系统函数$ realtobits和$ bitstoreal应用于跨模块端口传递位模式。 (有关这些系统任务的说明,请参见17.8。)“

module driver (net_r);
  output net_r;
  real r;
  wire [64:1] net_r = $realtobits(r);
endmodule
module receiver (net_r);
  input net_r;
  wire [64:1] net_r;
  real r;
  initial assign r = $bitstoreal(net_r);
endmodule

(2)使用生成。您所做的只是创建n模块,每个模块的端口连接到阵列中的不同元素;你过度复杂了。例如,尝试使用AND门数组的示例。你原则上可以使用较旧的“实例数组”形式,但我不会这样做。

(3)我不打算使用C转换工具。您应该尝试理解代码并自行转换。