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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2000|回复: 7

[求助] 请教一个时序的问题

[复制链接]
发表于 2011-9-27 20:39:57 | 显示全部楼层 |阅读模式

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

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

x
我是新手,刚开始摆弄FPGA。今天写了一段代码发现了一个问题。代码如下:
always @ (negedge encoder_shift_clock)
begin
  if (send_data) begin
   case (cnt)
    6'b000_000: begin serial_data_in <= encoder_input[15]; cnt <= 1; end
    6'b000_001: begin serial_data_in <= encoder_input[14]; cnt <= 2; end
    6'b000_010: begin serial_data_in <= encoder_input[13]; cnt <= 3; end
    6'b000_011: begin serial_data_in <= encoder_input[12]; cnt <= 4; end
    6'b000_100: begin serial_data_in <= encoder_input[11]; cnt <= 5; end
    6'b000_101: begin serial_data_in <= encoder_input[10]; cnt <= 6; end
    6'b000_110: begin serial_data_in <= encoder_input[9];  cnt <= 7; end
    6'b000_111: begin serial_data_in <= encoder_input[8];  cnt <= 8; end
    6'b001_000: begin serial_data_in <= encoder_input[7];  cnt <= 9; end
    6'b001_001: begin serial_data_in <= encoder_input[6];  cnt <= 10; end
    6'b001_010: begin serial_data_in <= encoder_input[5]; cnt <= 11; end
    6'b001_011: begin serial_data_in <= encoder_input[4]; cnt <= 12; end
    6'b001_100: begin serial_data_in <= encoder_input[3]; cnt <= 13; end
    6'b001_101: begin serial_data_in <= encoder_input[2]; cnt <= 14; end
    6'b001_110: begin serial_data_in <= encoder_input[1]; cnt <= 15; end
    6'b001_111: begin serial_data_in <= encoder_input[0]; cnt <= 0;  end
    default: begin cnt <= 0; end
   endcase
  end
  else begin
   serial_data_in <= 0;
   cnt <= 0;
  end
end
QQ截图未命名.jpg
上电后发现,serial_data_in的数据总是右移一位,是不是if(send_data)是在send_data上升沿后再经过一个encoder_shift_clock周期后才执行if以后的语句。我想问一下,always + if这种情况是不是只能这样,有没有解决的办法,或是是用别的语句解决这个问题。
小弟想了一天也没想出个结果,请大牛们指教,谢谢了
发表于 2011-9-27 21:13:15 | 显示全部楼层
右移一位?
发表于 2011-9-27 21:26:45 | 显示全部楼层
可以用组合逻辑实现
 楼主| 发表于 2011-9-27 21:28:41 | 显示全部楼层
是的,是在send_data上升沿后的下一个encoder_shift_clock的下降沿开始对serial_data_in进行赋值。也就是说encoder_input[15]其实是把值给了serial_data_in中的第14位。我知道原因是在于if(send_data),就是在send_data上升沿后经过一个encoder_shift_clock周期才判断出send_data == 1为真,才执行case语句。
如果有种方法取代if(send_data)语句就可以解决这个问题,也就是说在send_data的上升沿触发立即执行case语句。请教大牛有什么解决办法没有?谢谢了
发表于 2011-9-27 21:30:59 | 显示全部楼层
是的,always时序逻辑+if是这样的。你可以在把send_data延迟一个时钟。或者采用组合逻辑(不推荐)
 楼主| 发表于 2011-9-27 21:41:02 | 显示全部楼层
谢谢你。恩,延迟的方法可以解决这个问题。我是新手,如果有更好的办法,请大牛们留言
发表于 2011-9-28 15:36:31 | 显示全部楼层
5楼说得对。
时序设计就是这样。你想要的只能通过组合逻辑实现,但组合逻辑延迟大,不利于跑高频设计。不推荐组合逻辑。
发表于 2011-9-29 14:52:20 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-22 04:32 , Processed in 0.038252 second(s), 9 queries , Gzip On, Redis On.

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