接口模块或IP核顶层模块收到指令后形成相应的操作,接口模块或IP核顶层模块收到指令后落成相应的操作

  本博文设计思想接纳明德扬至简设计法。从前都以由此一些完好无损的案例来享受安排经验,而那篇文章以需求配置多少个寄存器的现象讲述宗旨设计技术。

  本博文设计思想采纳明德扬至简设计法。之前都以透过有个别完好的案例来分享陈设经验,而这篇小说以需要安插三个寄存器的场景讲述大旨设计技术。

  在筹划案例时意识,平时会安顿相比复杂的IP核或驱动一些接口进而操作外设。此时,为了让外设或IP核符合规律干活,须要对其中间五个寄存器进行适量配置来确保在所需格局下正规办事。大家一般先规划接口模块或IP核顶层文件,之后通过操纵模块依照先后顺序自动提交所需指令,如读写等(下边的讲述以只有读写指令为例)。接口模块或IP核顶层模块收到指令后形成相应的操作。

  在规划案例时意识,平日会配备比较复杂的IP核或驱动一些接口进而操作外设。此时,为了让外设或IP核不荒谬工作,要求对其里面多个寄存器举行恰当配置来确保在所需方式下正规干活。我们一般先规划接口模块或IP核顶层文件,之后经过控制模块根据先后顺序自动提交所需指令,如读写等(上面的讲述以唯有读写指令为例)。接口模块或IP核顶层模块收到指令后成功相应的操作。

  第三个难题:怎么样达成多少个寄存器且每种寄存器三个指令的自动化配置?

  第二个难点:如何促成多少个寄存器且逐个寄存器三个指令的自动化配置?

  大家得以在决定模块中确立二个“配置表”,把读写指令以及相应的地方和待写入数据保存其中,然后经过计数器进行指令扫描。那里要求两级计数器,第3流计数1个寄存器的指令数,第1级计数器记录已经操作过的寄存器个数。配置表以always组合逻辑中case语句块方式提交,使用寄存器计数值分别分裂寄存器。区分出待操作寄存器后根据操作计数器解析出读写指令。

  我们得以在支配模块中创设3个“配置表”,把读写指令以及相应的地点和待写入数据保存其中,然后通过计数器进行指令扫描。那里要求两级计数器,第叁流计数二个寄存器的指令数,第叁级计数器记录已经操作过的寄存器个数。配置表以always组合逻辑中case语句块方式提交,使用寄存器计数值分别分裂寄存器。区分出待操作寄存器后依据操作计数器解析出读写指令。

  第二,个难题:当控制模块给出指令时,接口模块或IP核一定能有时光响应么?

  第贰,个难题:当控制模块给出指令时,接口模块或IP核一定能有时光响应么?

  那是我们设计时必要三思的难点:怎么着才能担保交到的命令一定会被下一模块有效地响应?为了达成这一目的,可以在控制(配置)模块和时序接口模块或IP核顶层模块之间放置3个接口衔接模块,结构如下:

  那是大家统筹时须求三思的题材:如何才能确保交到的授命一定会被下一模块有效地响应?为了已毕这一目的,可以在支配(配置)模块和时序接口模块或IP核顶层模块之间放置三个接口衔接模块,结构如下:

图片 1

图片 2

  根据上述必要定义衔接模块成效:在下游模块准备好后才让上游模块ctrl给出下一指令,否则等待。并成功读出的可行数据送到上游模块的天职。很简短,下游模块输出给控制模块1个信号rdy,当它为高电平常意味着当前尚未指令或许上一命令已响应完结。控制模块中指令计数器的原来计数条件和rdy==1条件逻辑与就完事了上述功用。那里需求尤其注意的是:rdy信号必须以结合逻辑格局提交,否则由于rdy信号晚一拍输出,上游模块会产出误认情状。核心代码如下:

  依照上述须要定义衔接模块成效:在下游模块准备好后才让上游模块ctrl给出下一命令,否则等待。并落成读出的实用数据送到上游模块的职分。很粗略,下游模块输出给控制模块几个信号rdy,当它为高电经常表示当前从未有过指令或然上一下令已响应落成。控制模块中指令计数器的本来面目计数条件和rdy==1条件逻辑与就到位了上述成效。那里必要尤其注意的是:rdy信号必须以组合逻辑方式提交,否则由于rdy信号晚一拍输出,上游模块会并发误认情形。主旨代码如下:

支配模块中:

