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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: 老扁

异步设计难题证答

[复制链接]
发表于 2006-7-29 03:05:51 | 显示全部楼层
只是一个方向还好说,加一个handshake信号往回穿就比较麻烦了。
发表于 2006-8-2 12:04:49 | 显示全部楼层
增长了见识
发表于 2006-9-12 15:35:34 | 显示全部楼层
这个和uart类似 异步通用的思想就是用高速时钟采样开始信号
发表于 2006-9-12 17:48:48 | 显示全部楼层

My suggestion.

Clk2 >= CLk1,
the buffer will not be full for ever, If clk2 read out the data without hesitate,
So the handshake is single direction.
发表于 2010-3-5 10:12:33 | 显示全部楼层
好文章
压入百度的博客中
发表于 2010-3-9 11:40:28 | 显示全部楼层
发表于 2010-3-9 13:23:51 | 显示全部楼层
碰巧,在我曾经做过的设计中,和楼主碰到一样的问题.
关键思想就是,A时钟域的数据稳定的时候,利用flag型号通知B时钟去踩!
(1)如果A,B时钟相仿, 周期相似,所以A时钟域data hold时间短, B时钟可能碰到跳变沿,这是只能把数据加宽,等于降低A时钟域的数据跳变频率.
(2)如果在2~4F 比较好弄,A时钟域数据相对B时钟域hold时间足够长,不要buff就可以.

希望对碰到同样问题的朋友有所帮助.
发表于 2010-4-15 17:19:48 | 显示全部楼层
本人写了一段代码,仿真后没什么问题。
发出来看看,请大家多提点意见。

module test(
clk1,
clk2,
rst1_n,
valid,
data_in,
data_out,
out_valid
);

input        clk1;
input        clk2;
input        rst1_n;
input        valid;
input [31:0] data_in;

output [31:0] data_out;
output        out_valid;


wire        clk1;
wire        clk2;
wire        rst1_n;
wire        valid;
wire [31:0] data_in;
wire        read_en;

reg [31:0] reg0;
reg [31:0] reg1;
reg [31:0] data_out;
reg        out_valid;
reg        rd_ptr;
reg        wr_ptr;
reg        wr_ptr_d1;
reg        rst2_n;
reg        rst2_n_d1;


always @ (posedge clk2 or negedge rst1_n)
begin
   if(!rst1_n)
    begin
     rst2_n    <= 1'b0;
     rst2_n_d1 <= 1'b0;
    end
   else
    begin
     rst2_n_d1 <= 1'b1;
     rst2_n    <= rst2_n_d1;
    end
end   


always @ (posedge clk1 or negedge rst1_n)
begin
  if(!rst1_n)
     wr_ptr <= 1'b0;
  else if(valid)
     wr_ptr <= wr_ptr + 1'b1;
  else
     wr_ptr <= wr_ptr;
end

always @ (posedge clk1 or negedge rst1_n)
begin
if(!rst1_n)
    begin
     reg0[31:0] <= 32'h00;
     reg1[31:0] <= 32'h00;
     end
else if(valid)
   begin
    case(wr_ptr)
    1'b0: reg0[31:0] <= data_in[31:0];
    1'b1: reg1[31:0] <= data_in[31:0];
    endcase
   end
else
   begin
     reg0[31:0] <= reg0[31:0];
     reg1[31:0] <= reg1[31:0];
    end
end

always @ (posedge clk2 or negedge rst2_n)
begin
  if(!rst2_n)
    wr_ptr_d1 <= 1'b0;
  else
    wr_ptr_d1 <= wr_ptr;
end

assign read_en = wr_ptr_d1 ^ wr_ptr;


always @ (posedge clk2 or negedge rst2_n)
begin
   if(!rst2_n)
    begin
     out_valid <= 1'b0;
     rd_ptr    <= 1'b0;
    end
   else if (read_en)
    begin
     out_valid <= 1'b1;
     rd_ptr    <= rd_ptr + 1'b1;
    end
   else
    begin
     out_valid <= 1'b0;
     rd_ptr    <= rd_ptr;
    end
end


always @ (posedge clk2 or negedge rst2_n)
begin
   if(!rst2_n)
      data_out[31:0] <= 32'h00;
   else if (read_en)
    begin
     case(rd_ptr)
      1'b0: data_out[31:0] <= reg0[31:0];
      1'b1: data_out[31:0] <= reg1[31:0];
     endcase
    end
   else
     data_out[31:0] <= data_out[31:0];
end

endmodule
发表于 2010-4-15 23:45:11 | 显示全部楼层
本帖最后由 twnliu 于 2010-4-15 23:52 编辑

我想的貌似不对 &#160;学些了
发表于 2010-5-28 16:25:43 | 显示全部楼层
很好  学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-3-28 18:22 , Processed in 0.027085 second(s), 5 queries , Gzip On, Redis On.

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