RAM读写实验(用Altera RAM IP核生成一个单端口的RAM,然后对RAM进行读写操作,并通过Modelsim软件进行仿真)

RAM(Random Access Memory),即随机存取存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据, 其读写速度是由时钟频率决定的。

RAM主要用来存放程序及程序执行过程中产生的中间数据、 运算结果等。

 1.新建ram ip核,在ip catalog中搜索ram 选择如图选项

然后新建ip core文件夹,将其存为ram_1port

 开始设计ip 核,将深度设为8,宽度设为32,ip核用什么单位搭起来选择auto,然后输入输出数据的时钟选择一个时钟控制,然后点击next

 取消添加q寄存器,让输出缓存。然后勾上创建一个读使能信号

 为了避免同时对一个值进行读写操作,所以选择读出的数据为don‘t care

 第一个里面选择no就是不更新ROM里面的数据,选择yes就是要更新,然后下面有一个browse,就可以加载数据文件进去。然后下面那个如果勾选的话,就是允许在线更新ROM数据。这里如下图选择,然后一直点击next

 到这里时,要勾选如图文件,方便例化ip 核

 然后点击finish,完成ip核设计

2.编写程序,首先是读写模块

 

module ram_rw(
    input               clk        ,  //时钟信号
    input               rst_n      ,  //复位信号,低电平有效
    
    output              ram_wr_en  ,  //ram写使能
    output              ram_rd_en  ,  //ram读使能
    output  reg  [4:0]  ram_addr   ,  //ram读写地址
    output  reg  [7:0]  ram_wr_data,  //ram写数据
    
    input        [7:0]  ram_rd_data   //ram读数据        
    );

//reg define
reg    [5:0]  rw_cnt ;                //读写控制计数器

//*****************************************************
//**                    main code
//*****************************************************

//rw_cnt计数范围在0~31,ram_wr_en为高电平;32~63时,ram_wr_en为低电平
assign  ram_wr_en = ((rw_cnt >= 6'd0) && (rw_cnt <= 6'd31))  ?  1'b1  :  1'b0;
//rw_cnt计数范围在32~63,ram_rd_en为高电平;0~31时,ram_rd_en为低电平
assign  ram_rd_en = ((rw_cnt >= 6'd32) && (rw_cnt <= 6'd63))  ?  1'b1  :  1'b0;

