|
//摘抄自周立功的程序
//功能:实现串口接收数据
/*****************串口接收模块********************/
/** **/
/** **/
module rec(clk,clkout,Dataout,RXD,RI);
input clk,RXD;
output clkout,RI;
output[7:0] Dataout; //并行数据输出
reg StartF,RI;
reg[9:0] UartBuff; //接收缓存区
reg[3:0] count,count_bit;
reg[15:0] cnt;
reg[2:0] bit_collect; //采集数据缓存区
wire clk_equ,bit1,bit2,bit3,bit4;
parameter cout=312; //始终是48MHz,所以16*9600的分频数为312.5,这里取整数
/****************波特率发生进程*******************/
always@(posedge clk)
begin
if(clk_equ)
cnt=16'd0;
else
cnt=cnt+1'b1;
end
assign clk_que=(cnt==cout);
assign clkout=clk_que;
/****************串口接收主进程*******************/
assign bit1=bit_collect[0]&bit_collect[1];
assign bit2=bit_collect[1]&bit_collect[2];
assign bit3=bit_collect[0]&bit_collect[2];
assign bit4=bit1|bit2|bit3;
always@(posedge clk)
begin
if(clk_equ)
begin
if(!StartF) //是否处于接收状态
begin
if(!RXD)
begin
count=4'b0; //复位计数器
count_bit=4'b0;
RI=1'b0;
StartF=1'b1;
end
else RI=1'b1;
end
else
begin
count=count+1'b1; //位接收状态加1
if(count==4'd6)
bit_collect[0]=RXD; //数据采集
if(count==4'd7)
bit_collect[1]=RXD; //数据采集
if(count==4'd8)
begin
bit_collect[2]=RXD; //数据采集
UartBuff[count_bit]=bit4;
count_bit=count_bit+1'b1; //位计数器加1
if((count_bit==4'd1)&&(UartBuff[0]==1'b1)) //判断起始位是否为0
begin
StartF=1'b0; //标志开始接受
end
RI=1'b0; //中断标志位低
end
if(count_bit>4'd9) //检测是否接受完毕
begin
RI=1'b1; //中断标志位为高标志转换结束
StartF=1'b0;
end
end
end
end
assign Dataout=UartBuff[8:1];
endmodule
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
其中
assign bit1=bit_collect[0]&bit_collect[1];
assign bit2=bit_collect[1]&bit_collect[2];
assign bit3=bit_collect[0]&bit_collect[2];
assign bit4=bit1|bit2|bit3;
以及
if(count==4'd6)
bit_collect[0]=RXD; //数据采集
if(count==4'd7)
bit_collect[1]=RXD; //数据采集
if(count==4'd8)
begin
bit_collect[2]=RXD; //数据采集
UartBuff[count_bit]=bit4;
让我费解,这个有什么用啊?求高人解答哈 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|