我的vhdl代码有什么问题?

我的vhdl代码有什么问题?,vhdl,Vhdl,我为单独的wr/addr/addr内存编写了vhdl代码 i、 e写入地址和数据,然后读取地址及其数据 ,但在模拟中,它不是很好,我想知道为什么?? 谢谢你的帮助 library ieee; use ieee.std_logic_1164.all; entity wr_rd_ram is port( clk : in std_logic; we : in std_logic; wr_data : in std_logic_vector(7 d

我为单独的wr/addr/addr内存编写了vhdl代码 i、 e写入地址和数据,然后读取地址及其数据 ,但在模拟中,它不是很好,我想知道为什么?? 谢谢你的帮助

library ieee;
use ieee.std_logic_1164.all;
entity wr_rd_ram is
port(
    clk      : in  std_logic;
    we       : in  std_logic;
    wr_data  : in  std_logic_vector(7 downto 0);
    wr_addr  : in  integer range 0 to 255;
    rd_addr  : in  integer range 0 to 255; 
    rd_data  : out std_logic_vector(7 downto 0)
     );
   end entity;
  architecture rtl of wr_rd_ram is
 type mem is array(255 downto 0) of std_logic_vector(7 downto 0);
 signal ram : mem;
   begin
     process(clk)
  begin
      if(rising_edge(clk)) then
      if(we = '1') then
      ram(wr_addr) <= wr_data;
   end if;
  if (we= '0') then
    rd_data <= ram(rd_addr);
  end if;
 end if;
 end process;
 end  rtl ;
ieee库;
使用ieee.std_logic_1164.all;
实体wr_rd_ram是
港口(
clk:标准逻辑中;
我们:在标准逻辑中;
wr_数据:标准_逻辑_向量(7到0);
wr_addr:在0到255的整数范围内;
rd_addr:在0到255的整数范围内;
rd_数据:输出标准逻辑_向量(7到0)
);
终端实体;
wr_rd_ram的体系结构rtl是
mem型是std_逻辑_向量(7到0)的数组(255到0);
信号ram:mem;
开始
过程(clk)
开始
如果(上升沿(clk)),则
如果(we='1'),那么

ram(wr_addr)编写一个简单的测试台:

library ieee;
use ieee.std_logic_1164.all;

entity tb_ram is
end entity;

architecture foo of tb_ram is
    signal clk:     std_logic := '0';
    signal we:      std_logic := '0';
    signal wr_data: std_logic_vector (7 downto 0):= x"42";
    signal wr_addr: integer range 0 to 255 := 0;
    signal rd_addr: integer range 0 to 255 := 0;
    signal rd_data: std_logic_vector ( 7 downto 0);
begin

CLOCK:
    process
    begin 
    wait for 10 ns;
    clk <= not clk;
    if Now > 130 ns then
        wait;
    end if;
    end process;

DUT:
    entity work.wr_rd_ram
        port map (
            clk => clk,
            we => we,
            wr_data => wr_data,
            wr_addr => wr_addr,
            rd_addr => rd_addr,
            rd_data => rd_data
        );

STIMULUS:
    process
    begin
        wait for 20 ns;
        we <= '1';
        wr_data <= x"de";
        wait for 20 ns;
        we <= '0';
        wait for 20 ns;
        wr_addr <= 1;
        wr_data <= x"ad";
        we <= '1';
        wait for 20 ns;
        we <= '0';
        wait for 20 ns;
        rd_addr <= 1;
        wait for 20 ns;
        wait;

    end process

end architecture;
ieee库;
使用ieee.std_logic_1164.all;
实体tb_ram是
终端实体;
tb_ram的体系结构是
信号时钟:标准逻辑:='0';
信号we:std_逻辑:='0';
信号wr_数据:标准逻辑向量(7到0):=x“42”;
信号wr_addr:整数范围0至255:=0;
信号rd_addr:整数范围0到255:=0;
信号rd_数据:标准逻辑_向量(7到0);
开始
时钟:
过程
开始
等待10纳秒;
时钟130纳秒
等待
如果结束;
结束过程;
DUT:
实体工作.wr_rd_ram
港口地图(
时钟=>clk,
我们=>我们,
wr_数据=>wr_数据,
wr_addr=>wr_addr,
rd_addr=>rd_addr,
rd_数据=>rd_数据
);
刺激:
过程
开始
等待20纳秒;

我们此设计仅起作用,但当我将其用于另一个顶级设计时,它似乎在合成中起作用,而在模拟中,它没有模拟所有输入数据,即当我使用“全部运行”模拟所有结果时,它会重复 我使用ise 9.2i程序 设计的目的是给我数据输入之间的距离

data1,data2( (1, 2, 3, 4, 5), (5, 4, 3, 2, 1) ); distances  --> (4, 2, 0, 2, 4)
data1,data2( (1, 2, 3, 4), (4, 3, 2, 1) );           distances --> (3, 1, 1, 3)
data1,data2( (1, 2, 3), (1, 2, 3) );                   distances  --> (0, 0, 0)
最高设计水平是

library ieee;
use ieee.std_logic_1164.all;

entity test is
  port(
    rst      : in  std_logic;
    clk      : in  std_logic;
    we       : in  std_logic;
    wr_data1 : in  std_logic_vector(7 downto 0);
    wr_data2 : in  std_logic_vector(7 downto 0);
    wr_addr  : in  integer range 0 to 255;
    distance : out integer range 0 to 255;
    vout     : out std_logic;
    no_match : out std_logic
     );
   end entity;

   architecture rtl of test is

   signal rd_data1 : std_logic_vector(7 downto 0);
  signal rd_data2 : std_logic_vector(7 downto 0);
  signal rd_addr1 : integer range 0 to 255 := 0;
      signal rd_addr2 : integer range 0 to 255 := 0;
      signal d        : integer range 0 to 255 := 0;
       type states is (s0,s1,s2);
       signal state: states;

        component wr_rd_ram
      port(
    clk      : in  std_logic;
    we       : in  std_logic;
    wr_data  : in  std_logic_vector(7 downto 0);
    wr_addr  : in  integer range 0 to 255;
    rd_addr  : in  integer range 0 to 255; 
    rd_data  : out std_logic_vector(7 downto 0)
     );
       end component;

    begin

     ram1:entity work.wr_rd_ram
           port map(
    clk      => clk,
    we       => we,
    wr_data  => wr_data1,
    wr_addr  => wr_addr,
    rd_addr  => rd_addr1, 
    rd_data  => rd_data1
     );

 ram2:entity work.wr_rd_ram
  port map(
    clk      => clk,
    we       => we,
    wr_data  => wr_data2,
    wr_addr  => wr_addr,
    rd_addr  => rd_addr2, 
    rd_data  => rd_data2
     );
  process(rst,clk)
    begin
     if rst = '1' then 

rd_addr1 <= 0;
rd_addr2 <= 0;

state <= s0;
vout <= '0';
no_match <= '0';
distance <= 0;
  elsif rising_edge(clk) then
      if we  = '0' then
        vout <= '0';
       no_match <= '0';
      state <= s2;
        case state is
  when s0 =>
    rd_addr2 <= rd_addr2 + 1;
    if rd_data1 = rd_data2 then
       vout <= '1';
       d <= abs (rd_addr1-rd_addr2);

          state <= s1;
    elsif rd_addr2 = 255 then
       rd_addr2 <= 0;
       state <= s2;
    end if;

  when s1 =>
    rd_addr1 <= rd_addr1 + 1;

    rd_addr2 <= 0;
    state <= s0;

  when s2 =>
     no_match <= '1';
     state <= s0;

  when others => null;

 end case;
 end if;
 end if;
 distance <= d;
 end process;

   end rtl;
ieee库;
使用ieee.std_logic_1164.all;
实体测试是
港口(
rst:标准逻辑中;
clk:标准逻辑中;
我们:在标准逻辑中;
wr_数据1:标准逻辑_向量(7到0);
wr_数据2:标准逻辑_向量(7到0);
wr_addr:在0到255的整数范围内;
距离:超出0到255的整数范围;
输出:输出标准逻辑;
不匹配:输出标准逻辑
);
终端实体;
测试的体系结构rtl是
信号rd_数据1:std_逻辑_向量(7到0);
信号rd_数据2:std_逻辑_向量(7到0);
信号rd_addr1:整数范围0至255:=0;
信号rd_addr2:整数范围0至255:=0;
信号d:整数范围0到255:=0;
类型状态为(s0、s1、s2);
信号状态:状态;
组件wr_rd_ram
港口(
clk:标准逻辑中;
我们:在标准逻辑中;
wr_数据:标准_逻辑_向量(7到0);
wr_addr:在0到255的整数范围内;
rd_addr:在0到255的整数范围内;
rd_数据:输出标准逻辑_向量(7到0)
);
端部元件;
开始
ram1:entity work.wr_rd_ram
港口地图(
时钟=>clk,
我们=>我们,
wr_数据=>wr_数据1,
wr_addr=>wr_addr,
rd_addr=>rd_addr1,
rd_数据=>rd_数据1
);
ram2:entity work.wr_rd_ram
港口地图(
时钟=>clk,
我们=>我们,
wr_数据=>wr_数据2,
wr_addr=>wr_addr,
rd_addr=>rd_addr2,
rd_数据=>rd_数据2
);
过程(rst、clk)
开始
如果rst='1',则

rd_addr1 wr_rd_ram本身看起来应该可以正常工作。有单独的读写端口而没有独立的功能似乎有点奇怪。有什么是你所不期望的?