求verilog串口程序解析?
最近在学习串口方面的程序,研究了一段时间没弄定,在网上找了很长时间也没弄定,求个位大神帮忙解析下。用的是MAX232,串口通信就是先起始位——8个数据位——奇偶校验位(可以没有)——停止位就可以了。可下面这段程序让我一直不能费解。当中发送完了停止位之后又有4'b1111:begin...,这部分是为什么,我通过串口知道它是现实的数据的部分?其中clkbaud_tras;//以波特率为频率的发送使能信号。哪位能说下了停止位之后又有4'b1111:begin...,这究竟为什么是要这样呢?鄙人刚开始学习,不足之处望谅解。
部分程序如下:
always@(posedge clkbaud8x or negedge rst)
begin
if(!rst) begin
txd_reg<=1;
trasstart<=0;
txd_buf<=0;
state_tras<=0;
send_state<=0;
key_entry2<=0;
end
else begin
if(!key_entry2) begin
if(key_entry1) begin
key_entry2<=1;
txd_buf<=8'd50; //"2"
end
end
elsebegin
case(state_tras) //发送状态寄存器
4'b0000: begin//发送起始位
if(!trasstart&&send_state<7)
trasstart<=1;
else if(send_state<7) begin
if(clkbaud_tras) begin
txd_reg<=0;
state_tras<=state_tras+1;
end
end
else begin
key_entry2<=0;
state_tras<=0;
end
end
4'b0001: begin //发送第1位
if(clkbaud_tras) begin
txd_reg<=txd_buf;
txd_buf<=txd_buf;
state_tras<=state_tras+1;
end
end
4'b0010: begin //发送第2位
if(clkbaud_tras) begin
txd_reg<=txd_buf;
txd_buf<=txd_buf;
state_tras<=state_tras+1;
end
end
4'b0011: begin //发送第3位
if(clkbaud_tras) begin
txd_reg<=txd_buf;
txd_buf<=txd_buf;
state_tras<=state_tras+1;
end
end
4'b0100: begin //发送第4位
if(clkbaud_tras) begin
txd_reg<=txd_buf;
txd_buf<=txd_buf;
state_tras<=state_tras+1;
end
end
4'b0101: begin //发送第5位
if(clkbaud_tras) begin
txd_reg<=txd_buf;
txd_buf<=txd_buf;
state_tras<=state_tras+1;
end
end
4'b0110: begin //发送第6位
if(clkbaud_tras) begin
txd_reg<=txd_buf;
txd_buf<=txd_buf;
state_tras<=state_tras+1;
end
end
4'b0111: begin //发送第7位
if(clkbaud_tras) begin
txd_reg<=txd_buf;
txd_buf<=txd_buf;
state_tras<=state_tras+1;
end
end
4'b1000: begin //发送第8位
if(clkbaud_tras) begin
txd_reg<=txd_buf;
txd_buf<=txd_buf;
state_tras<=state_tras+1;
end
end
4'b1001: begin //发送停止位
if(clkbaud_tras) begin
txd_reg<=1;
txd_buf<=8'h55;
state_tras<=state_tras+1;
end
end
4'b1111:begin
if(clkbaud_tras) begin //以波特率为频率的发送使能信号
state_tras<=state_tras+1;
send_state<=send_state+1;
trasstart<=0;
case(send_state)
3'b000:
txd_buf<=8'd49;//"1"
3'b001:
txd_buf<=8'd32;//" "
3'b010:
txd_buf<=8'd69;//"E"
3'b011:
txd_buf<=8'd68;//"D"
3'b100:
txd_buf<=8'd65;//"A"
3'b101:
txd_buf<=8'd10;//"e"
default:
txd_buf<=0;
endcase
end
end
default: begin
if(clkbaud_tras) begin
state_tras<=state_tras+1;
trasstart<=1;
end
end
endcase
end
end
end
这个让我思考了好几天,一直都让我费解。刚开始想是多个位的,比如两个字节才把它分成16位,可最后觉得还是按照帧的方式来传送的。 4'b1111: 貌似是用来自动循环发送:“1 EDA\n" hell-prototypes 发表于 2012-11-17 21:38 static/image/common/back.gif
4'b1111: 貌似是用来自动循环发送:“1 EDA\n"
这个是自动循环发送“1 EDA\n“,可不是一帧数据可以看成先起始位——8个数据位——停止位。可后面来一个4'b1111这是为什么,循环发送的应该在8个数据位中吧,当我们超过8位,就需要把它拆分成两个字节。不知道我这种理解是哪里出差了。
页:
[1]