📄 rcvr.v
字号:
module rcvr (data_out,received,s_in,clock,reset);
input s_in,clock,reset;
output [7:0] data_out;
output received;
parameter band_cnt=16;//代表波特率输入数据,数字代表接收时钟的分频数
reg s_in1,s_in2,rxclk_enable,received;
reg [3:0] clkdiv,control_cnt,clken;
reg [7:0] rsr,rbr;
reg rxclk,read_strobe;//rxclk接收时钟
/*输入数据寄存器,用于下降沿检测*/
always @ (posedge clock)
begin s_in1<=s_in; s_in2<=s_in1; end
/*接收时钟使能,在时钟使能范围内产生接收时钟并对输入数据采样*/
always @ (posedge clock or posedge reset)
begin if (reset) clken<=1'b0;
else begin
if ( s_in==0)
begin if(clken>8) clken<=1'b0;
else clken=clken+1;
end
else clken<=1'b0;
end
end
always @ (posedge clock or posedge reset)
begin if (reset) rxclk_enable<=1'b0;
else if (clken==8)
begin rxclk_enable<=1'b1; end
else if (control_cnt==10)
rxclk_enable<=1'b0;
end
/*控制计数器*/
always @ (posedge rxclk or posedge reset or negedge rxclk_enable)
begin if (reset) control_cnt<=0;
else begin if (!rxclk_enable) control_cnt<=0;
else control_cnt<= control_cnt+1;
end
end
/*是否工作标志,1为工作,0为空闲*/
always @ (posedge clock or posedge reset )
begin if (reset) received<=1'b0;
//else if ((control_cnt>=1 && control_cnt<=9) )
// received<=1'b1;
else begin //(control_cnt==11)
received<=rxclk_enable;
read_strobe<=rxclk_enable;
end
end
/*产生接收时钟*/
always @ (posedge clock or posedge reset )
begin if (reset) clkdiv<=0;
else begin
if (rxclk_enable)
begin if (clkdiv>=(band_cnt-1)) clkdiv<=0;
else clkdiv<=clkdiv+1;
end
end
end
/*接收数据进程:
rsr: receiver serial register :接收移位寄存器.
rbr: receiver buffer register 接收缓冲寄存器*/
always @ (posedge clock or posedge reset )
begin if (reset) rxclk<=0;
else if(clkdiv>=band_cnt-1) rxclk<=1;
else rxclk<=0;
end
//assign rxclk=(clkdiv>=band_cnt-1)?1:0;
always @ (posedge rxclk or posedge reset )
if (reset)
begin rsr<=8'b0;
rbr<=8'b0;
// framing_error<=1'b0;
end
else begin if (control_cnt>=0 && control_cnt<=7)
begin rsr[7]<=s_in2;
rsr[6:0]<= rsr[7:1];
end
else if (control_cnt==8)
rbr<=rsr;
// else if ( (control_cnt==9)&&(s_in2!==1'b0) )
// framing_error<=1'b1;
//else framing_error<=1'b0;
end
/*always @ (posedge rxclk or posedge reset )
begin if (reset) data_out=0;
else if(rxclk_enable) data_out<=rsr;
else data_out=8'bz;
end*/
assign data_out= ! read_strobe ? rsr : 8'bz;//并行数据输出
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -