当前位置: 首页 > news >正文

ODDR双边沿数据输出

ODDR双边沿数据输出
一、说明
1.oddr是xilinx fpga底层原语,其作用是将内部单沿信号转为双沿信号输出到外部设备
2.实现时钟减半,数据速率保持不变的功能
3.oddr是使用ologic模块实现的,底层使用FF触发器+MUX选择器
4.核心功能是SDR和DDR转换
5.opposite_edge模式:时钟的上升沿采集D1,时钟的下降沿采样D2
6.SAME_EDGE:在时钟的同一个边沿采集D1和D2
‌7.INIT‌:输出Q的初始值(0或1)。
‌8.SRTYPE‌:置位/复位类型(同步或异步)。
‌9.CE‌:时钟使能信号(高电平有效)
10.ODDR复位需要120ns左右,复位的时候需要注意

二、S/R置位/复位引脚,高电平有效
1.set和reset不能同时使用
IDDR #(
.DDR_CLK_EDGE           ("OPPOSITE_EDGE"            ), // "OPPOSITE_EDGE", "SAME_EDGE" 
//    or "SAME_EDGE_PIPELINED" 
.INIT_Q1                (1'b0                       ), // Initial value of Q1: 1'b0 or 1'b1
.INIT_Q2                (1'b0                       ), // Initial value of Q2: 1'b0 or 1'b1
.SRTYPE                 ("SYNC"                     )  // Set/Reset type: "SYNC" or "ASYNC" 
) IDDR_ctrl (
.Q1                     (data_en                    ), // 1-bit output for positive edge of clock
.Q2                     (data_err                   ), // 1-bit output for negative edge of clock
.C                      (rx_clk                     ),   // 1-bit clock input
.CE                     (1'b1                       ), // 1-bit clock enable input
.D                      (rx_ctrl                    ),   // 1-bit DDR data input
.R                      (~rst_n                     ),   // 1-bit reset
.S                      (1'b0                       )    // 1-bit set
);
参考:https://blog.csdn.net/dimples_Song/article/details/79442409


三、ODDR模拟模型
module oddr_model #(
parameter DDR_CLK_EDGE = "OPPOSITE_EDGE", // 模拟模式参数
parameter INIT         = 1'b0,             // 初始值
parameter SRTYPE       = "SYNC"            // 复位类型,本例只做简单同步
)(
output reg Q,
input      C,
input      CE,
input      D1,
input      D2,
input      R,
input      S
);

    reg d1_reg, d2_reg;

    // 上升沿触发的触发器,捕获D1
always @(posedge C) begin
if (R) begin
d1_reg <= 1‘b0;
end else if (S) begin
d1_reg <= 1’b1;
end else if (CE) begin
d1_reg <= D1;
end
end

    // 下降沿触发的触发器,捕获D2
always @(negedge C) begin
if (R) begin
d2_reg <= 1‘b0;
end else if (S) begin
d2_reg <= 1’b1;
end else if (CE) begin
d2_reg <= D2;
end
end

    // 用时钟选择要输出的数据
// 注意:实际硬件中这个MUX的切换速度极快,这里只是行为模拟
always @(*) begin
if (C) begin
Q = d1_reg; // 时钟高电平时,输出上升沿采样的D1
end else begin
Q = d2_reg; // 时钟低电平时,输出下降沿采样的D2
end
end

endmodule

http://www.dtcms.com/a/346372.html

相关文章:

  • 1小时检测cAMP的武功秘籍
  • AI 绘画争议背后:版权归属、艺术原创性与技术美学的三方博弈
  • Linux系统安装llama-cpp并部署ERNIE-4.5-0.3B
  • Unity--判断一个点是否在扇形区域里面(点乘和叉乘的应用)
  • Day2--HOT100--283. 移动零,11. 盛最多水的容器,15. 三数之和
  • 94. 城市间货物运输 I, Bellman_ford 算法, Bellman_ford 队列优化算法
  • 【Android】 连接wifi时,强制应用使用流量
  • 反射【Reflect】
  • 深入浅出【最小生成树】:Prim与Kruskal算法详解
  • 111、【OS】【Nuttx】【周边】效果呈现方案解析:-print0 选项
  • AQS模板方法
  • 使用 Google 开源 AI 工具 LangExtract 进行结构化信息抽取
  • 单片机---------WIFI模块
  • Seaborn数据可视化实战:Seaborn数据可视化入门-绘制统计图表与数据分析
  • Dify 从入门到精通(第 49/100 篇):Dify 的自动化测试
  • STM32 硬件I2C读写MPU6050
  • 【链表 - LeetCode】24. 两两交换链表中的节点
  • 纯手撸一个RAG
  • 黄飞对话小熊电器流程与IT负责人:企业数字化进阶与AI实践如何落地?
  • QIcon::actualSize的作用和用法
  • 2025/8/22 xxl-job速通
  • 解决 微信开发者工具 :下载基础库版本 2.31.0 失败
  • RAG和微调是什么?两者的区别?什么场景使用RAG或微调?判断依据是什么?
  • LINUX网络编程--网络的发展与通信
  • AI赋能环保精准治理:AI水质监测溯源快、空气质量预测施策准,守护生态新效能
  • 关于 java+gradle的弹窗多选应用app
  • 【GPT入门】第54课 量化位数与存储大小的影响
  • Java 面试题训练助手 Web 版本
  • 网络通信——UDP协议。
  • Kubernetes 1.28 集群部署指南(基于 Containerd 容器运行时)