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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3800|回复: 9

[求助] uart部分的代码疑问

[复制链接]
发表于 2012-6-17 19:08:48 | 显示全部楼层 |阅读模式

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

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

x
/* 把要发送的数据拷贝到tx_rdy_data  */
always @ ( posedge clk or posedge rst )
if ( rst )
    tx_rdy_data <= 8'b0;
else if ( tx_vld & txrdy )   <<===  这里为什么使用txrdy进行判断???【#】
    tx_rdy_data <= tx_data;
else;
………………
/* 发送状态 */
always @ ( posedge clk or posedge rst )
if ( rst )
    tran_vld <= 1'b0;
else if ( tx_vld )
    tran_vld <= 1'b1;  <<===这里【*】
else if ( tran_vld & rx_en & ( tran_cnt== 4'd10 ) )
    tran_vld <= 1'b0;
else;
………………
assign txrdy = ~tran_vld;

感觉逻辑上有问题,因为txrdy = ~tran_vld,而tran_vld又会在tx_vld=1的情况下变为1【*】,故txrdy = ~tran_vld=0。
那么,得出tx_vld & txrdy = 1 & 0 = 0。
虽然感觉逻辑上有问题,可是,测试中没有出现问题。【#】处改为if ( tx_vld ) 也能用。

txrdy.bmp
上图仿真中rxrdy为0,可是仍然将rx_data拷贝到了rx_rdy_data。

希望作者可以解释。
发表于 2012-6-17 19:57:04 | 显示全部楼层
谢谢阅读。下面我详细解释一下这两个信号:

tx_vld/tx_data[7:0]是一个周期的信号组。在tx_vld==1'b1时,在接下来的一段时间内,会把tx_data[7:0]串行送入。这段时间是一个比较长的时间:持续发送起始位、8 bit数据、奇偶校验位和停止位。那么在这段时间内,就不能二次接受tx_vld/tx_data[7:0],原因在于在这段时间,被上一次发送字节占用了。因此,我们使用tran_vld==1'b1表示发送字节忙,不能接受二次字节发送。

相应的,tx_rdy= ~tran_vld表示可以接受第二字节的标志。那么 tx_rdy_data必须在tx_vld和tx_rdy同时等于1的时候,才会有效接收第二字节。如果你把tx_rdy去掉,那么可能出现这样的状况:你正在发送第一字节(tx_rdy_data),正在发送的过程中,第二字节申请,接受下来,写入tx_rdy_data,那么第一字节发送的字节已经被你改变,第一字节就被破坏。

  你可能把tx_vld和tran_vld搞混淆了。tran_vld在tx_vld==1时置位,在发送结束时,tran_vld变为0,表示该字节发送完毕,可以发送新字节了。所以tran_vld会持续一段时间。
发表于 2012-6-18 10:09:36 | 显示全部楼层
回复 1# godspeed1989


    感觉逻辑上有问题,因为txrdy = ~tran_vld,而tran_vld又会在tx_vld=1的情况下变为1【*】,故txrdy = ~tran_vld=0。
那么,得出tx_vld & txrdy = 1 & 0 = 0。

tx_vld会让tran_vld变成1,不过是在下一个周期,当下这个周期,tran_vld仍然等于0,因此tx_vld & tx_rdy = tx_vld & ~tran_vld还是有效的。

虽然感觉逻辑上有问题,可是,测试中没有出现问题。【#】处改为if ( tx_vld ) 也能用。


[#]处去掉tx_rdy则不能保护tx_rdy_data,原因在于发送第一个字节,也就是发送tx_rdy_data的过程中,tx_vld==1将把tx_data写入tx_rdy_data;那么在发送第一字节时,会陡然变成发送第二字节了。
 楼主| 发表于 2012-6-18 12:47:11 | 显示全部楼层
明白了,txrdy是为了防止发送当前字节过程中,有新的字节到来,造成tx_rdy_data被覆盖而设置的。
tran_vld信号表明了是否“正在发送”的状态。
txrdy作为输出信号,告诉模块的使用者:"当前有字节正在发送,新来的字节要等一下再能发送,否则有可能被扔掉。"

谢谢作者的回复。
发表于 2012-6-18 14:07:30 | 显示全部楼层
正解。这也是为啥嵌入式软件在发送字节的时候,总是不停查询txrdy的原因。嵌入式软件只有在得知txrdy为高电平时,才会把发送字节写给tx_data。
发表于 2012-12-26 19:47:35 | 显示全部楼层
学习
发表于 2013-1-4 10:05:14 | 显示全部楼层
学习了
发表于 2013-3-8 21:21:00 | 显示全部楼层
谢楼主
发表于 2014-11-7 15:29:16 | 显示全部楼层
学习了。
发表于 2018-5-17 15:40:22 | 显示全部楼层
学习看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-6-4 08:34 , Processed in 0.037169 second(s), 11 queries , Gzip On, Redis On.

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