📄 receice.v
字号:
module receice(rxd,clock,sbuf);
//9600BPS,8位数据,1位停止位
input rxd;
input clock;
output [7:0] sbuf;
reg [3:0] count_reg; //RXD数据状态计数器
reg [9:0] uart_buf; //串行数据接收缓冲区
reg [3:0] bit_cnt; //串行数据当前位计数
reg [2:0] bit_collect; //采集数据缓冲区
reg [6:0] clock_div; //波特率时钟分频:9600*16=11.0592/72
reg clock_pluse; //状态计数器开始标志
reg rxd_start_reg; //串行接收开始标志
reg rxd_end; //串行接收接收标志
reg rxd_dat;
//时钟分频,产生一个9600*16的频率
always @(negedge clock)
begin
if (clock_div<7'd72)
begin
clock_div=clock_div+1;
clock_pluse=0;
end
else
begin
clock_div=0;
clock_pluse=1;
end
end
//接收解码
always @(posedge clock_pluse)
begin
if (rxd_start_reg==1'b0)
begin
//检测开始位
if (rxd==1'b0)
begin
rxd_start_reg=1'b1;
count_reg=4'h0;
bit_cnt=4'h0;
end
end
else
begin
//接收状态频率微调
if (count_reg < 4'he)
count_reg=count_reg+1;
else
count_reg=0;
if (count_reg==4'h6) //数据采集
bit_collect[0]=rxd;
if (count_reg==4'h7)
bit_collect[1]=rxd;
if (count_reg==4'h8)
begin
bit_collect[2]=rxd;
rxd_dat=(bit_collect[0] & bit_collect[1]) | (bit_collect[1] & bit_collect[2]) | (bit_collect[0] & bit_collect[2]);
uart_buf=uart_buf>>1;
uart_buf[9]=rxd_dat;
bit_cnt=bit_cnt+1;
if (bit_cnt==4'h1 && uart_buf[0]==1'b1)
begin
rxd_start_reg=0;
end
end
//检测接收结束
if (bit_cnt > 4'h9)
begin
rxd_end=1;
rxd_start_reg=0;
end
end
end
assign sbuf=~uart_buf[8:1];
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -