zhanshenguilai 发表于 2012-3-31 08:49:19

关于双时钟时序控制问题,求思路!!!

本帖最后由 zhanshenguilai 于 2012-3-31 14:47 编辑



我想实现的功能是 已知 clk1 clk2 ,clk2的频率要高,
在clk1开始时 产生start信号开始处理若干个clk2周期处理结束后自动产生 Done信号一个clk2周期,同时start置低,
下一个clk1开始时 又产生start信号..........

试着用状态机写了一下,还是实现不了,大侠能不能指点一下呢,谢谢!

lixiangwen 发表于 2012-3-31 08:52:30

本帖最后由 lixiangwen 于 2012-3-31 08:54 编辑

这种逻辑关系用CPLD 应该很容易实现啊~

用状态机应该也可以啊,用中断优先级呢?

NJ8888 发表于 2012-3-31 08:56:25

最简单状态机就是计数器到节拍就动作

zhanshenguilai 发表于 2012-3-31 08:56:28

lixiangwen 发表于 2012-3-31 08:52 static/image/common/back.gif
这种逻辑关系用CPLD 应该很容易实现啊~

能提示下吗 我想了半天没想出来

ahuang227 发表于 2012-3-31 08:58:25

将速度低的那个当成一个普通的信号,而不是时钟就可以了。

zhanshenguilai 发表于 2012-3-31 08:59:03

NJ8888 发表于 2012-3-31 08:56 static/image/common/back.gif
最简单状态机就是计数器到节拍就动作

我考虑的是,如果不用计数器, 而是执行若干周期自动产生结束信号, 是不是也能实现呢,后来觉得这个思路可能不对

zhanshenguilai 发表于 2012-3-31 09:02:38

ahuang227 发表于 2012-3-31 08:58 static/image/common/back.gif
将速度低的那个当成一个普通的信号,而不是时钟就可以了。

我也这样想过,感觉有点怪就没敢用,这样貌似可以

lixiangwen 发表于 2012-3-31 09:04:04

先说说你为啥没有成功哈?

我认为用clk2做时钟脉冲,低速的那个用中断 判断

zhanshenguilai 发表于 2012-3-31 09:28:58

本帖最后由 zhanshenguilai 于 2012-3-31 14:57 编辑

lixiangwen 发表于 2012-3-31 09:04 static/image/common/back.gif
先说说你为啥没有成功哈?

我认为用clk2做时钟脉冲,低速的那个用中断 判断...

我想的大体结构是这样的,但是Start信号由clk1 产生,没有办法从clk2清零, 不能在两个always内对Start 赋值:
/**********************************/
module test_module
(
    clk1,clk2,RSTn,Done
);

input clk1;
input clk2;
input RSTn;
output Done

reg Start ;
reg i ;

always@(posedge clk1 or negedge RSTn )
if(!RSTn) begin
      Start <= 1'b0;
end
elsebegin
      Start <= 1'b1;
end

always@(posedge clk2 or negedge RSTn )
if(!RSTn) begin
      i <= 1'b0;
end
elseif(Start)begin
       case(i)

       0,1,2,3...:
            i <= i+1'b1 ;

       n-1: begin
          Start <= 1'b0;         
          Done <= 1'b1;
          i <= i+1'b1 ;
       end
      
       n:begin
         Done <= 1'b0;
         i <= 1'b0;
       end

      endcase
end

endmodule
/**********************************/

lanliang714 发表于 2012-3-31 11:24:24

本帖最后由 lanliang714 于 2012-3-31 11:32 编辑

楼上的有问题吧,怎么能够在两个进程里对同一个变量赋值
个人以为:在clk1中产生start起始信号,同步到clk2中,再产生start结束信号,done在clk2中产生
或者使用clk1做使能信号:
always@(posedge clk2 )
if(!RSTn) begin
      Start <= 1'b0;
end
else begin
       if(clk1)
      Start <= 1'b1;
      else   Start <=................;
end

zhanshenguilai 发表于 2012-3-31 15:13:57

lanliang714 发表于 2012-3-31 11:24 static/image/common/back.gif
楼上的有问题吧,怎么能够在两个进程里对同一个变量赋值
个人以为:在clk1中产生start起始信号,同步到clk2 ...

上面的例子是有问题,所以我过来跟大家求教的 ,谢谢你的回复 {:2_31:}

fishplj2000 发表于 2012-4-1 08:01:34

状态机+双时钟计数器

zhanshenguilai 发表于 2012-4-1 08:42:06

fishplj2000 发表于 2012-4-1 08:01 static/image/common/back.gif
状态机+双时钟计数器

双时钟计数器是什么呢 大侠能详细点吗

linjpxt 发表于 2012-4-1 09:25:28

本帖最后由 linjpxt 于 2012-4-1 09:26 编辑

有几个细节问题,请楼主解释一下,START是同步于clk1还是clk2的,clk1,clk2是不同频率的,那么它们的相位是独立的还是有关系的,然后DONE是输出的还是外面输入的.

zhanshenguilai 发表于 2012-4-1 09:57:24

linjpxt 发表于 2012-4-1 09:25 static/image/common/back.gif
有几个细节问题,请楼主解释一下,START是同步于clk1还是clk2的,clk1,clk2是不同频率的,那么它们的相位是独立 ...

你好,是这样的:
1.START是同步于clk1的,我想的是在一个clk1周期开始时产生
2.初步想的是clk1是clk2分频产生,相位什么的还没考虑
3.Done 是输出,由clk2产生


我的初衷是 clk1是clk2分频产生,
1.每个clk1时钟从外部读取一个数据并发出控制信号Start
2.Start信号使能后,用较高的clk2时钟来处理读取的数据,处理完后自动停止,产生Done信号
3.下一个clk1开始时,又产生Start......

不知道这样是不是逻辑上有问题

linjpxt 发表于 2012-4-1 10:17:53

本帖最后由 linjpxt 于 2012-4-1 10:20 编辑

这样很好办,因为clk1是clk2产生的,所以他们的开始边沿都是同步的,可以不用考虑clk1的问题,直接拿clk2做时钟.而clk1由分频计数器从clk2来产生就好了.
大致代码如下,楼主看一下是不是你的愿意.
reg clk_dev;
reg clk1;
reg start,done;
always@(posedge clk2)
clk_dev <= clk_dev +1;
if(clk_dev == DEV_NUM)
   begin
   clk_dev <= 0
   clk1 <= ~clk1;
   if(~clk1) start <= 1;
   end
else
    begin   
    if(DATA_RDY)
          begin
          done <= 1;
          start <=0;
          end
    end
end

zhanshenguilai 发表于 2012-4-1 10:34:10

linjpxt 发表于 2012-4-1 10:17 static/image/common/back.gif
这样很好办,因为clk1是clk2产生的,所以他们的开始边沿都是同步的,可以不用考虑clk1的问题,直接拿clk2做时钟 ...

非常感谢,这样确实可以,谢谢! {:smile:}

simple_wyj 发表于 2012-4-1 15:13:20

这个貌似需要用到多时钟域同步技术吧,,,需要把clk1中得start信号进过同步,才能在clk2时钟域内使用
页: [1]
查看完整版本: 关于双时钟时序控制问题,求思路!!!