搜索
bottom↓
回复: 3

求verilog串口程序解析?

[复制链接]

出0入0汤圆

发表于 2012-11-17 14:48:18 | 显示全部楼层 |阅读模式
最近在学习串口方面的程序,研究了一段时间没弄定,在网上找了很长时间也没弄定,求个位大神帮忙解析下。用的是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
                else  begin
                        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[0];
                                                txd_buf[6:0]<=txd_buf[7:1];
                                                state_tras<=state_tras+1;
                                         end
                                 end
                                4'b0010: begin //发送第2位
                                        if(clkbaud_tras) begin
                                                txd_reg<=txd_buf[0];
                                                txd_buf[6:0]<=txd_buf[7:1];
                                                state_tras<=state_tras+1;
                                         end
                                 end
                                 4'b0011: begin //发送第3位
                                         if(clkbaud_tras) begin
                                                txd_reg<=txd_buf[0];
                                                txd_buf[6:0]<=txd_buf[7:1];
                                                state_tras<=state_tras+1;
                                         end
                                 end
                                4'b0100: begin //发送第4位
                                        if(clkbaud_tras) begin
                                                txd_reg<=txd_buf[0];
                                                txd_buf[6:0]<=txd_buf[7:1];
                                                state_tras<=state_tras+1;
                                         end
                                 end
                                4'b0101: begin //发送第5位
                                        if(clkbaud_tras) begin
                                                txd_reg<=txd_buf[0];
                                                txd_buf[6:0]<=txd_buf[7:1];
                                                state_tras<=state_tras+1;
                                         end
                                 end
                                4'b0110: begin //发送第6位
                                        if(clkbaud_tras) begin
                                                txd_reg<=txd_buf[0];
                                                txd_buf[6:0]<=txd_buf[7:1];
                                                state_tras<=state_tras+1;
                                         end
                                 end
                                4'b0111: begin //发送第7位
                                        if(clkbaud_tras) begin
                                                txd_reg<=txd_buf[0];
                                                txd_buf[6:0]<=txd_buf[7:1];
                                                state_tras<=state_tras+1;
                                         end
                                 end
                                4'b1000: begin //发送第8位
                                        if(clkbaud_tras) begin
                                                txd_reg<=txd_buf[0];
                                                txd_buf[6:0]<=txd_buf[7:1];
                                                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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-11-17 14:50:53 | 显示全部楼层
这个让我思考了好几天,一直都让我费解。刚开始想是多个位的,比如两个字节才把它分成16位,可最后觉得还是按照帧的方式来传送的。

出0入0汤圆

发表于 2012-11-17 21:38:48 | 显示全部楼层
4'b1111: 貌似是用来自动循环发送:“1 EDA\n"

出0入0汤圆

 楼主| 发表于 2012-11-18 11:17:29 | 显示全部楼层
hell-prototypes 发表于 2012-11-17 21:38
4'b1111: 貌似是用来自动循环发送:“1 EDA\n"

这个是自动循环发送“1 EDA\n“,可不是一帧数据可以看成先起始位——8个数据位——停止位。可后面来一个4'b1111这是为什么,循环发送的应该在8个数据位中吧,当我们超过8位,就需要把它拆分成两个字节。不知道我这种理解是哪里出差了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表