|
本帖最后由 芝麻饭团 于 2012-3-19 22:17 编辑
小弟最近正在学习FPGA编程,按照自己想法写了一个VHDL的双口ram程序,代码如下,两个process是一样的,各负责一个接口。但是仿真出现一个很奇怪的问题。就是在a口地址10写入数据15,则a口和b口回读地址10都可以得到数据15。但是b口在地址10写入数据(图中为数据11),然后a口和b口在地址10处读到的都是无效数据。
另外,如果去掉a口的process,那么b口可以正常读写。我猜是有什么冲突了,但不知原因为何,求指教!- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
- use IEEE.STD_LOGIC_UNSIGNED.ALL;
- use IEEE.NUMERIC_STD.all;
- --use ieee.std_logic_arith.all;
- use work.pcs_package.all;
- entity ram is
- port(
- --dual port asynchrous ram
- addr_a,addr_b: in std_logic_vector(6 downto 0);
- data_a,data_b: inout std_logic_vector(15 downto 0);
- we_a,we_b: in std_logic;
- oe_a,oe_b: in std_logic;
- cs_a,cs_b: in std_logic
- );
- end entity ram;
- architecture rtl of ram is
- TYPE ramblock IS ARRAY (0 to 99) OF std_logic_vector (n-1 downto 0);
- SIGNAL memory :ramblock;
- BEGIN
- -----dual ram on a side
- PROCESS(we_a,oe_a,cs_a)
- BEGIN
- IF cs_a='1' THEN
- data_a<="ZZZZZZZZZZZZZZZZ";
- ELSE
- IF we_a='0' THEN
- memory(to_integer(UNSIGNED(addr_a)))<=data_a; --WRITE
- END iF;
- IF we_a='1' AND oe_a='0' THEN
- data_a<=memory(to_integer(UNSIGNED(addr_a))); --READ
- ELSE
- data_a<="ZZZZZZZZZZZZZZZZ"; --OUTPUT DISABLED
- END iF;
- END IF;
- END PROCESS;
- -----dual ram on b side
- PROCESS(we_b,oe_b,cs_b)
- BEGIN
- IF cs_b='1' THEN
- data_b<="ZZZZZZZZZZZZZZZZ";
- ELSE
- IF we_b='0' THEN
- memory(to_integer(UNSIGNED(addr_b)))<=data_b; --WRITE
- end if;
- IF we_b='1' AND oe_b='0' THEN
- data_b<=memory(to_integer(UNSIGNED(addr_b))); --READ
- ELSE
- data_b<="ZZZZZZZZZZZZZZZZ"; --OUTPUT DISABLED
- END iF;
- END IF;
- END PROCESS;
-
- END rtl;
-
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册
x
|