过去两天我一直在解决这个问题。我希望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' then
和if memory(to_integer(unsigned(something_to_convert)))(5) = '1' then
。当我在Nexys 3卡上运行时;然而,它们会产生不同的结果。
我在这里做错了什么?
答案 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;