1 前言
回想自己写的某些代码,发现这些代码正好是脉冲与电平信号的相互转换,只是当时并没有深刻认识,因此记下,是为心得。
其实也特别简单。
2 电平转换成脉冲信号(边沿检测)
一个高电平变成低电平;或者
一个低电平变成高电平,那么如何将变化的时刻产生脉冲信号呢?
2.1 高电平变低电平
设电平信号为vol
;
定义一个寄存器reg_r
关键代码:
wire negedge_detect;
assign negedeg_detect = (!vol) && reg_r;
always @ (posedge clk or negedge rstn) begin
if (!rstn)
reg_r <= 1'b0;
else
reg_r <= vol;
end
对应下图:
2.2 低电平变高电平
设电平信号为vol
;
定义一个寄存器reg_r
关键代码:
wire posedge_detect;
assign posedge_detect = vol && (!reg_r);
always @ (posedge clk or negedge rstn) begin
if (!rstn)
reg_r <= 1'b0;
else
reg_r <= vol;
end
对应下图:
即,不论电平如何变换,变换的电平总是能够产生出一个周期的脉冲信号。寄存器reg_r
的信号总是比电平信号延迟一个时钟周期,两者通过逻辑运算,即可得到电平信号到脉冲信号的转换,不过这种方法还有一个更通俗的名字:边沿检测。
3 脉冲信号转电平信号
设脉冲信号为pulse
;
假设在一个系统所有动作完成时,比如状态机跳转完成或者计数器计数到期望值时能够产生一个脉冲信号done
定义一个寄存器pulse_to_vol;
关键代码为:
always @ (posedge clk or negedge rstn) begin
if (!rstn)
pulse_to_vol <= 1'b0;
else if (pulse)
pulse_to_vol <= 1'b1;
else if (done)
pulse_to_vol <= 1'b0;
else
pulse_to_vol <= pulse_to_vol;
end
对应下图:
此即为一个周期的脉冲信号转换成电平信号的方法。