fshc之请求仲裁机制的代码分析

 1 always@(posedge spi_clk or negedge spiclk_rst_n)
 2 begin
 3    if(~spiclk_rst_n)
 4       arbiter2cache_ack_r <=1'b0;
 5    else if(cache_req_sclk && flash_idle && ~atom_op_en_sync2 && ~arbiter2mcu_ack_r)
 6        arbiter2cache_ack_r <=1'b1;
 7     else if(mcu_req_arb && flash_idle && ~arbiter2cache_ack_r)
 8        arbiter2cache_ack_r <=arbiter2cache_ack_r;
 9     else
10        arbiter2cache_ack_r <=1'b0; 
11 end
12 
13 always@(posedge spi_clk or negedge spiclk_rst_n)
14  begin
15     if(~spiclk_rst_n)
16        arbiter2mcu_ack_r <=1'b0;
17     else if(cache_req_sclk && flash_idle && ~atom_op_en_sync2 && ~arbiter2mcu_ack_r)
18     arbiter2mcu_ack_r <=arbiter2mcu_ack_r;
19      else if(mcu_req_arb && flash_idle && ~arbiter2cache_ack_r)
20         arbiter2mcu_ack_r <=1'b1;
21      else
22         arbiter2mcu_ack_r <=1'b0;
23 end

两个always语句块实现了三条功能:

1.cache/mcu请求如果,mcu请求已经访问flash,则cache请求不能break该访问,只能等待此次访问结束才会响应cache的访问。cache先请求也同理。两个always语句参考对比看,不要只看一个。

2.cache/mcu请求若同时有效,则cache请求的优先级高于MCU的请求。主要利用ifelse语句的优先级实现的。第6行代码优先级高于第20行代码。

3.如果atom_op_en_sysn2有效,只响应MCU的请求。

4.注意本模块处于sclk时钟域。但输入处于hclk时钟域。通过这两个always看不出来,呵呵。

posted @ 2015-02-04 13:47  CHIPER  阅读(404)  评论(0编辑  收藏  举报