2

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

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 位向量进行操作,每个向量都呈现一个浮点值。如果我想对浮点数的一维或二维数组进行操作,我应该首先自定义 FP 内核,然后使用 generate for 循环来创建一个二维数组吗?是否有一些很好的教程来学习如何对一维浮点数数组进行简单的加法?

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,哪一个是处理浮点密集型计算的更有效方法?

4

1 回答 1

2

(1) 您需要使用$realtobitsand$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 转换工具。您应该尝试理解代码并自行转换。

于 2013-07-31T08:21:21.543 回答