//读写控制计数器,计数器范围0~63
always @(posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0)
        rw_cnt <= 6'd0;    
    else if(rw_cnt == 6'd63)
        rw_cnt <= 6'd0;
    else
        rw_cnt <= rw_cnt + 6'd1;    
end    

//读写控制器计数范围:0~31 产生ram写使能信号和写数据信号
always @(posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0)
        ram_wr_data <= 8'd0;  
    else if(rw_cnt >= 6'd0 && rw_cnt <= 6'd31)
        ram_wr_data <= ram_wr_data + 8'd1;
    else
        ram_wr_data <= 8'd0;         
end    

//读写地址信号 范围:0~31
always @(posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0)
        ram_addr <= 5'd0;
    else if(ram_addr == 5'd31)
        ram_addr <= 5'd0;
    else
        ram_addr <= ram_addr + 1'b1; 
end

endmodule

 然后是顶层模块

 

module ip_ram(
    input               sys_clk        ,  //系统时钟
    input               sys_rst_n         //系统复位,低电平有效
    );

//wire define
wire             ram_wr_en   ;  //ram写使能  
wire             ram_rd_en   ;  //ram读使能  
wire    [4:0]    ram_addr    ;  //ram读写地址 
wire    [7:0]    ram_wr_data ;  //ram写数据  

wire    [7:0]    ram_rd_data ;  //ram读数据  

//*****************************************************
//**                    main code
//*****************************************************

//ram读写模块
ram_rw  u_ram_rw(
    .clk            (sys_clk),
    .rst_n          (sys_rst_n),

    .ram_wr_en      (ram_wr_en  ),
    .ram_rd_en      (ram_rd_en  ),
    .ram_addr       (ram_addr   ),
    .ram_wr_data    (ram_wr_data),

    .ram_rd_data    (ram_rd_data)
    );

//ram ip核例化
ram_1port  u_ram_1port(
    .address      (ram_addr),
    .clock        (sys_clk),
    .data         (ram_wr_data),
    .rden         (ram_rd_en),
    .wren         (ram_wr_en),
    .q            (ram_rd_data)
    );

endmodule

然后在modelsim中看波形

测试文件如图

 

`timescale 1 ns/ 1 ns
module ip_ram_tb();

parameter T = 20;
reg sys_clk;
reg sys_rst_n;

                                          
wire             ram_wr_en   ;  //ram写使能  
wire             ram_rd_en   ;  //ram读使能  
wire    [4:0]    ram_addr    ;  //ram读写地址 
wire    [7:0]    ram_wr_data ;  //ram写数据  

wire    [7:0]    ram_rd_data ;  //ram读数据  

                     

initial                                                
begin                                                  

	sys_clk = 1'b0;
	sys_rst_n = 1'b0;
   
	#200 
	sys_rst_n = 1'b1;
    //模拟发送一帧数据
   
    #1500000  $stop;
	
                   
end                                                    
always #(T/2)  sys_clk = ~sys_clk;                                              
    
//ram读写模块
ram_rw  u_ram_rw(
    .clk            (sys_clk),
    .rst_n          (sys_rst_n),

    .ram_wr_en      (ram_wr_en  ),
    .ram_rd_en      (ram_rd_en  ),
    .ram_addr       (ram_addr   ),
    .ram_wr_data    (ram_wr_data),

    .ram_rd_data    (ram_rd_data)
    );

//ram ip核例化
ram_1port  u_ram_1port(
    .address      (ram_addr),
    .clock        (sys_clk),
    .data         (ram_wr_data),
    .rden         (ram_rd_en),
    .wren         (ram_wr_en),
    .q            (ram_rd_data)
    );                             
endmodule

 

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 计算机组成原理整机实验RAM是计算机科学与技术专业中一项非常重要的实验。这个实验目的是设计与实现一个基于RAM的简计算机系统,使学生通过实践掌握CPURAM操作,熟悉各类指令格式及操作。而作为一名学习者,要如何为这个实验做好准备和完成呢? 首先要做的是准备实验环境。为了设置实验环境,我们需要下载并安装软件包。实验需要用到Xilinx ISE、ModelSim、Vivado等软件。这些软件都可以在网络上搜索到相关资料。安装完成后,就要开始进行实验了。 实验过程中,我们需要按照实验材料中给出的指令和教学视频,一步一步地完成实验。在进行实验之前,我们还需要对实验的原理和流程做一些了解。实验主要包括CPU的编RAM操作,其中还涉及到信号和线路的连接。学习者需要仔细学习实验材料,了解信号和线路的具体规格和接口。 在进行实验的过程中,学习者需要遵循实验流程。这包括在实验进行的各个操作步骤、代码和生成RTL模型等。在实验中,我们要时刻保持思考和分析能力的发挥,发现问题并及时解决。 最后,实验完成后,学习者需要对实验进行总结和复盘。这个过程需要我们进行自省和总结,反思实验中自己存在的问题和不足之处,提高自己的学习能力和技术水平。 总的来说,计算机组成原理整机实验RAM山东大学对于学习计算机科学与技术的学生来说是一项极为重要的实验,需要付出较多的努力和耐心才能完成,并从中获取技术和思维的能力提升。 ### 回答2: 计算机组成原理整机实验RAM是一项基础性实验,它旨在帮助学生更好地理解计算机系统中的RAM过程,并提升实际操作能力。其中,山东大学的实验内容主要包括以下几个方面: 首先,学生需要通过实验让自己了解RAM(随机存储器)的基本原理和特性,掌握RAM操作的方法和途径。学生需要通过实验仪器,如基于主板的RAM、逻辑分析仪、示波器、电源等,了解RAM周期的时序关系以及控制信号的电平变化,进而明白RAM存储器在存储和取数据时采用的不同的电信号方案,了解数据存储元的构造和划分方式。 其次,学生需要学习计算机内部总线的基本原理和功能,掌握数据总线、地址总线和控制总线之间的交互关系,以及如何利用电平信号将数据存储和取。通过实验,学生需要自己设计并调试数据总线和控制总线的电路,实现RAM操作过程中的控制信号电平变化。 最后,学生需要熟悉基于实际情况的实验操作指导和报告撰流程。学生需要在指导教师的帮助下,对实验原理、实验流程、实验数据分析等方面进行深入理解和探究,然后利用文字和图表等形式,撰出清晰可实验报告。 总的来说,计算机组成原理整机实验RAM是一项重要的实践活动,可以极大地提升学生的应用能力和实际操作技能,帮助学生更好地理解计算机系统的基本组成原理和操作规律。 ### 回答3: 计算机组成原理整机实验RAM是一门基于计算机原理、操作系统和汇编语言的实践课程。通常情况下,这门课程分为两部分:理论及实验。其中,理论部分主要涵盖计算机系统结构、指令集和数据寻址模式等理论知识;实验部分则涉及基于RAM的实现原理和实践,需进行硬件设计、编程和运行测试等多个环节。 在此过程中,实验任务通常包括以下三个部分: 1. 设计基于RAM的计算机系统,搭建实验平台。 2. 通过面向能力编程的方式,编汇编语言程序,并将其载入RAM。 3. 运行测试,验证实现的正确性和性能。 通过这门课程,学生可以深入了解计算机系统原理,具备独立设计和开发计算机系统的能力,提升实践操作能力和分析问题的能力。同时,也可以为学生今后从事计算机体系结构和操作系统等领域的深入研究或职业发展打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值