BAOBAO123 发表于 2012-11-17 14:48:18

求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

BAOBAO123 发表于 2012-11-17 14:50:53

这个让我思考了好几天,一直都让我费解。刚开始想是多个位的,比如两个字节才把它分成16位,可最后觉得还是按照帧的方式来传送的。

hell-prototypes 发表于 2012-11-17 21:38:48

4'b1111: 貌似是用来自动循环发送:“1 EDA\n"

BAOBAO123 发表于 2012-11-18 11:17:29

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]
查看完整版本: 求verilog串口程序解析?