全网最简单DDS原理详解

一、DDS是什么?

        Direct Digital Synthesis 直接数字频率合成。是一种信号发生器,可以产生各种波形,且其产生的波形处于调制状态可随时修改。

二、DDS原理图。

        如图可以看出主要有四部分:①相位累加器;②相位调制器;③波形数据表ROM;④D/A转换器。

        有三个输入端:系统时钟CLK;频率字输入(后面用K表示);相位字输入(后面用P表示)。一个输出端:信号输出。

三、先强调几个概念有助于后面理解。

        (1) 在相位累加器和相位调制器之前的两个累加寄存器的作用是,使频率字和相位字输入的时候不会影响到相位累加器和相位调制器的运行。

        (2) 相位累加器位数为N,相位调制器位数为M。

        (3) 相位调制器的位数与ROM地址线位数相同,即输出时按照相位调制器输出的值对照ROM地址,输出该地址对应数据。

        (4) N一般大于M,所以N使用时将高M位传入相位调制器,低N-M位用于K值计数。

        (5) 波形数据已存于ROM内。

四、DDS原理详解。

        DDS系统运行流程为:K值输入暂存于累加寄存器,在相位累加器中不断累加直到计满低N-M位后溢出,将高M位传入相位调制器,相位调制器接到P值再在此基础上加上P值(P值为定值的时候输出波形的形状不变,相位平移P值),此时根据相位调制器输出的M位值查找对应ROM地址,输出地址对应数据。

        设输入K=1,N=32,M=12,ROM地址线12位,ROM数据线8位,P值暂不考虑。

        数据传输如下:

        (1)相位累加器

        N-M=20,即N低20位用来K值自加,直至累加到2^20后溢出到高12位。共需要累加2^20/1次。

        即得到一个进位所需时间T=Tclk*(2^(N-M)/K)。(Tclk为系统时钟周期)

        (2)相位调制器

        接到相位累加器高12位数据,与P相加后寻址。12位计满(相位调制器计满)需要2^12次进位。经过2^12次进位后将储存在ROM内的波形完全读出,所以:

        输出周期Tout=T*2^M=Tclk*2^(N-M)*2^M/K=Tclk*2^N/K

        输出频率Fout=1/Tout=K/Tclk*2^N=K*Fclk/2^N

PS:最后说一下P值

        假如ROM内存储的是sin信号,但是想输出cos信号的时候,只需要将每个输出点的相位向右平移四分之三个地址即可,假如地址线位数是12,地址共有2^12=4096个,4096*3/4=3072。即P=3072时可实现该功能。

参考

【1】野火升腾Pro《FPGA Verilog开发实战指南》;

【2】小梅哥FPGA,DDS原理详解与实现

### DDS (Data Distribution Service) 工作原理 DDS 是一种高效的分布式数据通信协议,其工作原理基于以数据为中心的设计理念。以下是 DDS 的工作机制及其核心技术组件的详细说明: #### 1. **以数据为中心的核心设计** DDS 使用了一种名为“全局数据空间”的抽象概念[^4],其中所有的生产者和消费者都通过共享的主题(Topic)来交互数据。这种设计使得系统的复杂度降低,并允许动态加入或移除节点而无需重新配置整个网络。 #### 2. **主题(Topic)与参与者(Participant)** - 主题是 DDS 中用于定义数据类型的逻辑单元,它描述了所传输数据的具体结构。 - 参与者表示连接到 DDS 网络的应用程序实例。每个应用程序都可以作为发布者(Publisher)、订阅者(Subscriber),或者两者兼有[^1]。 #### 3. **发布/订阅模式** DDS 实现了一个去中心化的发布/订阅消息传递模型。在这种模型下: - 发布者负责将数据写入特定主题。 - 订阅者则根据自己的需求从这些主题读取感兴趣的数据。 #### 4. **服务质量(Quality of Service, QoS)策略** DDS 提供了一系列内置的质量服务参数,可以精确控制数据分发的行为。常见的 QoS 参数包括可靠性、延迟预算、生命周期管理等。例如: - `Reliability`:指定数据交付的方式(最佳努力或可靠交付)。 - `Deadline`:设置最大容忍的时间间隔。 ```cpp // 设置 QoS 示例代码 DDSDomainParticipantFactory::get_instance()->set_default_participant_qos(participant_qos); participant_qos.reliability().kind = RELIABLE_RELIABILITY_QOS; participant_qos.deadline().period = Duration_t{0, 500 * 1000}; // 半秒 deadline ``` #### 5. **RTPS (Real-Time Publish Subscribe Protocol)** RTPS 是 DDS 底层使用的具体实现协议之一,提供了更细粒度的消息格式和支持功能[^3]。它的模块化架构由以下几个部分构成: - **Structure Module**: 定义基本实体之间的关系。 - **Message Module**: 描述消息的内容和序列化方式。 - **Behavior Module**: 控制行为特性,比如重传机制。 - **Discovery Module**: 自动发现新加入的节点并维护当前网络状态。 #### 6. **Publisher 和 Subscriber 的角色划分** 在实际应用中,开发者通常会创建 Publisher 对象用来发送数据流;同时也会构建 Listener 类型监听器对象以便及时响应各种事件通知[^2]。下面展示如何初始化简单的 Pub/Sub 结构: ```java // Java 初始化 Publisher 和 Subscriber 示例 DomainParticipant participant = DomainParticipantFactory.create_participant(domainId, qos, null); // 创建 Topic Topic topic = participant.create_topic(topicName, typeName, qos, listener, statusMask); // 配置 Publisher 和 Writer Publisher publisher = participant.create_publisher(qos, listener); DataWriter writer = publisher.create_datawriter(topic, qos, listener, statusMask); // 同样地为 Subscriber 和 Reader 进行类似的设定... ``` --- ### 总结 综上所述,DDS 的工作原理围绕着以数据为核心的架构展开,利用发布/订阅范式以及丰富的 QoS 支持实现了高性能、高可靠的实时数据交换能力。此外,借助底层 RTPS 协议的支持进一步增强了跨平台互操作性和灵活性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值