打印
[matlab]

dual-port ram代码问题

[复制链接]
9099|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
izefei|  楼主 | 2011-6-8 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 izefei 于 2011-6-9 09:31 编辑

本人是xilinx fpga初学者,平常用dual-port ram的时候都是直接调用IP核。今天尝试着自己编写了一个64X6的dual-port ram。可是第一种方法综合不过去,第二种综合之后占用很多资源。代码很短,望各位路过的大侠们指点下。

补充:
我开始采用的是如下方法,可综合不过去,错误提示为:
ERROR:Xst:2070 - If you are attempting to describe a dual-port block RAM with two separate write ports for signal <data>, please use a shared variable instead. Coding guidelines are provided in the user manual.
这上面的user manual我在xilinx官网上找了很长时间,也没找到相关东西。

process(clka)
begin
if(rising_edge(clka))then
        if(wea='1')then
                data(conv_integer(addra))<=dina;
        else
                douta<=data(conv_integer(addra));
        end if;
end if;
end process;

process(clkb)
begin
if(rising_edge(clka))then
        if(web='1')then
                data(conv_integer(addrb))<=dinb;
        else
                doutb<=data(conv_integer(addrb));
        end if;
end if;
end process;
-------------------------------------------------------------------------------------------------------------

第二种方法:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ram_dual IS
port (
   clk: IN std_logic;
   addra: IN std_logic_VECTOR(5 downto 0);
   addrb: IN std_logic_VECTOR(5 downto 0);
   dina: IN std_logic_VECTOR(5 downto 0);
   dinb: IN std_logic_VECTOR(5 downto 0);
   douta: OUT std_logic_VECTOR(5 downto 0);
   doutb: OUT std_logic_VECTOR(5 downto 0);
   wea: IN std_logic;
   web: IN std_logic
);
END ram_dual;

ARCHITECTURE behavior OF ram_dual IS
  type data_type is array(0 to 63) of std_logic_vector(5 downto 0);
  signal data:data_type;
  signal we:std_Logic_Vector(1 downto 0);
BEGIN
we<=wea & web;
process(clk)
begin
if(rising_edge(clk))then
    case we is
      when "11"=>
         data(conv_integer(addra))<=dina;
         data(conv_integer(addrb))<=dinb;
      when "10"=>
         data(conv_integer(addra))<=dina;
         doutb<=data(conv_integer(addrb));
      when "01"=>
         douta<=data(conv_integer(addra));
         data(conv_integer(addrb))<=dinb;
      when "00"=>
         douta<=data(conv_integer(addra));
         doutb<=data(conv_integer(addrb));
      when others=>Null;
   end case;
end if;
end process;
END behavior;

相关帖子

沙发
GoldSunMonkey| | 2011-6-8 17:37 | 只看该作者
请参考这个代码
process (<clockA>)
begin
   if (<clockA>'event and <clockA> = '1') then
      if (<enableA> = '1') then
         if (<write_enableA> = '1') then
            <ram_name>(conv_integer(<addressA>)) := <input_dataA>;
         end if;
         <ram_outputA> <= <ram_name>(conv_integer(<addressA>));
      end if;
   end if;
end process;

process (<clockB>)
begin
   if (<clockB>'event and <clockB> = '1') then
      if (<enableB> = '1') then
         if (<write_enableB> = '1') then
            <ram_name>(conv_integer(<addressB>)) := <input_dataB>;
         end if;
         <ram_outputB> <= <ram_name>(conv_integer(<addressB>));
      end if;
   end if;
end process;

使用特权

评论回复
板凳
edacsoft| | 2011-6-8 17:40 | 只看该作者
恩,高人啊。同样的功能
代码简洁清晰很多。

使用特权

评论回复
地板
izefei|  楼主 | 2011-6-8 18:07 | 只看该作者
本帖最后由 izefei 于 2011-6-8 18:15 编辑

我一开始采用的也是这种方法,但是综合不过去,错误是:
ERROR:Xst:2070 - If you are attempting to describe a dual-port block RAM with two separate write ports for signal <data>, please use a shared variable instead. Coding guidelines are provided in the user manual.
这上面的user manual我在xilinx官网上找了很长时间,也没找到相关东西。

而且这里面有一个问题就是
<ram_name>在两个进程里被赋值,而且如果addressA和addressB相等的话,会产生冲突,相当于multi-source一类问题。
2# GoldSunMonkey

使用特权

评论回复
5
gegefly| | 2011-6-9 11:06 | 只看该作者
VHDL不熟

使用特权

评论回复
6
edacsoft| | 2011-6-9 11:50 | 只看该作者
你可以试试直接例化dpram的方法

使用特权

评论回复
7
AutoESL| | 2011-6-9 15:36 | 只看该作者
学习了

使用特权

评论回复
8
izefei|  楼主 | 2011-6-9 18:59 | 只看该作者
自己顶!

使用特权

评论回复
9
GoldSunMonkey| | 2011-6-10 01:06 | 只看该作者
本来就是参考代码,那么你说的问题涉及到是读优先还是写优先的问题。
如果写优先应该如何,如果读优先应该如何。我觉得你应该明白了

使用特权

评论回复
10
嘻仔里1989| | 2011-6-10 13:07 | 只看该作者
参考参考

使用特权

评论回复
11
SuperX-man| | 2011-6-13 14:11 | 只看该作者
看了下.发现问题其实是楼主在2个process模块中分别对DATA作了写操作.
这个在硬件逻辑中是矛盾的.对于data来说它的读写必须很明确

使用特权

评论回复
12
午后苦丁茶| | 2011-6-19 21:29 | 只看该作者
学习了,

使用特权

评论回复
13
爱在2012| | 2011-6-25 23:35 | 只看该作者
MARK。

使用特权

评论回复
14
yiwang_111| | 2012-3-31 23:28 | 只看该作者
不知道楼主这个问题解决了没有 我最近也开始研究这个问题 GSM说的
     “本来就是参考代码,那么你说的问题涉及到是读优先还是写优先的问题。
       如果写优先应该如何,如果读优先应该如何。我觉得你应该明白了”
我没想明白 因为既然是真正的双口RAM 那么就可以在两个clk下对同一个RAM里的数据进行读写 涉及到跨时钟域的问题 那么如何写代码呢 无论如何都是得写两个进程 那样的话一综合肯定是报错的

使用特权

评论回复
15
GoldSunMonkey| | 2012-4-1 11:27 | 只看该作者
RAM本来是隔开时钟域的。只要不同时对一个地址进行读写,即可。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

80

帖子

1

粉丝