搜索
bottom↓
回复: 3

吐血求助啊

[复制链接]

出0入0汤圆

发表于 2010-4-13 20:31:08 | 显示全部楼层 |阅读模式
难道我真的就没有学FPGA的天分吗?~~~~~~~

帮我看下这个超级简单的uart的接收程序



顶层

module uart_test(clk,rst,rx,sig1,qout);
input clk,rst;
input rx;
output sig1;                 //sig1=1表示正在接收,sig1=0检测起始位
output [7:0] qout;        //输出我直接接lED了
wire clk16;
fredivn u1(.clk(clk),.clkout(clk16));
rxd3 u2(.clk(clk16),.rst(rst),.rx(rx),.sig1(sig1),.q(qout));
endmodule



分频

module fredivn(clk,clkout);
  input clk;
  output clkout;
  reg [16:0]counter;
  reg tmp_clk;
  always @(posedge clk) begin
    if(counter==17'd5208)        //600bps*16  波特率600  16倍波特率  晶50M
      begin
        tmp_clk=~tmp_clk;
       counter=0;
      end
    else
      counter=counter+1;
  end
assign clkout = tmp_clk;
endmodule



接收程序

module rxd3(clk,rst,rx,sig1,q);
  input clk,rst;
  input rx;
  output sig1;                  //用于判断是否正在接收
  output [7:0]q;
  reg sig1;           
  reg [3:0]sig2;               //sig2=8判断起始位0    sig2=16接收数据间隔
  reg [3:0]i;
  reg [4:0]sig3;              //接收数据的位数
  reg [7:0]q;
  

  always @(posedge clk) begin
    if(rst) begin
      sig1=0;
      sig2=0;
      sig3=0;
      q=0;
      i=0;
    end
  else
    if(~sig1)
      begin
        if(sig2==8)
          begin
            sig2=0;
            sig1=1;           
          end
        else
          begin
            if(~rx)
              sig2=sig2+1;
            else
              sig2=0;
          end
      end
    else                     //start to receive char
      begin
        if(sig2==16)
          begin
            q=q<<1;
            q[0]=rx;
            sig2=0;
            sig3=sig3+1;      //received char's counter
            if(sig3==8)
              begin
                sig3=0;
                sig1=0;      //transmit over
              end
          end
        else
          sig2=sig2+1;
      end
  end

endmodule



为什么下载到板后,用串口调试软件试过没有反应,到底哪里出了问题了,

我要疯了。请大家帮帮忙

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

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

出0入0汤圆

发表于 2010-4-13 21:20:43 | 显示全部楼层
点击此处下载 ourdev_546170.zip(文件大小:2.04M) (原文件名:鄙人写得Verilog例程若干.zip)

出0入0汤圆

发表于 2010-4-13 23:18:08 | 显示全部楼层
程序中好像没有对接收数据位的判决做处理吧。
个人觉得在UART的串行通信中,波特率是设置和数据的采样时刻是至关重要的,否则就无法采集到正确的数据。一般而言,在时钟的边缘进行数据位的判决,且最好最好是在每一数据位的中点进行判决和采样。

出0入0汤圆

 楼主| 发表于 2010-4-14 10:30:57 | 显示全部楼层
回复【1楼】tear086 .COM 缺氧
-----------------------------------------------------------------------

谢谢你呀,我认真看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 19:26

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

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