小白请教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
reg tmp;
always @(posedge CLK1)
if(PORT_IN == tmp)
tmp = 8'hFF;
else
tmp = PORT_IN;
本帖最后由 sohappyoh 于 2016-1-15 18:31 编辑
Nuker 发表于 2016-1-15 18:16
reg tmp;
always @(posedge CLK1)
if(PORT_IN == tmp)
有其他形式吗 以上都不行,建议使用握手或FIFO的方式。 不对吧,这样没更新数据,输出的就是之前的值了,我觉得应该是这样
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; 1.异步时钟域的数据传输一般要用fifo处理。
2直接用一个时钟去读取另外一个时钟域的时钟会产生亚稳态。就是二楼的写法。
3.我不太明白你是怎么定义“是否有数据更新”的。判断当前采集到数据和之前的不一样?如果前后两帧数据碰巧是相同的呢? "输入数据没有更新"的定义是什么?
prow 发表于 2016-1-15 22:12
"输入数据没有更新"的定义是什么?
对不起啊,描述错误,其实每个是CLK1上升沿都一次数据 辰星和月 发表于 2016-1-15 22:06
1.异步时钟域的数据传输一般要用fifo处理。
2直接用一个时钟去读取另外一个时钟域的时钟会产生亚稳态。就是 ...
谢谢你的回复啊,如果相同也属于更新啊! lzl000 发表于 2016-1-15 21:57
不对吧,这样没更新数据,输出的就是之前的值了,我觉得应该是这样
input PORT_IN;
output PORT_OUT;
谢谢,可能我的表达有误,你的这种方法有个缺陷就是,CLK1 两次输入的数据相同,也被判定没有数据更新,其实是CLK1下降沿即数据被更新,请教如何处理。 sohappyoh 发表于 2016-1-15 23:11
谢谢,可能我的表达有误,你的这种方法有个缺陷就是,CLK1 两次输入的数据相同,也被判定没有数据更新, ...
没啊,后面一个@,如果输入改变,就更新了。阻塞赋值,串行执行的 lzl000 发表于 2016-1-15 23:13
没啊,后面一个@,如果输入改变,就更新了。阻塞赋值,串行执行的
假设多次CLK1下降沿都是0x06, 有可能就会输出0x06 , 0xFF, 0xFF, 0xFF 。。。 异步时钟用FIFO,但FIFO会有延时,对延时有要求吗?如果延时没要求,直接判断FIFO是否为空就可以解决多次数据相同的问题。
另外,CLK1比CLK2慢多少?如果慢得多,可以用CLK2做主时钟读CLK1,判断CLK1的下降沿,可以解决亚稳态的问题,省下FIFO,也可以解决多次数据相同的问题。 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
sohappyoh 发表于 2016-1-15 23:18
假设多次CLK1下降沿都是0x06, 有可能就会输出0x06 , 0xFF, 0xFF, 0xFF 。。。 ...
那不就是没更新这个数据吗 可以用一个更快的时钟作为同步时钟,去判断两个时钟的下降沿和更新数据。
页:
[1]