VHDL:将std_logic_vector转换为整数(在模拟中工作,而不是练习)

时间:2015-04-29 08:48:41

标签: vhdl fpga

过去两天我一直在解决这个问题。我希望data_out发送" 111"在这种情况下,看看整个记忆是如何填充' 1'。我将展示代码,然后使问题更加精确:

entity tile_library is
  Port (
    data_out : out std_logic_vector(2 downto 0);
    data_in : in std_logic_vector(5 downto 0);
    clk : in std_logic);

end tile_library;

architecture Behavioral of tile_library is

type memory_type is array (0 to 63) of std_logic_vector(255 downto 0);
signal memory : memory_type := (others=> (others=>'1'));
signal something_to_convert : std_logic_vector(5 downto 0) := "000000";


begin
  process(clk) begin
  if rising_edge(clk) then
    if memory(to_integer(unsigned(data_in)))(5) = '1' then
      data_out <= "111";
    else
      data_out <= "000";
    end if;

  end if;
end process;


end Behavioral;

如果我更换

    if memory(to_integer(unsigned(data_in)))(5) = '1' then

    if memory(to_integer(unsigned(something_to_convert)))(5) = '1' then

我得到&#34; 111&#34;作为我的nexys 3卡上的输出。

这让我相信data_in不应该是它应该是什么。

因此,我向您展示了在我的测试中将data_in产生到tile_library的代码:

entity tile_memory is
  Port (
    data_out : out std_logic_vector(5 downto 0);
    clk : in std_logic);

end tile_memory;

architecture Behavioral of tile_memory is

begin
  process(clk)
  begin
   if rising_edge(clk) then
     data_out <= "000000";

   end if;
  end process;

end Behavioral;

为了进一步混淆,我可以根据模拟添加,我得到完全相同的输入和输出信号(也是正确的信号,&#34; 111&#34;) if memory(to_integer(unsigned(data_in)))(5) = '1' thenif memory(to_integer(unsigned(something_to_convert)))(5) = '1' then。当我在Nexys 3卡上运行时;然而,它们会产生不同的结果。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

没有错
signal memory : memory_type := (others=> (others=>'1'));

在Xilinx软件中,它始终适用于我。

我建议使用chipcope并在你想要查看的信号上放置一个keep / mark_debug属性,因为正如其他人指出的那样,它会被优化掉。但这并不意味着你应该得到错误的结果。

data_out应为&#34; 000&#34; (由于Xilinx合成假设)对于第一个时钟周期然后&#34; 111&#34;连续的时钟周期。

如果综合充满了我的猜测,我认为它并不像ram操作那样是if语句的一部分(我以前从未见过它)。尝试将其从if语句中取出(如下所示)。这不应该是必需的,但在识别内存/乘法器等时,XST可能相当敏感。

您还可以查看后合成原理图/模拟,但我建议首先使用chipcope。

entity tile_library is
  Port (
    data_out : out std_logic_vector(2 downto 0);
    data_in : in std_logic_vector(5 downto 0);
    clk : in std_logic);

end tile_library;

architecture Behavioral of tile_library is

type memory_type is array (0 to 63) of std_logic_vector(255 downto 0);
signal memory : memory_type := (others=> (others=>'1'));
signal something_to_convert : std_logic_vector(5 downto 0) := "000000";
signal memory_read_data : std_logic_vector(255 downto 0);

begin
  memory_read_data <= memory(to_integer(unsigned(data_in)));
  process(clk) begin
  if rising_edge(clk) then
    if memory_read_data(5) = '1' then
      data_out <= "111";
    else
      data_out <= "000";
    end if;

  end if;
end process;


end Behavioral;