Bootstrap

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

一、实验目的

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

五、仿真结果

不用数码管显示:
请添加图片描述

用数码管显示:
请添加图片描述

六、实验结果

用数码管显示
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

;