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
④实验结果
这个是读取结果,想看写入过程,请在示波器里自行添加波形查看。