1、Soc读写是如何实现的?
读有效: mem_rd 读写地址:mem_rw_addr, 读取的数据mem_rd_dat, 读取数据有效:mem_rd_datvld, 写有效 mem_wr, 写数据mem_wr_dat
2、读清是如何实现的?
代码中data_err_dy实现了读清功能,data_err:1表示有效,存在错误数据,在mem总线读取之前,data_err_dy一直保持为1,mem总线读取后,将data_err_dy清零。
module soc_mem_wr
(
input soc_clk ,
input soc_rst_n ,
input mem_rd ,
input mem_wr ,
input [9:0] mem_rw_addr ,
input [31:0] mem_wr_dat ,
output reg [31:0] mem_rd_dat ,
output reg mem_rd_datvld ,
input data_err ,
output reg send_data_enable ,
output reg data_down_req
);
reg data_err_dy ;
always @ (posedge soc_clk or negedge soc_rst_n) begin
if(!soc_rst_n)begin
send_data_enable <= 1'b0;
data_down_req <= 1'b0 ;
end
else begin
if(mem_wr)
case(mem_rw_addr)
10'h0 : send_data_enable <= mem_wr_dat[0] ;
10'h1 : data_down_req <= mem_wr_dat[0] ;
default : ;
endcase
end
always @ (posedge soc_clk or negedge soc_rst_n) begin
if(!soc_rst_n)
mem_rd_datvld <= 1'b0 ;
else
mem_rd_datvld <= mem_rd ;
always @ (posedge soc_clk or negedge soc_rst_n) begin
if(!soc_rst_n)
mem_rd_dat <= 32'b0;
else
if(mem_rd)
case(mem_rw_addr)
10'h0 : mem_wr_dat <= {31'b0,send_data_enable } ;
10'h1 : mem_wr_dat <= {31'b0,data_down_req } ;
10'h2 : mem_wr_dat <= {31'b0,data_err_dy } ;
default : mem_wr_dat <= 32'hffff_ffff ;
endcase
end
//读清是如何实现的
always @ (posedge soc_clk or negedge soc_rst_n) begin
if(!soc_rst_n)
data_err_dy <= 1'b0;
else
data_err_dy <= (mem_rd&(mem_rw_addr==10'h2))? 1'b0 :
data_err_dy ? data_err_dy : data_err ;
endmodule