关于双时钟时序控制问题,求思路!!!
本帖最后由 zhanshenguilai 于 2012-3-31 14:47 编辑我想实现的功能是 已知 clk1 clk2 ,clk2的频率要高,
在clk1开始时 产生start信号开始处理若干个clk2周期处理结束后自动产生 Done信号一个clk2周期,同时start置低,
下一个clk1开始时 又产生start信号..........
试着用状态机写了一下,还是实现不了,大侠能不能指点一下呢,谢谢! 本帖最后由 lixiangwen 于 2012-3-31 08:54 编辑
这种逻辑关系用CPLD 应该很容易实现啊~
用状态机应该也可以啊,用中断优先级呢? 最简单状态机就是计数器到节拍就动作 lixiangwen 发表于 2012-3-31 08:52 static/image/common/back.gif
这种逻辑关系用CPLD 应该很容易实现啊~
能提示下吗 我想了半天没想出来 将速度低的那个当成一个普通的信号,而不是时钟就可以了。 NJ8888 发表于 2012-3-31 08:56 static/image/common/back.gif
最简单状态机就是计数器到节拍就动作
我考虑的是,如果不用计数器, 而是执行若干周期自动产生结束信号, 是不是也能实现呢,后来觉得这个思路可能不对 ahuang227 发表于 2012-3-31 08:58 static/image/common/back.gif
将速度低的那个当成一个普通的信号,而不是时钟就可以了。
我也这样想过,感觉有点怪就没敢用,这样貌似可以 先说说你为啥没有成功哈?
我认为用clk2做时钟脉冲,低速的那个用中断 判断 本帖最后由 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: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 lanliang714 发表于 2012-3-31 11:24 static/image/common/back.gif
楼上的有问题吧,怎么能够在两个进程里对同一个变量赋值
个人以为:在clk1中产生start起始信号,同步到clk2 ...
上面的例子是有问题,所以我过来跟大家求教的 ,谢谢你的回复 {:2_31:} 状态机+双时钟计数器 fishplj2000 发表于 2012-4-1 08:01 static/image/common/back.gif
状态机+双时钟计数器
双时钟计数器是什么呢 大侠能详细点吗 本帖最后由 linjpxt 于 2012-4-1 09:26 编辑
有几个细节问题,请楼主解释一下,START是同步于clk1还是clk2的,clk1,clk2是不同频率的,那么它们的相位是独立的还是有关系的,然后DONE是输出的还是外面输入的. 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: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 linjpxt 发表于 2012-4-1 10:17 static/image/common/back.gif
这样很好办,因为clk1是clk2产生的,所以他们的开始边沿都是同步的,可以不用考虑clk1的问题,直接拿clk2做时钟 ...
非常感谢,这样确实可以,谢谢! {:smile:} 这个貌似需要用到多时钟域同步技术吧,,,需要把clk1中得start信号进过同步,才能在clk2时钟域内使用
页:
[1]