在VHDL中使用固定点

时间:2015-12-18 06:01:07

标签: vhdl fpga xilinx

在我的滤镜设计中,我使用定点算法并使用sfixed作为信号。该设计综合了所有时序,但我的功能模拟和后合成器/ P& R模拟在arith逻辑块之后不匹配。给一个小的ex下面,我看到crf_int_r在Post合成器模拟中不匹配..可以有人帮助我理解,它是否未正确合成或其他问题导致功能和后合成器模拟不匹配。在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);

1 个答案:

答案 0 :(得分:1)

您遇到了综合错误。从评论中提供的代码中创建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报告以下警告:

  

警告:&#34; :: fixed_pkg:TO_INTEGER(sfixed):检测到元数据,返回0&#34;

快速浏览RTL或技术地图查看器,显示所有输出都连接到地面而不是VCC,如我的示例所示。

问题是bewlow描述的to_integer的实现。如果您将ROM中的读数更改为:

,则可以解决此问题
alpha_log <= alpha_rom(to_integer(unsigned(std_logic_vector(alpha))));

并且还包括包ieee.numeric_std。一切正常。

进一步说明:警告信息指的是5085行ff。 ISE附带的ieee_proposed/fixed_pkg_c.vhd。它写着:

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-。如果argalpha)是常量,则此处失败。但是,当alpha是信号(输入)时,它可以工作。