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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3117|回复: 6

[求助] 问个问题,困扰了很久,不晓得对一个时钟信号要不要打几拍?

[复制链接]
发表于 2015-4-2 14:31:45 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 lianggui5 于 2015-4-2 14:33 编辑

输入时钟是245.76MHz,从DCM的得到256.76Mhz和78.6432Mhz,  78.6432*25=245.76Mhz*8。


数据是在245.76MHz下是16位的来,每24数据后会有一个无效数据,定义了4个96位宽的 reg信号(data1,data2,data3,data4),
收到的数据会循环写入到这4个寄存器中,示列如下。
rx_clk2 时钟为245.76MHz
rx_clk1 时钟为78.6432MHz




  1. always @ (posedge rx_clk2 or posedge rx_rst)
  2.       begin
  3.         if(rx_rst)
  4.           begin
  5.            data_in3 <= 96'b0;
  6.            data_in4 <= 96'b0;
  7.            data_in5 <= 96'b0;
  8.            data_in6 <= 96'b0;
  9.            flag3    <= 5'b0;
  10.                    start_rec <= 1'b0;
  11.           end       
  12.                        
  13.           else if ((start==2'd2)&&(|rxcharisk==1'b1))
  14.                         begin
  15.                                 flag3 <= 5'd0;
  16.                                 start_rec <= 1'b1;
  17.                 end
  18.           else if((start==2'd2) &&(|rxcharisk==1'b0)&& (start_rec == 1'b1))
  19.                 begin
  20.                  case (flag3)
  21.                  5'd0:
  22.                    begin
  23.                      data_in3[15:0]  <= rx_gtxdata;
  24.                           flag3    <= flag3+1'b1;
  25.                    end
  26.          5'd1:
  27.                    begin
  28.                      data_in3[31:16] <= rx_gtxdata;
  29.                           flag3    <= flag3+1'b1;
  30.                         end
  31.          5'd2:
  32.                    begin
  33.                      data_in3[47:32] <= rx_gtxdata;
  34.                           flag3    <= flag3+1'b1;
  35.                         end
  36.                  5'd3:
  37.                    begin
  38.                      data_in3[63:48] <= rx_gtxdata;
  39.                           flag3    <= flag3+1'b1;
  40.                         end
  41.                  5'd4:
  42.                    begin
  43.                      data_in3[79:64] <= rx_gtxdata;
  44.                           flag3    <= flag3+1'b1;
  45.                         end
  46.                  5'd5:
  47.                    begin
  48.                      data_in3[95:80] <= rx_gtxdata;
  49.                           flag3    <= flag3+1'b1;
  50.                         end
  51.        5'd6:
  52.                    begin
  53.                      data_in4[15:0] <= rx_gtxdata;
  54.                      flag3    <= flag3+1'b1;
  55.                         end
  56.        5'd7:
  57.                     begin
  58.            data_in4[31:16] <= rx_gtxdata;
  59.                           flag3    <= flag3+1'b1;
  60.                          end
  61.        5'd8:
  62.                     begin
  63.            data_in4[47:32] <= rx_gtxdata;
  64.                           flag3    <= flag3+1'b1;
  65.                          end
  66.                 5'd9:
  67.                     begin
  68.            data_in4[63:48] <= rx_gtxdata;
  69.                           flag3    <= flag3+1'b1;
  70.                          end
  71.                 5'd10:
  72.                     begin
  73.            data_in4[79:64] <= rx_gtxdata;
  74.                           flag3    <= flag3+1'b1;
  75.                          end
  76.                 5'd11:
  77.                     begin
  78.            data_in4[95:80] <= rx_gtxdata;
  79.            flag3    <= flag3+1'b1;
  80.           end
  81.                 12:
  82.                    begin
  83.                      data_in5[15:0] <= rx_gtxdata;
  84.                      flag3    <= flag3+1'b1;
  85.                         end
  86.                 13:
  87.                     begin
  88.            data_in5[31:16] <= rx_gtxdata;
  89.                           flag3    <= flag3+1'b1;
  90.                          end
  91.         14:
  92.                     begin
  93.            data_in5[47:32] <= rx_gtxdata;
  94.                           flag3    <= flag3+1'b1;
  95.                          end
  96.                  15:
  97.                     begin
  98.            data_in5[63:48] <= rx_gtxdata;
  99.                           flag3    <= flag3+1'b1;
  100.                          end
  101.                  16:
  102.                     begin
  103.            data_in5[79:64] <= rx_gtxdata;
  104.                           flag3    <= flag3+1'b1;
  105.                          end
  106.                  17:
  107.                     begin
  108.            data_in5[95:80] <= rx_gtxdata;
  109.            flag3    <= flag3+1'b1;
  110.           end
  111.                  18:
  112.                    begin
  113.                      data_in6[15:0] <= rx_gtxdata;
  114.                      flag3    <= flag3+1'b1;
  115.                         end
  116.                  19:
  117.                     begin
  118.            data_in6[31:16] <= rx_gtxdata;
  119.                           flag3    <= flag3+1'b1;
  120.                          end
  121.          20:
  122.                     begin
  123.            data_in6[47:32] <= rx_gtxdata;
  124.                           flag3    <= flag3+1'b1;
  125.                          end
  126.                  21:
  127.                     begin
  128.            data_in6[63:48] <= rx_gtxdata;
  129.                           flag3    <= flag3+1'b1;
  130.                          end
  131.                  22:
  132.                     begin
  133.            data_in6[79:64] <= rx_gtxdata;
  134.                           flag3    <= flag3+1'b1;
  135.                          end
  136.                  23:
  137.                     begin
  138.            data_in6[95:80] <= rx_gtxdata;
  139.            flag3    <= 0;
  140.           end
  141.        
  142.                  default:begin
  143.            data_in3 <= 96'b0;
  144.            data_in4 <= 96'b0;
  145.            data_in5 <= 96'b0;
  146.            data_in6 <= 96'b0;
  147.            flag3    <= 4'b0;
  148.                    start_rec <= 1'b0;
  149.                         end
  150.        endcase                         
  151.                  end
  152.           else begin
  153.                 data_in3 <= 96'b0;
  154.                 data_in4 <= 96'b0;
  155.                 data_in5 <= 96'b0;
  156.                 data_in6 <= 96'b0;
  157.                 flag3    <= 4'b0;
  158.                 start_rec <= 1'b0;
  159.           end
  160.      en


复制代码

然后这边的话,会用78.643MHz去读取这些数据。读的话,肯定会等data1写完了才回去读,start_rec信号等了4个周期,差不多的位置就是
data2写完,才会去读取data1中的数据。




  1.     always @ (posedge rx_clk1 or posedge rx_rst)
  2.         if(rx_rst)begin
  3.                 start_rec_r1 <= 1'b0;
  4.                 start_rec_r2 <= 1'b0;
  5.                 start_rec_r3 <= 1'b0;
  6.                 end
  7.         else begin
  8.                 start_rec_r1 <= start_rec;
  9.                 start_rec_r2 <= start_rec_r1;
  10.                 start_rec_r3 <= start_rec_r2;               
  11.                 start_rec_r4 <= start_rec_r3;               
  12.         end
  13.        
  14.     always @ (posedge rx_clk1 or posedge rx_rst)
  15.       begin
  16.         if(rx_rst)
  17.             begin
  18.                                 din    <=38'b0;        
  19.                                 upbc   <=3'b0;         
  20.                                 dnbfavl<=4'b0;
  21.                                 flag4  <= 3'b0;
  22.           end
  23.                  else if (start_rec_r4)
  24.                    begin
  25.                         case (flag4)
  26.           0:
  27.           begin
  28.            dnbfavl <= data_in3[3:0];
  29.            upbc    <= data_in3[6:4];
  30.            din     <= data_in3[44:7];
  31.            flag4    <= flag4+1'b1;
  32.           end
  33.          1:
  34.           begin
  35.            dnbfavl <= data_in3[48:45];
  36.            upbc    <= data_in3[51:49];
  37.            din     <= data_in3[89:52];
  38.            flag4    <= flag4+1'b1;
  39.           end
  40.          2:
  41.           begin
  42.            dnbfavl <= data_in4[3:0];
  43.            upbc    <= data_in4[6:4];
  44.            din     <= data_in4[44:7];
  45.            flag4   <= flag4+1'b1;
  46.           end
  47.          3:
  48.           begin
  49.            dnbfavl <= data_in4[48:45];
  50.            upbc    <= data_in4[51:49];
  51.            din     <= data_in4[89:52];
  52.             flag4   <= flag4+1'b1;
  53.           end
  54.           4:
  55.           begin
  56.            dnbfavl <= data_in5[3:0];
  57.            upbc    <= data_in5[6:4];
  58.            din     <= data_in5[44:7];
  59.            flag4    <= flag4+1'b1;
  60.           end
  61.          5:
  62.           begin
  63.            dnbfavl <= data_in5[48:45];
  64.            upbc    <= data_in5[51:49];
  65.            din     <= data_in5[89:52];
  66.            flag4    <= flag4+1'b1;
  67.           end
  68.          6:
  69.           begin
  70.            dnbfavl <= data_in6[3:0];
  71.            upbc    <= data_in6[6:4];
  72.            din     <= data_in6[44:7];
  73.            flag4   <= flag4+1'b1;
  74.           end
  75.          7:
  76.           begin
  77.            dnbfavl <= data_in6[48:45];
  78.            upbc    <= data_in6[51:49];
  79.            din     <= data_in6[89:52];
  80.            flag4    <= 3'd0;
  81.           end
  82.                  default :begin
  83.                         din    <=38'b0;        
  84.                         upbc   <=3'b0;         
  85.                         dnbfavl<=4'b0;
  86.                         flag4  <= 3'b0;
  87.                  end
  88.                         endcase
  89.              end         
  90.                 else begin
  91.                         din    <=38'b0;        
  92.                         upbc   <=3'b0;         
  93.                         dnbfavl<=4'b0;
  94.                         flag4  <= 3'b0;
  95.                 end
  96.         end       

  97.           always @ (posedge rx_clk1 or posedge rx_rst)
  98.       begin
  99.         if(rx_rst)
  100.             begin
  101.                           tx_din <= 0;
  102.                           tx_upbc <= 0;
  103.                           tx_dnbfavl <= 0;
  104.                         end
  105.                 else begin
  106.                 tx_din <= din;
  107.                 tx_upbc<=upbc;
  108.                 tx_dnbfavl <= dnbfavl;               
  109.                 end
  110.          end


复制代码

那现在问题来了 data1,data2,data3,data4都是跨时钟域信号,这里没有在78MHz下做寄存,会不会有问题?如果有问题,会有什么问题呢?
发表于 2015-4-3 09:37:19 | 显示全部楼层
你这个电路是FIFO结构的,不需要处理跨时钟域问题。注意FIFO深度就可以。
发表于 2015-4-3 11:34:58 | 显示全部楼层
it is difficult to answer
发表于 2015-4-3 12:20:53 | 显示全部楼层
搞不清楚的时候,直接调用一个异步FIFO就可以啦。
 楼主| 发表于 2015-4-3 17:05:59 | 显示全部楼层
回复 4# yangyuf1


   两边的数据率,如果时钟正常的话,是一致的,只是简单的位宽转换呢
 楼主| 发表于 2015-4-3 17:06:35 | 显示全部楼层
回复 3# quhuaibo


   谢谢顶贴
 楼主| 发表于 2015-4-3 17:08:26 | 显示全部楼层
回复 2# woodhorse


   恩哈,功能就是类似一个fifo的结构,fifo两边的速率是一致的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-19 15:48 , Processed in 0.024228 second(s), 8 queries , Gzip On, Redis On.

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