电子说
1.什么是控制交互信号?
答:控制交互信号用于作为控制指示信号,比如当某个电路模块有数据输入端口data,但是电路不可能每个时钟周期都对端口输入的数据做处理,那一般上一级电路会同时给出一个指示信号,比如in_valid,用于表示当前端口data输入的数据是有效的,电路需要对其进行采集或做运算处理。同样的对于电路模块输出数据时,也需要给出类似的信号,表明当前输出端口的数据是否有效,例如o_valid信号等。
还有就是比如像FIFO,RAM的读写使能信号,用于控制FIFO,RAM是否需要正常进行工作;读写控制信号用于指示是读还是写操作行为。以及总线的一系列控制信号等,CPU的指令等等,都可以说是控制信号。常用于作为控制模块产生控制信号的就是状态机。
总结一下,就是没有控制信号只有运算电路,电路就是块板砖,我行我素,无任何意义,当我们设计电路模块的时候,往往最先需要搞明白的就是本电路模块的交互控制接口的时序。
2.跨时钟域时,控制信号从慢时钟域(时钟频率较小)到快时钟域(时钟频率较大)快递时会存在什么问题呢?
答:如下图所示,CLK1为慢时钟域的时钟,IN_VALID信号由慢时钟域电路生成,比如用于指示DATA(由CLK1时钟域电路生成)的有效,或者指示完成一次运算。原本IN_VALID在CLK1时钟域下只有一个脉冲宽度,表示完成一次运算。但是跨时钟域传递到CLK2(快时钟域下),CLK2由于频率较快,多个上升沿都采集到IN_VALID为高,在CLK1时钟域下就会误以为完成了多次运算(或者连续多个DATA为有效的)。
3.上述问题怎么解决呢?
答:如果需要跨时钟域的控制信号不会出现多个脉冲连续为高的情况的话,则可以在快时钟域通过边沿检测电路解决。电路如下。将最后的IN_VALID_CLK2作为最后的控制信号。
其波形如下:
4.如果IN_VALID有多个连续的为高电平的情况怎么办?
答:如果IN_VALID是用来传递数据的,用来指示DATA有效的,则可以采用一个异步FIFO将数据进行缓存,将IN_VALID作为FIFO的写使能信号。如若是其他的这种情况则需要按情况来定制电路。
拓展问题
1.脉冲上升沿检测电路(被检测的脉冲宽度不小于一个时钟周期)。
2.脉冲下降沿检测电路(被检测的脉冲宽度不小于一个时钟周期)
3.脉冲边沿(IN_VALID的下降沿、上升沿时电路都会输出一个高脉冲)检测电路(被检测的脉冲宽度不小于一个时钟周期)。
下面给出边沿检测电路的示例Verilog代码:
向上滑动阅览
module EDGE_DEC(
input clk2,
input rst_n,
input in_valid,
output in_valid_edge
);
reg in_valid_d;
reg in_valid_dd;
always @( posedge clk2 or negedge rst_n ) begin
if( !rst_n )
in_valid_d <= 1'b0;
else
in_valid_d <= in_valid;
end
always @( posedge clk2 or negedge rst_n ) begin
if( !rst_n )
in_valid_dd <= 1'b0;
else
in_valid_dd <= in_valid_d;
end
assign in_valid_edge = in_valid_d ^ in_valid_dd;
endmodule
全部0条评论
快来发表一下你的评论吧 !