【问题标题】:Using Fixed point in VHDL在 VHDL 中使用定点
【发布时间】:2015-12-18 06:01:07
【问题描述】:

在我的滤波器设计中,我使用定点算术并将 sfixed 用于信号。设计在满足所有时序的情况下进行综合,但我的功能仿真和后合成器/P&R 仿真在 arith 逻辑块之后不匹配。下面给出一个小例子,我看到 crf_int_r 在后合成器仿真中不匹配。有人可以帮我吗了解,无论是合成不正确还是功能和后合成仿真之间不匹配的其他问题..在 ISE 中使用 Xilinx ISE 14.7 和 VHDL 200X 选项。

signal add_alpha1_r : sfixed(5 downto -13) ;
signal add_alpha2_r : sfixed(6 downto -13) ;
signal crf_r : sfixed(17 downto -13) ;
signal crf_int_r : sfixed(17 downto -7) ; 
signal alpha_log : sfixed(4 downto -13) ;
signal imgdel_r_d4 : sfixed(4 downto -13) ;
signal imgsum_d2 : sfixed(4 downto -13) ; 

  add_alpha1_r <= imgdel_r_d4 - imgsum_d2  ; --19.13   
  add_alpha2_r <= alpha_log + add_alpha1_r  ; -- 20.13  
  crf_r      <= add_alpha2_r * beta ; -- 31.13   
  crf_int_r    <= crf_r(17 downto -7);

【问题讨论】:

  • 声明、合成前和合成后操作数和结果二进制值会很好。你在使用非默认包泛型吗?
  • 我使用的是 ieee 定点 pkg。使用 ieee_proposed.fixed_float_types.all;
  • 在 post synth netlist 中,生成一些信号,声明为 std_logic_vector(5 downto -3)。此类信号会在 VCOM 中产生错误。我正在根据来自 xilinx 的信息将此类信号更改为 std_logic_vector1 类型。但我仍然得到一个不匹配,虽然我看到乘数已经被推断出来..
  • 谁是模拟器?我问的原因是 cfr_r 分配 get 的绑定检查失败与 -2008 实例化包 ieee.fixed_generic_pkg。请在您的问题中添加新信息。您错过了 beta 声明,我将其设置为与 add_alpha2_r 相同。二进制操作数和结果值?
  • 你需要写一个正确的问题。显示包含所有声明的代码,提供一组输入和相应的输出,并告诉我们输出与您的预期输出有何不同。如果输出在功能模拟中是正确的,而在 P&R 后的输出中是不正确的,那么请告诉我们确切的区别是什么。 “转换为整数并与 Matlab 比较”和“all -ve”对任何人都没有用。

标签: vhdl fpga xilinx


【解决方案1】:

您遇到了合成错误。从 cmets 中提供的代码制作Minimal, Complete, and Verifiable example,我尝试将其与 ISE 14.7 和 VHDL-200X 选项合成:

library ieee;
use ieee.std_logic_1164.all;
library ieee_proposed;
use ieee_proposed.fixed_pkg.all;

entity sfixed_test is
  port (alpha_log : out sfixed(4 downto -13));
end sfixed_test;

architecture rtl of sfixed_test is
  constant alpha : sfixed(10 downto 0) := "00001111000"; -- 120
  type rom_t is array(0 to 2047) of sfixed(4 downto -13);
  constant alpha_rom : rom_t := (120 => "111111111111111111",
                                 others => "000000000000000000");
begin  -- rtl
  alpha_log <= alpha_rom(to_integer(alpha));
end rtl;

XST 报告以下警告:

警告:“::fixed_pkg:TO_INTEGER(固定):检测到元值,返回 0”

快速查看 RTL 或 Technology Map Viewer 会发现,所有输出都连接到地,而不是我的示例中预期的 VCC。

问题在于to_integer 的实现,如下所述。如果您将 ROM 中的读数更改为:

alpha_log <= alpha_rom(to_integer(unsigned(std_logic_vector(alpha))));

还包括包ieee.numeric_std。然后一切正常。

进一步说明:警告消息指的是第 5085 行 ff。 ieee_proposed/fixed_pkg_c.vhd 随 ISE 一起提供。上面写着:

if (Is_X (arg)) then
  assert NO_WARNING
    report fixed_pkg'instance_name
    & "TO_INTEGER (sfixed): metavalue detected, returning 0"
    severity warning;
  return 0;
end if;

Is_X(arg) 检查参数是否包含UXZW-。如果arg(即alpha)是一个常数,它会在这里失败。但是,当alpha 是信号(输入)时,它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多