我的vhdl代码有什么问题?
我为单独的wr/addr/addr内存编写了vhdl代码 i、 e写入地址和数据,然后读取地址及其数据 ,但在模拟中,它不是很好,我想知道为什么?? 谢谢你的帮助我的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
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本身看起来应该可以正常工作。有单独的读写端口而没有独立的功能似乎有点奇怪。有什么是你所不期望的?