原创 FPGA RAM

2010-6-3 16:46 2644 1 2 分类: FPGA/CPLD
读写RAM
module ram (ram_clk,wr,rd,cs,ram_data_bus,data_out_bus,ram_addr_bus);
input ram_clk;
input wr,rd;
input cs;
output[7:0] data_out_bus;   //读出数据总线
input[7:0] ram_data_bus;     //写入数据总线
output[5:0] ram_addr_bus;         //ram地址线

reg[7:0] data_out_bus;
reg[5:0] ram_addr_bus;

reg[5:0] addr_count;       //计数器计数做ram的地址
reg[7:0] mema[63:0];
integer i;

initial    
begin
   addr_count=0;
   for(i=0;i<64;i=i+1)       //ram清0
       mema<=i+1;
   end
  
always @(posedge ram_clk)
     if(cs==1'b1) addr_count=6'b0;
     else if(wr==1'b0)begin                             //写数据
           ram_addr_bus<=addr_count;
           mema[ram_addr_bus]<=ram_data_bus;
           addr_count<=addr_count+1'b1;
       end
     else if(rd==1'b0)begin                             //读数据
           ram_addr_bus<=addr_count;
           //ram_data_bus_reg<=mema[ram_addr_bus];
           data_out_bus<=mema[ram_addr_bus];
           addr_count<=addr_count+1'b1;
       end  
     else   addr_count<=6'b0;

endmodule



在fpga内部实现2个双口ram,可以实现乒乓操作
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity dualportram is
port
(
       clk : in std_logic;
       --dout_1: inout std_logic_vector(7 downto 0);
       --dout_2: inout std_logic_vector(7 downto 0)
       dout : inout std_logic_vector(7 downto 0)
);
end dualportram;

architecture action of dualportram is

component lpmramdp_1
PORT
(
       data       : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
       wren       : IN STD_LOGIC   := '1';
       wraddress : IN STD_LOGIC_VECTOR (11 DOWNTO 0);
       rdaddress : IN STD_LOGIC_VECTOR (12 DOWNTO 0);
       clock       : IN STD_LOGIC;
       q                : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
end component;


component lpmramdpplus
       PORT
       (
            data             : IN STD_LOGIC_VECTOR (15 DOWNTO 0);
            wren             : IN STD_LOGIC   := '1';
            wraddress             : IN STD_LOGIC_VECTOR (12 DOWNTO 0);
            rdaddress             : IN STD_LOGIC_VECTOR (13 DOWNTO 0);
            clock             : IN STD_LOGIC ;
            q             : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
       );
end component;


signal wrCount_1 : std_logic_vector (11 DOWNTO 0);
signal rdCount_1 : std_logic_vector (12 DOWNTO 0);
signal dataIn_1   : std_logic_vector (15 downto 0);
signal dataOut_1 : std_logic_vector (7 downto 0);
signal wrCount_2 : std_logic_vector (12 DOWNTO 0);
signal rdCount_2 : std_logic_vector (13 DOWNTO 0);
signal dataIn_2   : std_logic_vector (15 downto 0);
signal dataOut_2 : std_logic_vector (7 downto 0);
signal flag:std_logic;

begin
process(clk)
begin
if rising_edge(clk) then
       wrCount_1 <= wrCount_1 + 1;
       rdCount_1 <= rdCount_1 + 1;
       wrCount_2 <= wrCount_2 + 1;
       rdCount_2 <= rdCount_2 + 1;
       flag <= not flag;
       if (flag = '1') then
         dout <= dataOut_1;
       else
         dout <= dataOut_2;
       end if;
end if;
end process;

u1: lpmramdp_1
port map
(
       data             => dataIn_1,
       wren             => '1',
       wraddress        => wrCount_1,
       rdaddress        => rdCount_1,
       clock             => clk,
       --q                    => dout_1
       q           => dataOut_1
);
u2: lpmramdpplus
       PORT map
       (
data             => dataIn_2,
      wren             => '1',
       wraddress        => wrCount_2,
       rdaddress        => rdCount_2,
       clock             => clk,
       --q                    => dout_2
       q           => dataOut_2
       );

end
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户417832 2013-3-28 15:32

pi,编译不通过!!!
相关推荐阅读
用户396200 2010-06-03 17:21
ModelSim SE操作指南
第一章 介 绍本指南是为 ModelSim5.5f版本编写的,该版本运行于UNIX和Microsoft Windows 95/98/Me/NT/2000的操作系统环境中。本指南覆盖了VHDL和Veri...
用户396200 2010-06-03 16:56
modelsim入门简单教程
至今还没有弄明白为什么要用ModelSim,因为看波形Quartus II自带的工具就可以了啊。我刚刚接触modelsim,我想大多数菜鸟跟我一样,看过如何使用ModelSim的介绍,说句实话,那些介...
用户396200 2010-06-03 16:55
NIOS II自定义指令设计之实例篇
好难得找到一篇这么完整的自定义指令操作,学习学习!!1  自定义指令添加在当前工程文件夹下建立ip文件夹(当前工程目录下的ip文件夹是SOPCBuilder的ip默认搜索路径之一),将自定义指令设计文...
用户396200 2010-06-03 16:53
Verilog(FPGA/CPLD)设计小技巧
这是一个在设计中常犯的错误列表这些错误常使得你的设计不可靠或速度较慢为了提高你的设计性能和提高速度的可靠性你必须确定你的设计通过所有的这些检查 可靠性 **为时钟信号选用全局时钟缓冲器BUFG ? 不...
用户396200 2010-06-03 16:52
FPGA
这些都是我在编程时发现的问题,总结一下,怕以后忘了以我目前的水平不明白类似关键路径,组合数目什么高深理论,这都是我从实际中学到的,比看书学的印象深刻得多.慢慢来吧,我想我以后也会明白那些高级的东西了!...
用户396200 2010-06-03 16:51
电子世界
电子产品世界的论坛 http://bbs.edw.com.cn/index.asp 恒颐高科论坛 http://www.hyesco.com/bbs/index.asp悠悠电子设计http://www...
EE直播间
更多
我要评论
1
1
关闭 站长推荐上一条 /3 下一条