新手入门
- 积分
- 8
- 金钱
- 8
- 注册时间
- 2023-9-26
- 在线时间
- 1 小时
|
1金钱
按照视频内容学习,结果在线抓取信号 读到数据全为0,其他信号正常
module IP_RAM1(
input sys_clk,
input sys_rst_n
);
wire ram_en ; //RAM使能
wire ram_w_r ; //RAM读写控制,高电平对RAM写操作(读写计数器r_w_cnt0-31),低电平对RAM读操作(读写计数器r_w_cnt32-63)
wire [4:0] ram_addr ; //RAM地址
wire [7:0] ram_wr_data; //
wire [7:0] ram_rd_data; //使用wire型变量表示在顶层为例化的RAM核之间与RAM_WR之间进行传递
////// RAM_IP核////////
blk_mem_gen_0 u_blk_mem_gen_0 (
.clka(sys_clk), // input wire clka
.rsta(sys_rst_n), // input wire rsta
.ena(ram_en), // input wire ena
.wea(ram_w_r), // input wire [0 : 0] wea
.addra(ram_addr), // input wire [4 : 0] addra
.dina(ram_wr_data), // input wire [7 : 0] dina
.douta(ram_rd_data) // output wire [7 : 0] douta
//.rsta_busy() // output wire rsta_busy RMA忙指示信号 该实验不需要可以把这行删掉
);
//////////RAM_WR 驱动模块的例化 ///////////////
IP_RAM1_WR u_IP_RAM1_WR(
.sys_clk (sys_clk) ,
.sys_rst_n (sys_rst_n) ,
//下面的变量参数需要和RAM--IP核进行连接,因此需要在top模块里 定义wire数据
.ram_en (ram_en) ,
.ram_w_r (ram_w_r) ,
.ram_addr (ram_addr) ,
.ram_wr_data (ram_wr_data) ,
.ram_rd_data (ram_rd_data)
);
endmodule
module IP_RAM1_WR(
input sys_clk,
input sys_rst_n,
input [7:0] ram_rd_data , // 输入引脚, 用于从RAM中读出数据的寄存器,input通常为wire型
output ram_en , // 输出引脚, 用于驱动RAM的 使能,
output ram_w_r , // 输出引脚,用于驱动RAM的读写控制, 为1时控制 写RAM,为0时控制读RAM。
output reg [4:0] ram_addr , // 输出引脚,用于驱动RAM的地址选择,RAM-IP核地址设置读写深度为32,即可寻址范围为0-31,用5位向量可覆盖全部地址
output reg [7:0] ram_wr_data // 输出引脚, 用于往RAM中写数据的寄存器,RAM-IP核读写的数据设置为8bit,因此读写数据为8bit.
);
reg [5:0] r_w_cnt; //定义读和写 控制 的计数器
assign ram_en= sys_rst_n; //不复位时,就控制使能RAM
assign ram_w_r=((ram_en==1)&&(r_w_cnt<=31))?1'b1:1'b0; //用于驱动RAM的读写,判断条件是读写控制计数器r_w_cnt<32
//第一个计数器 用于控制读写计数器的增加设置
// 计数器cnt 从0-31表示用来读写控制的 写,32-63 表示用来进行 读
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
r_w_cnt<=1'b0;
else if (r_w_cnt==6'd63) // 计数器cnt 计到63后清零,没到的话继续+1
r_w_cnt<=1'b0;
else
r_w_cnt<=r_w_cnt+1'b1;
end
//第二个 计数器用于产生往RAM中写的数据,这里造了0-31的数据
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
ram_wr_data<=6'b0; //复位时,往RAM中写数据的寄存器清零,
else if(r_w_cnt<=6'd31)
ram_wr_data<=ram_wr_data+1'b1;
else
ram_wr_data<=6'b0;
end
//第三个 计数器用于地址寄存器的控制
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
ram_addr<=0;
else if( ram_addr==6'd31)
ram_addr<=0;
else
ram_addr<=ram_addr+1'b1;
end
///// //ILA 模块监控///////////
ila_0 your_instance_name (
.clk(sys_clk), // input wire clk
.probe0(sys_rst_n), // input wire [0:0] probe0
.probe1(ram_en), // input wire [0:0] probe1
.probe2(ram_w_r), // input wire [0:0] probe2
.probe3(ram_addr), // input wire [4:0] probe3
.probe4(ram_wr_data), // input wire [7:0] probe4
.probe5(ram_rd_data), // input wire [7:0] probe5ram_read_data
.probe6(r_w_cnt) // input wire [5:0] probe6
);
endmodule
|
|