决定模块中:

 1     //读写操作计数器    
 2      always  @(posedge clk or negedge rst_n)begin
 3         if(rst_n==1'b0)begin
 4             rw_cnt <= 0;
 5         end
 6         else if(add_rw_cnt) begin
 7             if(end_rw_cnt)
 8                 rw_cnt <= 0;
 9             else
10                 rw_cnt <= rw_cnt + 1;
11         end
12     end
13 
14     assign  add_rw_cnt = con_flag && rdy;
15     assign  end_rw_cnt = add_rw_cnt && rw_cnt==RW_NUM-1;    
16 
17    //写使能 wr_flag和rd_flag由配置表给出
18     always  @(posedge clk or negedge rst_n)begin
19         if(rst_n==1'b0)begin
20             wr_en <= 1'b0;
21         end
22         else if(add_rw_cnt && rw_cnt==0 && wr_flag)begin
23             wr_en <= 1'b1;
24         end
25         else begin
26             wr_en <= 1'b0;
27         end
28     end
29 
30    //读使能
31     always  @(posedge clk or negedge rst_n)begin
32         if(rst_n==1'b0)begin
33             rd_en <= 1'b0;
34         end
35         else if(add_rw_cnt && rw_cnt==1 && rd_flag)begin
36             rd_en <= 1'b1;
37         end
38         else begin
39             rd_en <= 1'b0;
40         end
41     end
 1     //读写操作计数器    
 2      always  @(posedge clk or negedge rst_n)begin
 3         if(rst_n==1'b0)begin
 4             rw_cnt <= 0;
 5         end
 6         else if(add_rw_cnt) begin
 7             if(end_rw_cnt)
 8                 rw_cnt <= 0;
 9             else
10                 rw_cnt <= rw_cnt + 1;
11         end
12     end
13 
14     assign  add_rw_cnt = con_flag && rdy;
15     assign  end_rw_cnt = add_rw_cnt && rw_cnt==RW_NUM-1;    
16 
17    //写使能 wr_flag和rd_flag由配置表给出
18     always  @(posedge clk or negedge rst_n)begin
19         if(rst_n==1'b0)begin
20             wr_en <= 1'b0;
21         end
22         else if(add_rw_cnt && rw_cnt==0 && wr_flag)begin
23             wr_en <= 1'b1;
24         end
25         else begin
26             wr_en <= 1'b0;
27         end
28     end
29 
30    //读使能
31     always  @(posedge clk or negedge rst_n)begin
32         if(rst_n==1'b0)begin
33             rd_en <= 1'b0;
34         end
35         else if(add_rw_cnt && rw_cnt==1 && rd_flag)begin
36             rd_en <= 1'b1;
37         end
38         else begin
39             rd_en <= 1'b0;
40         end
41     end

 衔接模块中:

 衔接模块中:

 1     //空闲输出
 2     always@(*)begin
 3         if(rd_en || wr_en || rd_com || wr_com)
 4             rdy <= 0;
 5         else 
 6             rdy <= 1;
 7     end
 8     
 9     //命令区间标志位 表示正在响应该命令  状态机实现时序接口模块情况
10     always@(posedge clk or negedge rst_n)begin
11         if(!rst_n)
12             wr_com <= 0;
13         else if(wr_en)
14             wr_com <= 1;
15         else if(wr_com && stop2idle)
16             wr_com <= 0;
17     end    
18     
19     always@(posedge clk or negedge rst_n)begin
20         if(!rst_n)
21             rd_com <= 0;
22         else if(rd_en)
23             rd_com <= 1;
24         else if(rd_com && stop2idle)
25             rd_com <= 0;
26     end    
27     
28     //地址更新
29     always@(posedge clk or negedge rst_n)begin
30         if(!rst_n)
31             addr_tmp <= 0;
32         else if(wr_en || rd_en)
33             addr_tmp <= addr;
34     end
 1     //空闲输出
 2     always@(*)begin
 3         if(rd_en || wr_en || rd_com || wr_com)
 4             rdy <= 0;
 5         else 
 6             rdy <= 1;
 7     end
 8     
 9     //命令区间标志位 表示正在响应该命令  状态机实现时序接口模块情况
10     always@(posedge clk or negedge rst_n)begin
11         if(!rst_n)
12             wr_com <= 0;
13         else if(wr_en)
14             wr_com <= 1;
15         else if(wr_com && stop2idle)
16             wr_com <= 0;
17     end    
18     
19     always@(posedge clk or negedge rst_n)begin
20         if(!rst_n)
21             rd_com <= 0;
22         else if(rd_en)
23             rd_com <= 1;
24         else if(rd_com && stop2idle)
25             rd_com <= 0;
26     end    
27     
28     //地址更新
29     always@(posedge clk or negedge rst_n)begin
30         if(!rst_n)
31             addr_tmp <= 0;
32         else if(wr_en || rd_en)
33             addr_tmp <= addr;
34     end

   到此,寄存器自动化配置中八个重大难点一锤定音消除。本文是自个儿在设计视频头图像采集和以太网八个案例进程中统计所得。自身觉得这种规划思想分外具有通用性,并不只局限于那多少个案例,由此单独提议,以备今后记忆和录取。

   到此,寄存器自动化配置中三个重点难题决定化解。本文是自家在安插录制头图像采集和以太网七个案例进度中总计所得。自己认为那种布置思想格外富有通用性,并不仅局限于那三个案例,由此单独指出,以备未来追思和选定。