|
楼主 |
发表于 2012-2-16 15:50:10
|
显示全部楼层
再来请教
请大家看下边两段代码,五楼和六楼
五楼可以编译,六楼不能编译 五楼是把三个进程放在了一起,六楼单独的~
module test(
input rst, //复位信号
input clk, //输入晶振时钟 50Mhz
input rxd, //串口接收
output test_led,
output err_led
);
reg test_led2;
reg[14:1] clk_count; //分频计数
reg ser_clk; //串口时钟
reg[2:1] ser_sta; //主串口状态 数据是否开始传送 0未开始,空闲 1,数据已开始 2数据已完成,奇偶校验
reg[8:1] ser_dat; //主串口接收数据
reg[3:1] ser_count; //主串口接收数据计数 1-8
reg ser_err; //串口错误 校验错误,终止位错误
assign test_led=test_led2;
assign err_led=ser_err;
always @(posedge clk) //串口分频
begin
if(clk_count==1302)
begin clk_count=0;ser_clk=1;end
else
begin clk_count=clk_count+1;ser_clk=0;end
end
//主串口数据接收
always @(negedge rxd,posedge ser_clk,posedge rst) //下降沿触发起始位
begin
if(rxd==0)
begin
if (ser_sta==0)
begin
ser_sta=1;
ser_err=0;
ser_dat=0;
ser_count=0;
end
end
if(ser_clk==1)
begin
if(ser_sta==2'h1) //有起始信号才开始捕捉数据
begin
//test_led2=!test_led2;
ser_count=ser_count+1;
if(ser_count==8)
ser_sta=2'h2;
else
ser_dat=ser_dat<<1;
ser_dat=ser_dat|rxd;
end
if(ser_sta==2'h2)
begin
ser_err=(rxd==^ser_dat); //校验正确
ser_sta=2'h3;
end
if(ser_sta==2'h3)
begin
ser_err=!(rxd==1); //停止位
ser_sta=2'h0; //结束 待新的开始
if (ser_dat==8'hf0) test_led2=1; else test_led2=0;
end
end
if(rst==1)
ser_sta=0;
end
endmodule |
|