sohappyoh 发表于 2016-1-15 18:11:49

小白请教FPGA 两个always传递标志问题?

本帖最后由 sohappyoh 于 2016-1-15 23:12 编辑

请教如何实现:

假设有两个时钟信号 CLK1和CLK2,CLK1<CLK2 , CLK1下降沿读取数据,CLK2输出数据,当输入数据没有更新的话(CLK1新的下降沿没有到来),输出0xFF。要是有更新的话输出输入数据。


reg tmp;
always @(posedge CLK1)
        tmp = PORT_IN;

always @(posedge CLK2)
        PORT_OUT = tmp
       

Nuker 发表于 2016-1-15 18:16:53

reg tmp;
always @(posedge CLK1)
    if(PORT_IN == tmp)
      tmp = 8'hFF;
    else
      tmp = PORT_IN;

sohappyoh 发表于 2016-1-15 18:29:51

本帖最后由 sohappyoh 于 2016-1-15 18:31 编辑

Nuker 发表于 2016-1-15 18:16
reg tmp;
always @(posedge CLK1)
    if(PORT_IN == tmp)

有其他形式吗

FPGA_WALKER 发表于 2016-1-15 21:51:57

以上都不行,建议使用握手或FIFO的方式。

lzl000 发表于 2016-1-15 21:57:15

不对吧,这样没更新数据,输出的就是之前的值了,我觉得应该是这样
input PORT_IN;
output PORT_OUT;
reg tmp;
always @(posedge CLK1)
begin
      tmp = 8'hff;                              //先置位0xff
      @PORT_IN tmp = PORT_IN;       //如果输入信号改变,载入输入信号
end


always @(posedge CLK2)
      @tmp PORT_OUT = tmp;

辰星和月 发表于 2016-1-15 22:06:34

1.异步时钟域的数据传输一般要用fifo处理。
2直接用一个时钟去读取另外一个时钟域的时钟会产生亚稳态。就是二楼的写法。
3.我不太明白你是怎么定义“是否有数据更新”的。判断当前采集到数据和之前的不一样?如果前后两帧数据碰巧是相同的呢?

prow 发表于 2016-1-15 22:12:21

"输入数据没有更新"的定义是什么?

sohappyoh 发表于 2016-1-15 23:04:08

prow 发表于 2016-1-15 22:12
"输入数据没有更新"的定义是什么?

对不起啊,描述错误,其实每个是CLK1上升沿都一次数据

sohappyoh 发表于 2016-1-15 23:07:36

辰星和月 发表于 2016-1-15 22:06
1.异步时钟域的数据传输一般要用fifo处理。
2直接用一个时钟去读取另外一个时钟域的时钟会产生亚稳态。就是 ...

谢谢你的回复啊,如果相同也属于更新啊!

sohappyoh 发表于 2016-1-15 23:11:32

lzl000 发表于 2016-1-15 21:57
不对吧,这样没更新数据,输出的就是之前的值了,我觉得应该是这样
input PORT_IN;
output PORT_OUT;


谢谢,可能我的表达有误,你的这种方法有个缺陷就是,CLK1 两次输入的数据相同,也被判定没有数据更新,其实是CLK1下降沿即数据被更新,请教如何处理。

lzl000 发表于 2016-1-15 23:13:48

sohappyoh 发表于 2016-1-15 23:11
谢谢,可能我的表达有误,你的这种方法有个缺陷就是,CLK1 两次输入的数据相同,也被判定没有数据更新, ...

没啊,后面一个@,如果输入改变,就更新了。阻塞赋值,串行执行的

sohappyoh 发表于 2016-1-15 23:18:53

lzl000 发表于 2016-1-15 23:13
没啊,后面一个@,如果输入改变,就更新了。阻塞赋值,串行执行的

假设多次CLK1下降沿都是0x06, 有可能就会输出0x06 , 0xFF, 0xFF, 0xFF 。。。

roasn 发表于 2016-1-15 23:35:42

异步时钟用FIFO,但FIFO会有延时,对延时有要求吗?如果延时没要求,直接判断FIFO是否为空就可以解决多次数据相同的问题。
另外,CLK1比CLK2慢多少?如果慢得多,可以用CLK2做主时钟读CLK1,判断CLK1的下降沿,可以解决亚稳态的问题,省下FIFO,也可以解决多次数据相同的问题。

racede 发表于 2016-1-15 23:37:39

FCLK_OUT > FCLK_IN * 2 情况下



input wire CLK_IN;
input wire CLK_OUT;

reg rDataIn;
reg rDataOut;
reg rDataInUpdated;

always @ (posedge CLK_OUT) begin
        if (CLK_IN == 1'b0 and rDataInUpdated == 1'b0) begin
                rDataInUpdated <= 1'b1
                rDataOut <= rDataIn;
        end else begin
                if (CLK_IN == 1'b1) begin
                        rDataInUpdated <= 1'b0;
                end
                rDataOut <= 8'hff;
        end
end


lzl000 发表于 2016-1-16 15:46:42

sohappyoh 发表于 2016-1-15 23:18
假设多次CLK1下降沿都是0x06, 有可能就会输出0x06 , 0xFF, 0xFF, 0xFF 。。。 ...

那不就是没更新这个数据吗

skyxjh 发表于 2016-1-16 19:52:12

可以用一个更快的时钟作为同步时钟,去判断两个时钟的下降沿和更新数据。
页: [1]
查看完整版本: 小白请教FPGA 两个always传递标志问题?