集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2557|回复: 1

请教VHDL写双口ram的问题(附完整代码和时序图)

[复制链接]
芝麻饭团 发表于 2012-3-19 22:15:18 | 显示全部楼层 |阅读模式
本帖最后由 芝麻饭团 于 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口可以正常读写。我猜是有什么冲突了,但不知原因为何,求指教!
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  4. use IEEE.NUMERIC_STD.all;  
  5. --use ieee.std_logic_arith.all;
  6. use work.pcs_package.all;

  7. entity ram is
  8.     port(
  9.                 --dual port asynchrous ram
  10.         addr_a,addr_b: in std_logic_vector(6 downto 0);
  11.         data_a,data_b: inout std_logic_vector(15 downto 0);
  12.         we_a,we_b:     in std_logic;
  13.         oe_a,oe_b:     in std_logic;
  14.         cs_a,cs_b:     in std_logic
  15.         );
  16. end entity ram;

  17. architecture rtl of ram is
  18. TYPE ramblock IS ARRAY (0 to 99) OF std_logic_vector (n-1 downto 0);

  19. SIGNAL memory        :ramblock;

  20.     BEGIN
  21.                 -----dual ram on a side
  22.         PROCESS(we_a,oe_a,cs_a)
  23.         BEGIN
  24.         IF cs_a='1' THEN                  
  25.             data_a<="ZZZZZZZZZZZZZZZZ";
  26.             ELSE
  27.                 IF we_a='0' THEN
  28.                 memory(to_integer(UNSIGNED(addr_a)))<=data_a;   --WRITE
  29.                 END iF;
  30.                 IF we_a='1' AND oe_a='0' THEN
  31.                     data_a<=memory(to_integer(UNSIGNED(addr_a)));   --READ
  32.                 ELSE
  33.                     data_a<="ZZZZZZZZZZZZZZZZ";                     --OUTPUT DISABLED
  34.                 END iF;
  35.         END IF;
  36.         END PROCESS;

  37.         -----dual ram on b side
  38.         PROCESS(we_b,oe_b,cs_b)
  39.         BEGIN
  40.         IF cs_b='1' THEN                  
  41.             data_b<="ZZZZZZZZZZZZZZZZ";
  42.             ELSE
  43.                 IF we_b='0' THEN
  44.                                         memory(to_integer(UNSIGNED(addr_b)))<=data_b;   --WRITE
  45.                                 end if;
  46.                 IF we_b='1' AND oe_b='0' THEN
  47.                     data_b<=memory(to_integer(UNSIGNED(addr_b)));   --READ
  48.                 ELSE
  49.                     data_b<="ZZZZZZZZZZZZZZZZ";                     --OUTPUT DISABLED
  50.                 END iF;
  51.         END IF;
  52.         END PROCESS;
  53.         
  54.     END rtl;
  55.    
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| 芝麻饭团 发表于 2012-3-19 22:16:50 | 显示全部楼层
我的qq是707678413,希望对fpga比较感兴趣的可以加我多多交流。
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-23 20:55 , Processed in 0.062830 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表