FPGA跨时钟数据传输,是我们经常遇到的问题的,下面给出一种跨时钟握手操作的电路结构。先上图

先对与其他人的结构,这个结构最大的特点是使用 req 从低到高或者高到低的变化 来表示DIN数据有效并开始传输。并且同过判断 req与ack信号是否相等就可以判断传输是否完成。当req !=ack时表示正在传输,不可以发起新的传输操作。当req=ack时表示传输完成,可以开始新的传输过程。

并且这样的结构在req传输发生亚稳态时也可以有效的传输信号,可以适应任意时钟域之间的数据传输。仿真图如下

代码:

module handshack2
#(
parameter DATA_SIZE = ,
parameter SREG_LENG =
)
(
input rsta,
input clka,
input reqa,//变化沿表示数据有效
input [DATA_SIZE-:] dina,
output acka, input rstb,
input clkb,
output reg rdyb,
output reg [DATA_SIZE-:] doutb
); reg req_ra;
reg [DATA_SIZE-:] din_ra;
reg[SREG_LENG-:] ack_ra; reg[SREG_LENG-:] req_rb; //clka
always@(posedge clka)begin
if(rsta)begin
req_ra <= ;
end else begin
req_ra <= reqa;
end
din_ra <= dina;
end always@(posedge clka)
if(rsta)begin
ack_ra <= ;
end else begin
ack_ra <= {ack_ra[SREG_LENG-:], req_rb[SREG_LENG-]};
end assign acka = ack_ra[SREG_LENG-]; //clkb
always@(posedge clkb)
if(rstb)begin
req_rb <= ;
end else begin
req_rb <= {req_rb[:], req_ra};
end always@(posedge clkb)begin
if(req_rb[SREG_LENG-]^req_rb[SREG_LENG-])begin
doutb <= din_ra;
end
rdyb <= req_rb[SREG_LENG-]^req_rb[SREG_LENG-];
end endmodule

测试脚本:

module tst_handshack2;

    // Inputs
reg rsta;
reg clka;
reg reqa;
reg [:] dina;
reg rstb;
reg clkb; // Outputs
wire acka;
wire rdyb;
wire [:] doutb; // Instantiate the Unit Under Test (UUT)
handshack2 uut (
.rsta(rsta),
.clka(clka),
.reqa(reqa),
.dina(dina),
.acka(acka), .rstb(rstb),
.clkb(clkb),
.rdyb(rdyb),
.doutb(doutb)
); initial begin
clka = ;
#
forever
# clka = ~clka;
end initial begin
rsta <= ;
dina <= ;
reqa <= ;
#; dina <= ;
reqa <= !reqa;
#;
wait( acka == reqa)
#;
dina <= ;
reqa <= !reqa;
end initial begin
#2.7;
clkb = ;
#
forever
# clkb = ~clkb;
end
initial begin
rstb <= ;
#;
end endmodule

FPGA跨时钟域握手信号的结构的更多相关文章

  1. FPGA跨时钟域处理方法

    文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...

  2. 基于FPGA的跨时钟域信号处理——专用握手信号

    在逻辑设计领域,只涉及单个时钟域的设计并不多.尤其对于一些复杂的应用,FPGA往往需要和多个时钟域的信号进行通信.异步时钟域所涉及的两个时钟之间可能存在相位差,也可能没有任何频率关系,即通常所说的不同 ...

  3. FPGA基础学习(3) -- 跨时钟域处理方法

    文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...

  4. FPGA中亚稳态相关问题及跨时钟域处理

    前言 触发器输入端口的数据在时间窗口内发生变化,会导致时序违例.触发器的输出在一段时间内徘徊在一个中间电平,既不是0也不是1.这段时间称为决断时间(resolution time).经过resolut ...

  5. cdc跨时钟域处理-结绳握手法

    参考文档 https://blog.csdn.net/u011412586/article/details/10009761 前言 对于信号需要跨时钟域处理而言,最重要的就是确保数据能稳定的传送到采样 ...

  6. 跨时钟域设计【一】——Slow to fast clock domain

    跨时钟域设计是FPGA设计中经常遇到的问题,特别是对Trigger信号进行同步设计,往往需要把慢时钟域的Trigger信号同步到快时钟域下,下面是我工作中用到的慢时钟域到快时钟域的Verilog HD ...

  7. 异步FIFO跨时钟域亚稳态如何解决?

    跨时钟域的问题:前一篇已经提到要通过比较读写指针来判断产生读空和写满信号,但是读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的,要是将读时钟域的读指针与写时钟域 ...

  8. 跨时钟域设计【二】——Fast to slow clock domain

    跨时钟域设计中,对快时钟域的Trigger信号同步到慢时钟域,可以采用上面的电路实现,Verilog HDL设计如下:   // Trigger signal sync, Fast clock dom ...

  9. 【iCore、iCore2、iBoard例程】【异步FIFO跨时钟域通信(通过ARM 读FPGA FIFO)】

    欢迎访问电子工程师学堂,以便了解更多内容:http://www.eeschool.org 一.本实验基于iCore2 完成,通过简单改动,即可用在 iCore 核心板.iBoard 电子学堂上. iC ...

随机推荐

  1. layer is not defined

    项目中使用layui中,引入新旧版本出现的一个问题. 使用console.log(layer) 打印出来的,显示使用的版本是1.8.0 但是页面中引入的layui有好几个.就是不使用最新的. /*这里 ...

  2. ACM学习之路

     2018-10-18 11:03:00 今天开始踏上实现梦想的道路,希望自己不要懈怠. 坚持做简单的事,坚持下来就会变得不简单.

  3. usb设备驱动的分析

    怎样来分析驱动程序呢? 1.将一个usb设备插入到电脑上,在串口软件上能够显示一些打印信息,用source insight软件打开linux内核2.6.22版本,然后从第一行查找通用的关键字,找到这一 ...

  4. Dockerfile的常见命令

    FROM 格式: FROM  <image> 或者  FROM <image>:<tag> FROM指令的功能是为后面的指令提供基础镜像,所以该指令一定是Docke ...

  5. SQL Server 2000服务器安装剖析

    一.情况说明 sql server 2000以前的版本,例如7.0一般不存在多个版本,只有标准版跟桌面版,用户如果不清楚该装什么版本的话,可按安装上的安装先决条件指示安装,一般在WIN2000 服务器 ...

  6. Vue仿string.format

    Vue.prototype.$stringFormat = function stringFormat (formatted, args) { for (let i = 0; i < args. ...

  7. Redis:MySQL算老几?

    原创: 码农翻身刘欣 前言:上一篇<MySQL:缓存算什么东西?>里挖了一个坑,也有很多人说没看过瘾,今天接着写,把坑填上,不过得把视角换一下,让Redis上台发言. 我知道MySQL看我 ...

  8. c#pc上测试微信端企业公众商城个人中心链接的工具JMeter

    工具 Apache JMeter  抓包工具,支持回放功能 安装JMeter http://jmeter.apache.org/download_jmeter.cgi    下载页 下边是下载链接 h ...

  9. java idea导入ecli项目

    转:https://blog.csdn.net/deng11408205/article/details/79723213 1.关闭所有项目:开启idea进入导入项目选项 2.选择.classpath ...

  10. Python_操作邮箱

    脚本: from win32com.client import Dispatchimport datetime as dateimport datetimeimport reimport win32c ...