串口接收和ps2接收均用到了下降沿检测,但是用法却不尽相同。哪不同?往下看。
图1所示为串口接收的一个数据帧(8位数据,无校验)。当检测到下降沿后,串口接收启动。启动过程为:延时一个波特率周期;依次接收各个数据位。停止位后,启动过程结束。在verilog编程中,通常定义一个reg量,检测到下降沿后,将该量置为状态1。在状态1下,接收数据。
下面是一个例子:
……
reg FLAG;
……
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
always @ (posedge clk )
begin rx_1 <= rx;
rx_2 <= rx_1;
rx_3 <= rx_2;
end
always @ (posedge clk )
if(rx_3 == 1 && rx_2 == 0)
FLAG <= 1;
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
图1 串口数据帧
图2所示为ps2接收的一个数据帧。ps2为2线通信,检测到下降沿后,启动接收。各数据为均在时钟线的下降沿接收。在verilog编程中,则是定义一个wire量。特权的做法是:
……
wire neg_ps2k_clk;
……
always @ (posedge clk or negedge rst_n) begin
if(!rst_n)
begin
ps2k_clk_r0 <= 1'b0;
ps2k_clk_r1 <= 1'b0;
ps2k_clk_r2 <= 1'b0;
end
else begin
ps2k_clk_r0 <= ps2k_clk;
ps2k_clk_r1 <= ps2k_clk_r0;
ps2k_clk_r2 <= ps2k_clk_r1;
end
end
assign neg_ps2k_clk = ~ps2k_clk_r1 & ps2k_clk_r2;
每一个下降沿都反映到neg_ps2k_clk。
图2 ps2数据帧
串口定义reg量,是因为检测到下降沿后,后面各位处理无需再检测,只要按波特率的节奏处理即可,或延时或接收。在此过程中,reg量保持不变。这和reg量的性质吻合很好。
ps2中定义wire量,是因为每位都需要在下降沿接收,因此每位都需要检测下降沿。这和wire量的性质吻合很好。
应用和语言的结合,可谓相得益彰。
ilove314_323192455 2010-6-15 21:15