计算机组成原理实验——三、存储器实验

这篇具有很好参考价值的文章主要介绍了计算机组成原理实验——三、存储器实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验目的

1.掌握存储器的工作原理和接口。
2.掌握存储器的实现方法和初始化方法。
3.掌握RISC-V中存储器的存取方式。

二、实验内容

1.利用vivado IP核创建6432的ROM,并在 系数文件中设置数据为123489ab;
2.利用vivado IP核创建64
32的RAM,并在 其上封装一个模块,使得其能完成risc-v 的load/store指令功能。
3.将ROM中的数据读出并保存到RAM中。
4.识别code编码对应的load指令将该数据 从RAM中读出来,结果显示数据的 [31:28][15:12][7:4]。
31:28 15:12 7:4
可选:用七段数码管显示该数据的全部 32位。

三、实验程序

rom
计算机组成原理实验——三、存储器实验
ram
计算机组成原理实验——三、存储器实验
ins
计算机组成原理实验——三、存储器实验
NEWRAM.v

module NEWRAM(
    input [5:0] maddr,
    input [31:0] mwdata,
    input clk,
    input we,
    input [2:0] mm,
    output [31:0] mdata
    );
    wire [31:0] tmp,tmp_b,tmp_h,tmp_bu,tmp_hu;
    wire [31:0] tmp_mwdata;
    dataRAM dr(.a(maddr),.d(tmp_mwdata),.clk(clk),.we(we),.spo(tmp));
    wire lb,lh,lw,lbu,lhu,sb,sh,sw;
    // 识别出各类读写方法
    assign lb=~(|mm);               // 000
    assign lh=~(|mm[2:1])&mm[0];    // 001
    assign lw=mm[2]&~(|mm[1:0]);    // 100
    assign lbu=~mm[2]&mm[1]&~mm[0]; // 010
    assign lhu=~mm[2]&(&mm[1:0]);   // 011
    assign sb=mm[2]&~mm[1]&mm[0];   // 101
    assign sh=(&mm[2:1])&~mm[0];    // 110
    assign sw=&mm;                  // 111
    // 读数据
    assign tmp_b={{24{tmp[7]}},tmp[7:0]};
    assign tmp_h={{16{tmp[15]}},tmp[15:0]};
    assign tmp_bu={24'b0,tmp[7:0]};
    assign tmp_hu={16'b0,tmp[15:0]};
    assign mdata={32{lb}}&tmp_b|
                 {32{lh}}&tmp_h|
                 {32{lw}}&tmp|
                 {32{lbu}}&tmp_bu|
                 {32{lhu}}&tmp_hu;
     // 写数据
     assign tmp_mwdata={32{sb}}&{24'b0, mwdata[7:0]}|
                       {32{sh}}&{16'b0, mwdata[15:0]}|
                       {32{sw}}&mwdata;
endmodule

div.v(分频器)

module div(
    input clk,
    output clk_new
    );
    reg[17:0] q = 18'b0;
    always @(posedge clk)
    begin
        q=q+1'b1;
    end
    assign clk_new=q[17];
endmodule

seven.v(七段数码管)

module seven(
    input [3:0] data,
    output reg[6:0] out
    );
  always @(*)
  case (data)
      4'b0000:out = 7'b1111110; // 7e
      4'b0001:out = 7'b0110000; // 30
      4'b0010:out = 7'b1101101; // 6d
      4'b0011:out = 7'b1111001; // 79
      4'b0100:out = 7'b0110011; // 33
      4'b0101:out = 7'b1011011; // 5b
      4'b0110:out = 7'b1011111; // 5f
      4'b0111:out = 7'b1110000; // 70
      4'b1000:out = 7'b1111111; // 7f
      4'b1001:out = 7'b1111011; // 7b
      4'b1010:out = 7'b1110111; // 77
      4'b1011:out = 7'b0011111; // 1f
      4'b1100:out = 7'b1001110; // 4e
      4'b1101:out = 7'b0111101; // 3d
      4'b1110:out = 7'b1001111; // 4f
      4'b1111:out = 7'b1000111; // 47
      default:out = 7'b1111110; //7e
  endcase 
endmodule

show.v(七段数码管显示)

module show(
    input rst,
    input clk,
    input [31:0] result,
    output reg[3:0] an1,
    output reg[3:0] an2,
    output [6:0] out1,
    output [6:0] out2
    );
    wire clk_new;
    div mydiv(.clk(clk),.clk_new(clk_new));
    reg [3:0] data1,data2;
    reg [1:0] cur_state,nex_state;
    // 状态转移
    always @(posedge clk_new)
//    always @(posedge clk)
    begin
        if(!rst)
            cur_state<=2'b00;
        else
            cur_state<=nex_state;
    end
    // 状态转移条件
    always @(*)
    begin
        case(cur_state)
            2'b00:
                nex_state<=2'b01;
            2'b01:
                nex_state<=2'b10;
            2'b10:
                nex_state<=2'b11;
            2'b11:
                nex_state<=2'b00;
        endcase
    end
    // 状态输出
    always @(posedge clk_new)
//    always @(posedge clk)
    begin
        case(cur_state)
            2'b00:
            begin
                an1<=4'b0001;
                data1<=result[19:16];
                an2<=4'b0001;
                data2<=result[3:0];
            end
            2'b01:
            begin
                an1<=4'b0010;
                data1<=result[23:20];
                an2<=4'b0010;
                data2<=result[7:4];
            end
            2'b10:
            begin
                an1<=4'b0100;
                data1<=result[27:24];
                an2<=4'b0100;
                data2<=result[11:8];
            end
            2'b11:
            begin
                an1<=4'b1000;
                data1<=result[31:28];
                an2<=4'b1000;
                data2<=result[15:12];
            end
        endcase
    end 
    seven myseven1(.data(data1),.out(out1));
    seven myseven2(.data(data2),.out(out2));   
endmodule

top.v(不用数码管显示)

module top(
    input clk,
    input rst,
    input [2:0] code,
    output [31:0] result
    );
    wire [31:0] addr=32'b0;
    wire [31:0] outdata;
    wire [31:0] result;
    reg we;
    reg [31:0] count;
    always @(posedge clk)
    begin
        if (rst==1'b0)
        begin
            we<=1'b1;
            count<=1'b0;
        end
        else
            if (count>=32'b100)
                we<=1'b0;
            else
                count<=count+1;
    end
    rom myrom(.a(addr),.spo(outdata));
    NEWRAM nr(.maddr(addr),.mwdata(outdata),.clk(clk),.we(we),.mm(code),.mdata(result));
endmodule

top.v(用数码管显示)

module top(
    input clk,
    input rst,
    input [2:0] code,
    output [3:0] an1,
    output [3:0] an2,
    output [6:0] out1,
    output [6:0] out2
    );
    wire [31:0] addr=32'b0;
    wire [31:0] outdata;
    wire [31:0] result;
    reg we;
    reg [31:0] count;
    always @(posedge clk)
    begin
        if (rst==1'b0)
        begin
            we<=1'b1;
            count<=1'b0;
        end
        else
            if (count>=32'b100)
                we<=1'b0;
            else
                count<=count+1;
    end
    rom myrom(.a(addr),.spo(outdata));
    NEWRAM nr(.maddr(addr),.mwdata(outdata),.clk(clk),.we(we),.mm(code),.mdata(result));
    show myshow(.clk(clk),.rst(rst),.result(result),.an1(an1),.an2(an2),.out1(out1),.out2(out2));
endmodule

四、仿真程序

mysim.v(不用数码管显示)

module mysim(

    );
    reg clk=1'b0;
    reg rst=1'b0;   
    wire[31:0] result;
    always
        #10 clk=~clk;
    initial
        #11 rst=1'b1;
    reg[2:0] code=3'b011;
    top mytop(.clk(clk),.rst(rst),.code(code),.result(result));
endmodule

mysim.v(用数码管显示)

module mysim(

    );
    reg clk=1'b0;
    reg rst=1'b0;   
    wire [3:0] an1,an2;
    wire [6:0] out1,out2;
    always
        #10 clk=~clk;
    initial
        #11 rst=1'b1;
    reg[2:0] code=3'b011;
    top mytop(.clk(clk),.rst(rst),.code(code),.an1(an1),.an2(an2),.out1(out1),.out2(out2));
endmodule

五、仿真结果

不用数码管显示:
计算机组成原理实验——三、存储器实验

用数码管显示:
计算机组成原理实验——三、存储器实验

六、实验结果

用数码管显示
计算机组成原理实验——三、存储器实验
计算机组成原理实验——三、存储器实验
计算机组成原理实验——三、存储器实验
计算机组成原理实验——三、存储器实验
计算机组成原理实验——三、存储器实验文章来源地址https://www.toymoban.com/news/detail-443541.html

到了这里,关于计算机组成原理实验——三、存储器实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机组成原理 存储器设计

    目录 一、把8×8 位的RAM存储器模块扩展为 8×32 位RAM存储空间; 二、把8×8 位的RAM存储器模块扩展为32×8位RAM存储空间; 三、把256×4 位的RAM存储器模块扩展为1K×8b的RAM存储空间。 PS:先说说存储器是什么样的小玩意:                         A x B 位XXX(RAM或者ROM)存储器的

    2024年02月07日
    浏览(49)
  • 计算机组成原理之机器:存储器之高速缓冲存储器

    笔记来源:哈尔滨工业大学计算机组成原理(哈工大刘宏伟) 3.1.1 为什么用cache? 角度一: I/O设备向主存请求的级别高于CPU访存 ,这就出现了CPU等待I/O设备访存的现象,致使CPU空等一段时间,降低CPU工作效率。为 避免CPU与I/O设备争抢访存 ,可在CPU与主存之间加一级缓存,

    2024年03月10日
    浏览(60)
  • 计算机组成与体系结构第二次试验:存储器实验

    为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正! 本实验的主要内容是了解 RAM(Random Access Memory,静态随机存储器)和ROM(Read Only Memory,只读存储器)

    2024年02月08日
    浏览(49)
  • 计算机组成原理4.2.3提高存储器访问速度的措施

    提高存储器访问层次大概有三种方法 采用高速器件 采用层次结构 Cache 主存 调整主存结构  利用程序局部性原理,访问一个块 相邻的若干块都会被拿出来,缺点可能会碰到跳转类指令 高位是体号,低位时地址因此,CPU给出一次存储访问总是对一块连续的存储单元进行的,在

    2024年02月02日
    浏览(49)
  • 《计算机组成原理》期末考试手写笔记——模块五: 并行主存系统(交叉存储器+顺序存储器“带宽”的计算方法)

    目录 (一)知识点总结   (二)经典考试例题 1.设主存储器容量为256字,字长为32位,模块数m=4,分别用顺序方式和交叉方式进行组织。主存储器的存储周期T=200ns,数据总线宽度为32位,总线传送周期τ=50ns。若按地址顺序连续读取4个字,问顺序存储器和交叉存储器的带宽各

    2024年02月08日
    浏览(51)
  • 计算机组成原理第五章----存储器容量的扩展与芯片连接

    目录 存储器芯片与CPU的连接 典例 典例二 主存储器容量的扩展与连接方法 位拓展  字拓展  例题 主存大小计算 总结: 1. 确定所需芯片的 数量 (可以通过计算得出) 2. 确定每个芯片的分配地址 (区分最大地址还是最小地址,容量) 3. 确定每个芯片 片选信号CS 的产生方式

    2024年02月11日
    浏览(54)
  • 计算机组成原理(期末或考研备考)- 存储器(RAM和ROM重点讲解)

    主存储器:也称内存,存放正在运行程序和数据,CPU可以直接访问,容量存储较小,价格较贵。 辅助存储器:也称外存(绝大多数是磁盘),存放电脑的应用程序等,如果想要运行某一程序,往往需要先将其从外存调入内存,存储空间大,访问速度较慢,价格较低。 高速缓

    2024年02月11日
    浏览(48)
  • 【计算机组成原理】高速缓冲存储器 Cache 的写策略(Writing Policy)

    缓存的写策略指的是确定何时将数据写入缓存或主存的策略。 在全写法策略中,每次发生写操作时都会将数据同时写入缓存和主存。这样可以保证数据的一致性,但会增加主存的写入操作,降低写入性能。需要设置写缓存(Write Buffer)。 在写回策略中,当缓存中的数据发生

    2024年02月02日
    浏览(51)
  • 【计算机组成原理】高速缓冲存储器 Cache 的三种映射方式(Cache Mapping)

    缓存是计算机系统中常见的一种高速存储器,用于临时存储常用数据,以便快速访问。在缓存中,有三种常见的映射方式,分别是直接映射、全相联映射和组相联映射。 在直接映射中,每个主存块只能映射到缓存中的一个特定位置。该位置是通过对主存块的某个地址的一部分

    2024年01月19日
    浏览(48)
  • 计算机组成与结构综合大实验验优:16位运算器设计实验、存储器实验、控制器实验、16位CPU设计实验

    综合性比较强的大实验,先是在实验室完成前面三个小实验,最后再三个结合完成最后的16位CPU的设计,需要软硬件结合一起。 实验截图 黄色圈的地方是输入步骤显示 蓝色圈的地方是标志位和结果显示的LED灯 红色圈的地方是输入决定ALU功能的操作码的地方,以及输入计算的

    2023年04月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包