天天看點

計算機組成原理實驗報告 存儲器實驗--FPGA中ROM定制與讀出實驗(源代碼全)

存儲器實驗--FPGA中ROM定制與讀出實驗

  • ​​一. 實驗目的​​
  • ​​二.實驗裝置及環境​​
  • ​​三.實驗任務​​
  • ​​四. 實驗步驟​​

一. 實驗目的

1、掌握FPGA中ROM的設定,作為隻讀存儲器ROM的工作特性和配置方法;

2、在初始化存儲器編輯視窗用文本編輯器編輯coe檔案配置ROM;

3、了解同步ROM與異步ROM的差別,并掌握調用 xilinx庫IP執行個體化ROM的設計方法;

4、驗證FPGA中ROM的功能。

二.實驗裝置及環境

裝有 Xilinx Vivado 的 Windows 7計算機,FPGA。

三.實驗任務

四. 實驗步驟

同步ROM的instmem.ceo檔案内容如下:
memory_initialization_radix = 16;
memory_initialization_vector =
3c010000
24010004
20050004
0c000018
25122520
8c890000
01244022
20050003
20a5ffff
34a8ffff
2009ffff
312affff
01493025
01463824
10a00001
08000008
2005ffff
000543c0
00084400
00084403
000843c2
08000017
00004020
8c890000
20840004
01094020
20a5ffff
14a0fffb
00081000
03e00008      
inst_rom_display.v檔案内容如下:
`timescale 1ns / 1ps
//*************************************************************************
//   > 檔案名: inst_rom_display.v
//   > 描述  :異步指令存儲器顯示子產品,調用FPGA闆上的IO接口和觸摸屏
//   > 作者  : LOONGSON
//   > 日期  : 2016-04-14
//*************************************************************************
module inst_rom_display(
    //時鐘與複位信号
    input clk,
    input resetn,    //字尾"n"代表低電平有效

    //觸摸屏相關接口,不需要更改
    output lcd_rst,
    output lcd_cs,
    output lcd_rs,
    output lcd_wr,
    output lcd_rd,
    inout[15:0] lcd_data_io,
    output lcd_bl_ctr,
    inout ct_int,
    inout ct_sda,
    output ct_scl,
    output ct_rstn
    );
//-----{調用資料儲存器子產品}begin
    //資料存儲器多增加一個讀端口,用于讀出特定記憶體位址顯示在觸摸屏上
    reg  [31:0] addr;
    wire [31:0] inst;

    inst_rom inst_rom_module(
        .clka   (clk       ),
        .addra  (addr[9:2] ),
        .douta  (inst      )
    );
//-----{調用寄存器堆子產品}end

//---------------------{調用觸摸屏子產品}begin--------------------//
//-----{執行個體化觸摸屏}begin
//此小節不需要更改
    reg         display_valid;
    reg  [39:0] display_name;
    reg  [31:0] display_value;
    wire [5 :0] display_number;
    wire        input_valid;
    wire [31:0] input_value;

    lcd_module lcd_module(
        .clk            (clk           ),   //10Mhz
        .resetn         (resetn        ),

        //調用觸摸屏的接口
        .display_valid  (display_valid ),
        .display_name   (display_name  ),
        .display_value  (display_value ),
        .display_number (display_number),
        .input_valid    (input_valid   ),
        .input_value    (input_value   ),

        //lcd觸摸屏相關接口,不需要更改
        .lcd_rst        (lcd_rst       ),
        .lcd_cs         (lcd_cs        ),
        .lcd_rs         (lcd_rs        ),
        .lcd_wr         (lcd_wr        ),
        .lcd_rd         (lcd_rd        ),
        .lcd_data_io    (lcd_data_io   ),
        .lcd_bl_ctr     (lcd_bl_ctr    ),
        .ct_int         (ct_int        ),
        .ct_sda         (ct_sda        ),
        .ct_scl         (ct_scl        ),
        .ct_rstn        (ct_rstn       )
    ); 
//-----{執行個體化觸摸屏}end

//-----{從觸摸屏擷取輸入}begin
//根據實際需要輸入的數修改此小節,
//建議對每一個數的輸入,編寫單獨一個always塊
    always @(posedge clk)
    begin
        if (!resetn)
        begin
            addr <= 32'd0;
        end
        else if (input_valid)
        begin
            addr[31:2] <= input_value[31:2];
        end
    end
//-----{從觸摸屏擷取輸入}end

//-----{輸出到觸摸屏顯示}begin
//根據需要顯示的數修改此小節,
//觸摸屏上共有44塊顯示區域,可顯示44組32位資料
//44塊顯示區域從1開始編号,編号為1~44,
    always @(posedge clk)
    begin
       case(display_number)
           6'd1:
           begin
               display_valid <= 1'b1;
               display_name  <= "ADDR ";
               display_value <= addr;
           end
           6'd2: 
           begin
               display_valid <= 1'b1;
               display_name  <= "INST ";
               display_value <= inst;
           end
           default :
           begin
               display_valid <= 1'b0;
               display_name  <= 40'd0;
               display_value <= 32'd0;
           end
       endcase
    end
//-----{輸出到觸摸屏顯示}end
//----------------------{調用觸摸屏子產品}end---------------------//      
inst_rom_tb.v的檔案内容如下:
`timescale 1ns / 1ps
module rom_techbeach();

    reg clk;
    reg flag;
    reg [5:0] rom_a;
    wire [31:0] rom_data;
    
   always #10 clk=~clk;
   always @(posedge clk)
       begin
       if(!flag)
         rom_a<=1'b0;
       else if(rom_a==5'd31)
         rom_a<=1'b0;
       else
         rom_a<=rom_a+1'b1;
    end
    inst_rom inst_rom(
    .clka (clk),
    .addra (rom_a),
    .douta (rom_data)
   );
   initial begin
   clk=1'b0;
   flag=1'b0;
   #100
   flag=1'b1;      

繼續閱讀