在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2500|回复: 8

[求助] 刚开始学verilog 写了个uart程序,请教大侠啦;每次都丢最后一位

[复制链接]
发表于 2011-12-24 19:41:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
我用led显示串口输入的数据,每次都丢最后一位,而且最后一位总是1

代码:
  always @ (posedge clk or negedge rst_n)
if(!rst_n) begin
   rx_temp_data <= 8'd0;
   num <= 4'd0;
   rx_data_r <= 8'd0;
  end
else if(rx_int) begin //接收数据处理
  if(clk_bps) begin //读取并保存数据,接收数据为一个起始位,8bit数据,1个结束位  
    num <= num+1'b1;
    case (num)
      4'd1: rx_temp_data[0] <= rs232_rx; //锁存第0bit
      4'd2: rx_temp_data[1] <= rs232_rx; //锁存第1bit
      4'd3: rx_temp_data[2] <= rs232_rx; //锁存第2bit
      4'd4: rx_temp_data[3] <= rs232_rx; //锁存第3bit
      4'd5: rx_temp_data[4] <= rs232_rx; //锁存第4bit
      4'd6: rx_temp_data[5] <= rs232_rx; //锁存第5bit
      4'd7: rx_temp_data[6] <= rs232_rx; //锁存第6bit
      4'd8: rx_temp_data[7] <= rs232_rx; //锁存第7bit
      default: ;
     endcase
   end
  else if(num == 4'd10) begin  //我们的标准接收模式下只有1+8+1=10bit的有效数据
    num <= 4'd0;   //接收到STOP位后结束,num清零
    rx_data_r <= rx_temp_data; //把数据锁存到数据寄存器rx_data中
   end
  end
 楼主| 发表于 2011-12-24 19:43:13 | 显示全部楼层
我看 好像是第8bit 为1 的话,fpga把那一位当成 结束位 了,不明白
发表于 2011-12-24 23:06:36 | 显示全部楼层
rx_int ,clk_bps 这2个信号时怎么来的 呢?
发表于 2011-12-25 01:27:56 | 显示全部楼层
uart有停止位吧,而且停止位为1吧,会在接收时去除吧,这个明显有问题,为何用两个时钟,感觉看不明白你的,看看标准的吧
发表于 2011-12-25 13:43:25 | 显示全部楼层
别的不说,先把代码写规范了,clk在你敏感列表里,但代码里完全没用到,反而用到了clk_bps
发表于 2011-12-25 13:57:49 | 显示全部楼层
uart是异步的,得用快点的时钟去采,8倍或16倍,中间采样几次做个判决,3取2或5取3
发表于 2011-12-27 17:12:20 | 显示全部楼层
初学就弄UART呀,我惭愧呀
发表于 2011-12-28 21:36:55 | 显示全部楼层
觉得case不应该写在时序块里,应该单独拿出来放在组合逻辑always块里吧。不然你的这个层次有点乱啊,条件都不是很完备。
发表于 2012-1-10 20:24:28 | 显示全部楼层
同步时钟啊可以综合
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-6 07:54 , Processed in 0.031840 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表