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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4253|回复: 19

[原创] 延时上的问题

[复制链接]
发表于 2011-10-6 07:44:59 | 显示全部楼层 |阅读模式

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

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

x

请高手指教一下啊,这个程序是从外界输入4个数,然后并行输出,怎样写才能达到同步输出呢?
我这样写的话最后一个数总是落后一个周期才输出结果。


Capture.GIF
module SP ( clk, rst_n, idin,
    dout_0, dout_1, dout_2, dout_3
     );

input clk, rst_n;
input [7:0] idin;
output [7:0] dout_0, dout_1, dout_2, dout_3;

wire sp_done;
reg [1:0] cnt;            
reg [7:0] dout_buf_0, dout_buf_1, dout_buf_2, dout_buf_3;  
reg [7:0] dout_0, dout_1, dout_2, dout_3;

assign sp_done = (cnt == 'b11) ? 1 : 0;
  
always @ (posedge clk or negedge rst_n)
if (!rst_n )
  cnt <= 'b0_0000;
else
  cnt <= cnt + 'b1;
  

always @ (sp_done)
  begin
   dout_0 = dout_buf_0;
   dout_1 = dout_buf_1;
   dout_2 = dout_buf_2;
   dout_3 = dout_buf_3;
end

always @ (posedge clk or negedge rst_n)
if (!rst_n)
  begin
   dout_buf_0 <= 'b0;
   dout_buf_1 <= 'b0;
   dout_buf_2 <= 'b0;
   dout_buf_3 <= 'b0;
  end
else
  case (cnt)
   'b00: dout_buf_0 = idin;
   'b01: dout_buf_1 = idin;
   'b10: dout_buf_2 = idin;
   'b11: dout_buf_3 = idin;
  endcase
endmodule
发表于 2011-10-6 08:07:58 | 显示全部楼层
sp_done是个什么样的信号?
 楼主| 发表于 2011-10-6 08:09:22 | 显示全部楼层
4组数据载入完成信号
发表于 2011-10-6 10:14:37 | 显示全部楼层
你可以试试让sp_done 晚一个时钟周期 在把数据放到dout上,这样是可以的,我试了一下 数据正确显示。
但是这样不知道符不符合你设计的预期。
估计是不能在同一个沿让数据既输出又赋值,要延后一个时钟周期才可以正确的赋值的。
 楼主| 发表于 2011-10-6 11:11:58 | 显示全部楼层
可不可以这样
assign a = (cnt == 'b10) ? 1 : 0;
always @ (posedge clk)
   if (a)
      sp_done = 1;
  else
     sp_done = 0;
发表于 2011-10-6 17:40:24 | 显示全部楼层



还是不行的。我的方法是使计数器多记一个时钟周期,再把存好的数值输出出去。
 楼主| 发表于 2011-10-6 18:07:50 | 显示全部楼层
本帖最后由 kknd2009 于 2011-10-6 18:40 编辑

楼上的你看看这样改可以么? 计数满四个的时候标志位a立刻置位, 同时第四组数据载入且sp_done = 1, 发出数据输出信号。
能给些更好的建议么?


assign a = (cnt == 'b11) ? 1 : 0;        

always @ (posedge clk or negedge rst_n)
        if (!rst_n )
                cnt <= 'b0_0000;
        else
                cnt <= cnt + 'b1;
               
always @ (posedge clk or negedge rst_n)
        if (!rst_n)
                sp_done = 0;
        else if (a)
                sp_done = 1;
        else
                sp_done = 0;
always @ (sp_done)
        if (sp_done)
                begin
                        dout_0 = dout_buf_0;
                        dout_1 = dout_buf_1;
                        dout_2 = dout_buf_2;
                        dout_3 = dout_buf_3;
                end
 楼主| 发表于 2011-10-6 18:42:16 | 显示全部楼层
补个图

Capture.JPG
发表于 2011-10-6 19:53:52 | 显示全部楼层
always @ (posedge clk or negedge rst_n)
        if (!rst_n)
                sp_done = 0;
        else if (a)
                sp_done = 1;
        else
                sp_done = 0;
这种语句有问题吧,容易出现竞争冒险!!!
发表于 2011-10-6 21:10:35 | 显示全部楼层
module SP ( clk, rst_n, idin,
    dout0, dout1, dout2, dout3
     );
input clk, rst_n;
input [7:0] idin;
output [7:0] dout0, dout1, dout2, dout3;
wire sp_done;
reg [1:0] cnt_n;
wire[1:0] cnt;
            
reg [7:0] dout_buf0, dout_buf1, dout_buf2, dout_buf3;  
reg [7:0] dout0, dout1, dout2, dout3;
assign sp_done = (cnt_n == 'b11) ? 1 : 0;
always @ (posedge clk or negedge rst_n)
if (!rst_n )
  cnt_n <= #1 2'b00;
else
  cnt_n <= #1 cnt;
  
assign cnt = (cnt_n == 2'b11)?2'b00:cnt_n +1;
always @ (posedge clk or negedge rst_n)
  begin
   if(!rst_n)
   begin
   dout0 <= #1 0;
   dout1 <= #1 0;
   dout2 <= #1 0;
   dout3 <= #1 0;  
   end
   else if(sp_done)
   begin   
   dout0 <= #1 dout_buf0;
   dout1 <= #1 dout_buf1;
   dout2 <= #1 dout_buf2;
   dout3 <= #1 dout_buf3;
   end
   else
   begin
   dout0 <= #1 dout0;
   dout1 <= #1 dout1;
   dout2 <= #1 dout2;
   dout3 <= #1 dout3;
   end
end
always@(*)
  case (cnt_n)
   2'b00: dout_buf0 =  idin;
   2'b01: dout_buf1 =  idin;
   2'b10: dout_buf2 =  idin;
   2'b11: dout_buf3 =  idin;
  endcase

endmodule


QQ截图20111006210238.jpg
QQ截图20111006210238.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-7-1 03:49 , Processed in 4.065184 second(s), 10 queries , Gzip On, Redis On.

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