FPGA----PL侧对ram的读写

1、例化模块的输出端口只能是wire型,而不能是reg型,也就是不能更改输出。

2、input\output都需要有位宽表示。

3、assign变量也是wire型。

4、①实验任务:将32位宽的22个数放入PL侧的ram,并且读取(本实验可以为数组在模块间的传递提供解决方案【数组在Verilog中是不可以作为端口传递的,但是在SystemVerilog中可以】

②实验软硬件:Vivado 2019.1、ZCU106

③实验过程:

step1:建立test_pl_ram项目,过程不再赘述

step2:建立top、sub_top文件;建立testbench文件

 step3:添加block memory generator IP核,并作出以下设置

注意: 第一个是单口RAM(可以读写),第二个是简单双口RAM(端口A只能写,端口B只能读),第三个是真双口RAM(A、B均可以读写)。第三个和第四个是ROM(不讨论)。

 

 注意:由于本教程旨在进行浮点数的操作,而浮点数均为32位,因此我们设置位宽是32,假设有22个数据需要读写,因此深度位22。设置完成后点击

 可以看到发生了下图的变化

 最后点击OK,生成IP核。

step3:添加clocking wizard IP核

 step4:复值代码到对应文件中

`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
// 
// Create Date: 2021/12/28 23:18:24
// Design Name: 
// Module Name: top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module top(
    input           clk_in1_p,
    input           clk_in1_n,
    input           rst,
    output [31:0]   init_system_v_doutb
    );
    //ddr参数
    wire         init_system_v_wea;
    wire         init_system_v_ena;
    reg          init_system_v_enb = 1'b0;
    wire [4:0]   init_system_v_addra;
    wire [31:0]  init_system_v_dina;
    //wire [31:0]  init_system_v_doutb;
    reg  [4:0]   init_system_v_addrb = 4'b0;

    //100MHz时钟
    clk_wiz_0 uut_clk_wiz_0(
        .clk_out1(clk),
  // Status and control signals
        .reset(~rst),//高电平复位
        .locked(locked),
 // Clock in ports
        .clk_in1_p(clk_in1_p),
        .clk_in1_n(clk_in1_n)
    );

    sub_top uut_sub_top(
        .clk(clk),
        .rst(rst),//低电平有效
        .init_success(init_success),//初始化成功,开始求解电磁暂态程序
        .init_system_v(init_system_v_dina),//初始节点电压
        .init_system_v_addra(init_system_v_addra),
        .init_system_v_wea(init_system_v_wea),
        .init_system_v_ena(init_system_v_ena)
    );

    blk_mem_gen_0 uut_blk_mem_gen_0(
        .clka(clk),
        .ena(init_system_v_ena),//ram使能
        .wea(init_system_v_wea),//ram写数据使能
        .addra(init_system_v_addra),
        .dina(init_system_v_dina),

        .clkb(clk),
        .enb(init_system_v_enb),
        .addrb(init_system_v_addrb),
        .doutb(init_system_v_doutb)
    );

    reg [4:0]   init_system_v_count = 5'b0;
    reg         init_system_v_r_en = 1'b0;
    always @(posedge clk or negedge rst) begin
        if (!rst) begin
            init_system_v_count <= 5'b0;
            init_system_v_enb   <= 1'b0;
            init_system_v_addrb <= 'd0;
        end
        else begin
            if (!init_system_v_r_en) begin
                if(init_success== 1'b1 && init_system_v_count<22 ) begin
                    init_system_v_enb   <= 1'b1;
                    init_system_v_addrb <= init_system_v_addrb + 'd1;
                    init_system_v_count <= init_system_v_count + 'd1;
                end
                else if( init_system_v_count >=22 ) begin
                    init_system_v_count <= 5'b0;
                    init_system_v_r_en <= 1'b1;
                    init_system_v_enb   <= 1'b0;
                    init_system_v_addrb <= 'd0;
                end
            end
        end
    end
endmodule
`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
// 
// Create Date: 2021/12/28 23:20:33
// Design Name: 
// Module Name: sub_top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module sub_top(
    input           clk,
    input           rst,
    output          init_success,
    output [31:0]   init_system_v,//输出初始化电压
    output [4:0]    init_system_v_addra,//输出初始化电压对应的地址
    output          init_system_v_wea,//表示开始对ram写数据
    output          init_system_v_ena//表示ram使能
    );

    reg [7:0]  count = 10'b0;

    reg     [31:0]      init_system_v_r = 32'b0;//这个电压要一个一个输出,输出完毕后init_success变为高电平,代表初始化完成,一共22个
    reg     [4:0]       init_system_v_addra_r = 5'b0;   
    reg                 init_system_v_ena_r    =   1'b0;
    reg                 init_system_v_wea_r    =   1'b0;
    reg                 init_success_r  =   1'b0;
    assign  init_system_v = init_system_v_r;
    assign  init_system_v_addra = init_system_v_addra_r;
    assign  init_system_v_ena = init_system_v_ena_r;
    assign  init_system_v_wea = init_system_v_wea_r;
    assign  init_success = init_success_r;

    always @(posedge clk or negedge rst) begin
        if (!rst) begin
            //复位
        end
        else begin
            if (!init_success_r) begin
                count <= count + 1'b1;
                if (count<=100) begin
                    init_system_v_ena_r <= 1'b0;
                    init_system_v_wea_r <= 1'b0;
                end
                else if( count<=122 && count >100) begin
                    init_system_v_ena_r <= 1'b1;
                    init_system_v_wea_r <= 1'b1;
                    init_system_v_addra_r <= init_system_v_addra_r + 'd1;
                    init_system_v_r <= init_system_v_r + 1'b1;
                end
                else if(count >122) begin
                    init_success_r <= 1'b1;
                    init_system_v_ena_r <= 1'b0;
                    init_system_v_wea_r <= 1'b0;
                    init_system_v_addra_r <= 'b0;
                    init_system_v_r <= 'b0;
                end
            end
        end
    end
endmodule
`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
// 
// Create Date: 2021/12/28 23:34:35
// Design Name: 
// Module Name: testbench
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module testbench(

    );
    reg clk;
    reg rst;
    wire [31:0] init_system_v_doutb;
    initial begin
        clk = 1'b0;
        rst = 1'b0;
        #100 ;
        rst = 1'b1;
    end
    always #4 clk =~ clk;
    top uut_top(
        .clk_in1_p(clk),
        .clk_in1_n(~clk),
        .rst(rst),
        .init_system_v_doutb(init_system_v_doutb)
    );
    
endmodule

④实验结果

 

这个是读取结果,想看写入过程,请在示波器里自行添加波形查看。 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发光的沙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值