IC设计基础001:寄存器读写,读清是如何实现的

博客主要探讨了Soc读写及读清功能的实现。Soc读写涉及读有效、读写地址、读取数据及写有效等要素;读清功能由代码中data_err_dy实现,当data_err为1表示存在错误数据,mem总线读取前data_err_dy保持为1,读取后清零。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值