• 数据包在网卡、CPU、主存上的流程

    一、 前言 DPDK是intel工程师开发的一款用来快速处理数据包的框架,最初的目的是为了证明传统网络数据包处理性能低不是intel处理器导致的,而是传统数据的处理流程导致,后来随着dpdk的开源及其生态的快速发展,dpdk成为了高性能网络数据处理的优秀框架。本篇文章主要介绍DPDK接收与发送报文的流程,包括CPU与网卡DMA协同工作的整个交互流程、数据包在内存、CPU、网卡之间游走的过程。 二、场景 DPDK从2013开始开源,经过前辈们的缝缝补补到现在为止DPDK框架比较成熟、使用比较方便,使得现在开发者在不需要深入了解底层数据包收发原理的情况下也可以做简单的项目开发。但是个人感觉做简单的项目尚且可以应付,如果需要做性能优化等类似的需求时就需要取全面的了解DPDK的收发包机制,因为收发包性能与驱动工作流程、前期初始化配置息息相关。话不多说,下面我们进入正题。 三、收发包处理流程 数据包接收的大体流程: 数据包到达网卡 网卡经过DMA操作将数据包从网卡拷贝到收包队列 DPDK应用从收包队列中取包 数据包发送的大体流程: DPDK应用将数据包送到发包队列 网卡经过DMA操作将网卡队列中的数据包拷贝到网卡 数据包从网卡发出 收发包流程中的关键操作,主要是网卡如何与DPDK应用交互: 网卡的初始化配置操作有哪些,因为网卡要想正常工作肯定需要进行初始化配置一些属性 网卡的DMA操作怎么找到DMA 地址,进而将数据包拷贝到系统主存供DPDK读取 网卡把数据包成功放到队列后如何通知DPDK应用去队列中读取 DPDK从队列中取完数据包后需要做哪些操作通知网卡为下一次收包做准备 DPDK将数据包送到发送队列中需要做哪些预操作 网卡从发送队列中取包需要做哪些操作 四、收包软件处理流程 DPDk在初始化阶段通过igb_alloc_rx_queue_mbufs 负责将描述符,mbuf, dma,接收队列给关联起来,如下图所示。 1、模块/硬件介绍 Network interface: 指以太网卡,它工作在OSI的下两层(物理层、数据链路层),工作在物理层的芯片称为PHY,工作在数据链路层的芯片称为MAC控制器,即Media Access Control,即媒体访问控制子层协议.该协议位于OSI七层协议中数据链路层的下半部分,但是目前好多网卡是将MAC和PHY功能做到了一颗芯片中,但是MAC和PHY的机制还是单独存在的,只是对外体现为一颗芯片。MAC控制器的功能主要是数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能;PHY芯片的主要功能是将从PHY来的并行数据转换为穿行流数据,再按照物理层的编码规则把数字信号进行编码,最后再转换为模拟信号把数据发出去。 RX_FIFO: 数据接收缓冲区 TX_FIFO: 数据发送缓冲区 DMA Engine:Direct Memory Access,即直接寄存器访问,是一种告诉的数据传输方式,允许在外部设备和存储器之间直接读写数据,数据的读写不消耗CPU资源,DMA控制器通过一组描述符环形队列与CPU互相操作完成数据包的收发。CPU通过操作DMA寄存器来与DMA控制器进行部分通信与初始化配置,主要寄存器有Base、Size、Tail、Head,head寄存器用于DMA往rx_ring里插入时使用,tail是应用通过写寄存器通知给DMA控制器当前可用的最后一个描述符(head->next 为tail时表示当前rx_ring存满了,再来报文会被记录rx_missed_error)。 Rx_queue: 收包队列结构体:我们主要关注两个环形队列rx_ring、sw_ring Rx_ring:一个地址连续环形队列,存储的是描述符,描述符中包含将来存放数据包的物理地址、DD标志(下面会介绍DD标志)等,上面图中只画了存放数据包的物理地址,物理地址供网卡DMA模块使用,也称为DMA地址(硬件使用物理地址,当网卡收到数据包后会通过DMA操作将数据包拷贝到物理地址,物理地址是通过虚拟地址转换得到的,下面分析源码时会介绍) Sw_ring: 存储的是将来存放数据包的虚拟地址,虚拟地址供应用使用(软件应用使用虚拟地址,应用往虚拟地址读写数据包) DD标志:用于标识一个描述符buf是否可用,无论网卡是工作在轮询方式下还是中断方式,判断数据包接收成功或者是否发送成功都需要检查描述符中的完成状态位(Description Done)DD,该状态位由DMA控制器在完成操作后进行回写 Mbuf:对应于Mbuf内存池中的元素,通过alloc或者free操作内存池获取或者释放mbuf对象,这里需要说的一点是mbuf池创建的时候是连续的,但是rx_ring和sw_ring里指向的数据地址不一定是连续的,下面分析收包流程时会介绍 PCIE总线:采用高速串行通信互联标准,自上而下分为事务传输层、数据链路层、物理层,网卡与CPU之间数据包的传输、CPU对网卡寄存器的MMIO操作都通过PCIE进行传输 DMA寄存器:CPU配置网卡的操作通过操作网卡的寄存器,寄存器主要 2、收包流程 Rx_ring收数据时的状态如下: DMA控制器收到数据后往head写,当head=tail时表示当前队列为空,head->bext = tail表示当前队列已存满,dpdk启动刚初始化完后如下图所示: 可以看出来cpu对tail寄存器的更新并不是在rx_ring描述符中填充完dma地址后立马就执行,而是等dma可用描述符低于一定阈值时才执行写寄存器更新tail 具体详细流程如下: (1)CPU填缓冲地址(mbuf中的data)到收接收侧描述符(在dpdk初始化时就会第一次填充),也就是上图中rx_ring会指向mbuf池中的 部分mbuf用于接收数据包;另外CPU通过操作网卡的base、size寄存器,将rx_ring环形队列的起始地址和内存卡大小告诉给DMA控制器,将描述符队列的物理地址写入到寄存器后,dma 通过读这个寄存器就知道了描述符队列的地址,进而 dma收到报文后,会将报文保存到描述符指向的 mbuf 空间 (2)网卡读取rx_ring队列里接收侧的描述符进而获取系统缓冲区地址 (3)从外部到达网卡的报文数据先存储到网卡本地的RX_FIFO缓冲区 (4)DMA通过PCIE总线将报文数据写到系统的缓冲区地址 (5)网卡回写rx_ring接收侧描述符的更新状态DD标志,置1表示接收完毕 (6)CPU读取描述符sw_ring队列中元素的DD状态,如果为1则表示网卡已经接收完毕,应用可以读取数据包 (7)CPU从sw_ring中读取完数据包后有个“狸猫换太子”的动作,重新从mbuf池中申请一个mbuf替换到sw_ring的该描述符中 将新分配的mbuf虚拟地址转换为物理地址更新到rx_ring中该条目位置的dma物理地址、更新描述符rx_ring队列里的DD标志置0,这样网卡就可以持续往rx_ring缓冲区写数据了 (8)CPU判断rx_ring里可用描述符小于配置的阈值时更新tail寄存器,而不是回填一个mbuf到描述符就更新下tail寄存器(因为CPU高频率的操作寄存器是性能的杀手,所以改用此机制) (9)至此,应用接收数据包完毕 注意:这里有两个非常关键的队列rx_ring、sw_ring,rx_ring描述符里存放的是mbuf里data区的起始物理地址供DMA控制器收到报文后往该地址写入(硬件DMA直接操作物理地址,不需要cpu参与);sw_ring描述符里存放的是mbuf的起始虚拟地址供应用读取数据包 需要C/C++ Linux服务器架构师学习资料加qun812855908获取(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享 3、代码的实现过程 我们以e1000驱动类型网卡举例,来分析数据包接收相关的软件结构及接口 (1)接收队列的结构如下图,图中标出了两个重要的环形队列(上面已介绍): (2)数据包的软件接收流程如下图 (3)分析下eth_igb_recv_pkts接口源码,与第四章的收包内部流程相对应 uint16_teth_igb_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts){ struct igb_rx_queue *rxq; volatile union e1000_adv_rx_desc *rx_ring; volatile union e1000_adv_rx_desc *rxdp; struct igb_rx_entry *sw_ring; struct igb_rx_entry *rxe; struct rte_mbuf *rxm; struct rte_mbuf *nmb; union e1000_adv_rx_desc rxd; uint64_t dma_addr; uint32_t staterr; uint32_t hlen_type_rss; uint16_t pkt_len; uint16_t rx_id; uint16_t nb_rx; uint16_t nb_hold; uint64_t pkt_flags; nb_rx = 0; nb_hold = 0; rxq = rx_queue; rx_id = rxq->rx_tail; rx_ring = rxq->rx_ring; sw_ring = rxq->sw_ring; while (nb_rx < nb_pkts) { /*第一步:从描述符队列中找到被应用最后一次接收的那个文件描述符的位置*/ rxdp = &rx_ring[rx_id]; staterr = rxdp->wb.upper.status_error; /*第二步:检查DD状态是否为1,为1则说明驱动已经将报文成功放到接收队列,否则直接退出*/ if (! (staterr & rte_cpu_to_le_32(E1000_RXD_STAT_DD))) break; rxd = *rxdp; PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_id=%u " "staterr=0x%x pkt_len=%u", (unsigned) rxq->port_id, (unsigned) rxq->queue_id, (unsigned) rx_id, (unsigned) staterr, (unsigned) rte_le_to_cpu_16(rxd.wb.upper.length)); /*第三步:从mbuf池中重新申请一个mbuf,为下面的填充做准备*/ nmb = rte_mbuf_raw_alloc(rxq->mb_pool); if (nmb == NULL) { PMD_RX_LOG(DEBUG, "RX mbuf alloc failed port_id=%u " "queue_id=%u", (unsigned) rxq->port_id, (unsigned) rxq->queue_id); rte_eth_devices[rxq->port_id].data->rx_mbuf_alloc_failed++; break; } nb_hold++; /*第四步:找到了描述符的位置,也就找到了需要取出的mbuf*/ rxe = &sw_ring[rx_id]; rx_id++; if (rx_id == rxq->nb_rx_desc) rx_id = 0; /* Prefetch next mbuf while processing current one. */ rte_igb_prefetch(sw_ring[rx_id].mbuf); /* * When next RX descriptor is on a cache-line boundary, * prefetch the next 4 RX descriptors and the next 8 pointers * to mbufs. */ if ((rx_id & 0x3) == 0) { rte_igb_prefetch(&rx_ring[rx_id]); rte_igb_prefetch(&sw_ring[rx_id]); } rxm = rxe->mbuf; /*第五步:给描述符sw_ring队列重新填写新申请的mbuf*/ rxe->mbuf = nmb; /*第六步:将新申请的mbuf的虚拟地址转换为物理地址,为rx_ring的缓冲区填充做准备*/ dma_addr = rte_cpu_to_le_64(rte_mbuf_data_iova_default(nmb)); /*第七步:将rx_ring描述符中该条目的DD标志置0,表示允许DMA控制器操作*/ rxdp->read.hdr_addr = 0; /*第八步:重新填充rx_ring描述符中该条目的dma地址*/ rxdp->read.pkt_addr = dma_addr; /* * Initialize the returned mbuf. * 1) setup generic mbuf fields: *    - number of segments, *    - next segment, *    - packet length, *    - RX port identifier. * 2) integrate hardware offload data, if any: *    - RSS flag & hash, *    - IP checksum flag, *    - VLAN TCI, if any, *    - error flags. */ /*第九步:对获取到的数据包做部分封装,比如:报文类型、长度等*/ pkt_len = (uint16_t) (rte_le_to_cpu_16(rxd.wb.upper.length) - rxq->crc_len); rxm->data_off = RTE_PKTMBUF_HEADROOM; rte_packet_prefetch((char *)rxm->buf_addr + rxm->data_off); rxm->nb_segs = 1; rxm->next = NULL; rxm->pkt_len = pkt_len; rxm->data_len = pkt_len; rxm->port = rxq->port_id; rxm->hash.rss = rxd.wb.lower.hi_dword.rss; hlen_type_rss = rte_le_to_cpu_32(rxd.wb.lower.lo_dword.data); /* * The vlan_tci field is only valid when PKT_RX_VLAN is * set in the pkt_flags field and must be in CPU byte order. */ if ((staterr & rte_cpu_to_le_32(E1000_RXDEXT_STATERR_LB)) && (rxq->flags & IGB_RXQ_FLAG_LB_BSWAP_VLAN)) { rxm->vlan_tci = rte_be_to_cpu_16(rxd.wb.upper.vlan); } else { rxm->vlan_tci = rte_le_to_cpu_16(rxd.wb.upper.vlan); } pkt_flags = rx_desc_hlen_type_rss_to_pkt_flags(rxq, hlen_type_rss); pkt_flags = pkt_flags | rx_desc_status_to_pkt_flags(staterr); pkt_flags = pkt_flags | rx_desc_error_to_pkt_flags(staterr); rxm->ol_flags = pkt_flags; rxm->packet_type = igb_rxd_pkt_info_to_pkt_type(rxd.wb.lower. lo_dword.hs_rss.pkt_info); /* * Store the mbuf address into the next entry of the array * of returned packets. */ /*第十步:将获取到的报文放入将要返回给用户操作的指针数组中*/ rx_pkts[nb_rx++] = rxm; } rxq->rx_tail = rx_id; /* * If the number of free RX descriptors is greater than the RX free * threshold of the queue, advance the Receive Descriptor Tail (RDT) * register. * Update the RDT with the value of the last processed RX descriptor * minus 1, to guarantee that the RDT register is never equal to the * RDH register, which creates a "full" ring situtation from the * hardware point of view... */ /*第十步:CPU判断rx_ring里可用描述符小于配置的阈值时更新尾部寄存器供DMA控制器参考*/ nb_hold = (uint16_t) (nb_hold + rxq->nb_rx_hold); if (nb_hold > rxq->rx_free_thresh) { PMD_RX_LOG(DEBUG, "port_id=%u queue_id=%u rx_tail=%u " "nb_hold=%u nb_rx=%u", (unsigned) rxq->port_id, (unsigned) rxq->queue_id, (unsigned) rx_id, (unsigned) nb_hold, (unsigned) nb_rx); rx_id = (uint16_t) ((rx_id == 0) ? (rxq->nb_rx_desc - 1) : (rx_id - 1)); E1000_PCI_REG_WRITE(rxq->rdt_reg_addr, rx_id); nb_hold = 0; } rxq->nb_rx_hold = nb_hold; return nb_rx;} 五、发包软件处理流程 发包流程与第四章的收包流程有些区别,DPDk在初始化阶段不会从mbuf池中获取缓冲区插到描述符队列空间里,只有在真正的发送过程中才会从mbuf池中获取mbuf,然后插入到描述符队列空间里。 1、模块/硬件介绍 Tx_queue: 发包队列结构体:我们主要关注两个环形队列tx_ring、sw_ring Tx_ring:一个地址连续环形队列,存储的是描述符,描述符中包含将来存放数据包的物理地址、DD标志(下面会介绍DD标志)等,上面图中只画了存放数据包的物理地址,物理地址供网卡DMA模块使用,也称为DMA地址(硬件使用物理地址,当网卡收到数据包后会通过DMA操作将数据包拷贝到物理地址,物理地址是通过虚拟地址转换得到的,下面分析源码时会介绍) 2、发包流程 Tx_ring发数据时的状态如下: dpdk初始化完成时tx_ring的队列为空 DMA控制器通过head去判断当前的DD状态,如果为0则可以执行发送动作 CPU需要对tx_ring上网卡发送成功的描述符的缓存空间进行释放操作,待应用下次继续写入 (1)CPU读取发送侧描述符tx_ring队列,检查DD标志是否为1,为1则说明发送完毕 (2)针对发送完毕的描述符需要释放该描述符里对应的缓冲区 (3)CPU将准备发送的缓冲区mbuf的虚拟地址填充到描述符sw_ring (4)CPU通过将准备发送的缓冲区mbuf的虚拟地址转换得到该mbuf里data数据部分的物理地址填充到发送测描述符tx_ring队列中,并将DD标志清0 (5)DMA控制器读取base寄存器,获取发送侧描述符,根据发送测描述符获取tx_ring队列地址,读取head指针里的元素,判断DD标志释放为0则从描述符中获取数据缓存区地址,通过PCIE总线将数据拷贝到网卡硬件Tx_FIFO缓存中往外发送数据 (6)DMA控制器回写该描述符中队列里DD的标志置1,通知CPU该缓存中数据已成功发送 (7)至此,应用发送数据包完毕 注意:这里有两个非常关键的队列tx_ring、sw_ring,tx_ring描述符里存放的是mbuf里data区的起始物理地址供DMA控制器读取报文(硬件DMA直接操作物理地址,不需要cpu参与);sw_ring描述符里存放的是mbuf的起始虚拟地址供应用写入数据包 3、代码的实现过程 我们以e1000驱动类型网卡举例,来分析数据包发送相关的软件结构及接口 (1)发送队列的结构如下图,图中标出了两个重要的环形队列(上面已介绍): (2)数据包的软件发送流程如下图 (3) eth_igb_xmit_pkts接口源码,发包逻辑参考上面小节,这里不做补充了 六 、总结 到目前位置分析完了数据包在网卡、CPU、主存上游走的流程,可以看到DPDK收发包的流程设计的还是比较震撼的,充分考虑到了高性能收发数据,其中一些处理流程、数据结构的设计经验等值得我们在平时的开发项目中去运用和学习。

    03-05 153浏览
  • RTC电池能用多久?与哪些因素有关?

    ▼关注下方公众号了解更多▼ 一、 摘要 现在几乎所有的电子产品都带RTC功能,因此RTC电池的寿命肯定是越长越好。 二、 问题描述 本案例是一个带RTC功能的工业产品,RTC部分的供电电路如下下图,产品发往市场半年以后,就提示更换RTC电池,远远低于设计寿命5年。 图1-有问题的RTC电池供电电路 三、 原因分析 产品返回公司以后,我们更换上新的RTC电池,串联高精度万用表进去测量电流,发现RTC的工作电流高达100uA, 和我们设计的5uA有很大的差距。我们怀疑的点有: 1、二极管D3漏电流太大,设备断电时,通过D3倒流到系统的电源上。 2、RTC芯片影响,原来的RTC芯片为NXP-PCF8563P,手册描述备用电源时功耗为0.25uA;中途有更换国产RTC; 3、RTC电源线路上有漏电路,例如电容的漏电流 4、电阻R71影响。 我们通过排除法,先排除D3,因为去除D3,电流只减小1uA左右;接着排除RTC电源上电容等漏电流,因为去除电容电流依然有100uA左右。 将RTC芯片更换为NXP-PCF8563P。电流正常,大约只有4uA。接着我们换回国产RTC,同时将电阻更换为100R,则电流也正常,只有4uA左右。 于是我们引出两个疑问: (1)RTC电源上的串联电阻多少合适? (2)为何串联10K的限流电阻会导致RTC芯片不仅没有变小,反而电流增大; 1. RTC电源串联电阻阻值多少合适? RTC电源上串联的电阻阻值在网络上的争论一直在,有人说0R,有人说1K、10K等各种阻值,但是能够理论讲清楚的基本没有。 首先我们 要明白这个电阻的目的:限流。参考各个厂商的一次性纽扣电池,以阳光动力的CR2025为例,其他品牌类似,厂家要求电池在任何情况下都不允许短路,否则有可能炸裂或者爆炸。因此,一旦发生后级短路时,限流电阻必须将电流限定在最大持续放电电流以内,运行产品工作不正常,但是不允许产品起火甚至爆炸。 因此该型号的限流电阻最小值为 R=V/I=3V/3mA=1KΩ;对于电池来说,电阻可以比该阻值大,但是不能比该阻值小。 图2-电池厂家的电池规格要求 2. 串联10K电阻为何电流变大 ? 回答问题前,我们先了解一下RTC芯片的特性: (1)、RTC芯片有两种工作模式,一种是正常工作模式,一种是备用电源工作模式,如下图,两者的供电电流可以相差200倍; (2)、每一种模式下,RTC芯片都可以理解为一个恒流源,比如电池模式需要1uA左右,正常模式需要200uA左右; (3)、RTC的芯片的电压范围非常广,可以在1.5V~5.5V之间都可以正常工作。 RTC芯片可以理解为一个电流源,串联一个10K的电阻,当流过电流为100uA时,在电阻上的压降将会达到1V,如果此时电池电压只有2.6V,则RTC芯片的工作电压只有1.6V,如果电池电压更小,RTC芯片获得的电压更低,由于RTC芯片工作电压范围很广,但是需要的电流是基本不变的,为了获得足够的电流,RTC芯片可以理解为进一步降低阻抗,导致电流进一步加大。 国产芯片可能在正常工作模式和备用电源模式之间的切换的逻辑不够清晰,导致使用电池的时候也进入正常工作模式。(此为猜测,没有从厂商的资料中找到根据)。 图3-RTC芯片的直流工作参数 四、 解决方案 经过上述分析可知,为了延长电池的寿命,主要降低RTC回路上的电流。回路上的损耗主要有:电阻、二极管、RTC芯片、电容。 1、RTC电池模式电流 目前大部分的厂家的RTC芯片在电池模式下可以做到几百nA到1uA左右,因此RTC电流可以按照1uA进行估算。 2、二极管的漏电流 二极管的主要损耗在于漏电流,因此需要选择漏电流尽可能小的二极管,下图是BAS70系列二极管的漏电流的曲线图,为例保守起见,也可以按照1uA进行估算。 图4-BAS70系列二极管漏电流 /温度/电压曲线 3、电容损耗 电容的损耗主要也是体现在漏电流,RTC电池对电源要求不高,因此使用100nF的电容滤波即可,漏电流可以评估约0.5uA。 图5- 常见陶瓷电容漏电流 4、电阻损耗 经过上述分析,总的电流=二极管漏电流+RTC芯片电流+电容漏电流=1uA+1uA+0.5uA=2.5uA。电阻一般可以选择1K。RTC芯片和电阻为串联关系。1K电阻1uA的压降 : V=IR=1K*2.5uA=0.0025V 功率为 p1=U*U/R=0.0025V*0.0025V/1000=0.00625uW RTC芯片的功率 P2=UI=(3V-0.2V-0.0025V)*1uA=2.7975uW 电阻的损耗占比=P1/P2=0.089%,因此电阻的损耗基本可以忽略不计。 5、电池的寿命估算 以阳光动力电池CR2025为例,电池自放电损失约每年1%,标称容量为150mAH,上述案例的寿命评估 T=150mAh*95%/(二极管漏电流1uA+RTC电流1uA+电容漏电流0.5uA)=57000H≈6.5年。 6、最终的解决方案 以阳光动力电池CR2025为例,二极管更换为更低漏电流1uA左右的BAS70系列,电阻只串联在电池上,只防电池短路,限制电流在3mA。 图6- 改善后的RTC供电电路 五、 总结 本文回复了RTC的两个问题。 1、RTC电池要不要串联电阻,电阻阻值多少合适。 2、RTC 寿命的评估考虑因素 声明:内容来源于网络,版权归原作者所有。如有侵权,请联系删除。

    2024-12-19 156浏览
  • 电场和磁场是两种不同的物理场

    电场和磁场是两种不同的物理场,它们有着不同的性质和作用。核心答案是:电场是由电荷引起的物理场,它影响带电粒子的运动;而磁场是由电流或磁性物质引起的物理场,它对磁性物质和电流产生力和影响。

    2024-12-19 97浏览
  • 分享一个RC振荡电路

    介绍了使用OP07芯片构建的RC文氏桥振荡电路的工作原理,包括负反馈、正反馈、选频网络的概念。通过仿真分析,探讨了起振时间、振荡幅度、输出频率的影响因素,并解决了单电源供电的问题。实验总结强调了电路连接的注意事项及参数调整的重要性。 具体原理图如下 在这里使用的OP07的原因是学校提供这个芯片,需要注意的是OP07相应的引脚与别的芯片有所差别,但原理基本一致。 放大器的工作工作原理: 放大信号,刚上电的时,电路会出现频率丰富的微小噪声,放大器将噪声放大要使振荡稳定,信号不能无休止的放大下去,于是我们引入负反馈,使放大倍数稳定在3倍选出所需的频率,运用RC带通滤波器(RC低通和高通的组合),即可提取所需的频率同时RC并联串联网络也是电路的正反馈网络 振荡需要满足以下两个条件:(1)相位平衡条件:反馈电路的相位与输入电压的相位同相(2)振幅平衡条件:反馈电压的幅度与输入电压的幅度相等,这是电路维持稳振荡的振幅条件刚开始的时候放大倍数与反馈系数乘积大于1,信号持续放大,大到一定程度时,放大倍数减小,使得电路放大倍数为与反馈系数的乘积为1,信号稳定输出。 1.负反馈与放大倍数 反馈是将输出信号的全部或一部分返回至输入,使输入信号改变,而负反馈是引起输入信号减小的一种反馈方式。同向放大器引入负反馈,使得输出信号与输入信号比值稳定,且因为是同向放大器,故 2.正反馈与选频网络 正反馈: 反馈是将输出信号的全部或一部分返回至输入,使输入信号改变,而正反馈是引起输入信号增大的一种反馈方式。 上图为实际电路的反馈网络,将输出电压的一部分,即C1R2并联网络上面的分压送回输入端,使得净输入量增大。R2C1 和 R1C2 组成正反馈网络,反馈系数为F=U(R2C1)/ U(R1C2),可等效为阻抗之比(电压与阻抗成正比),F=Z(R2C1)/ Z(R1C2)。选频网络:RC滤波器其中高通滤波器与低通滤波器的区别就在于电容电阻的摆放位置,高通滤波器顾名思义是通过高频信号,阻断低频信号,因此电容放在输入端,低通滤波器的输入端接电阻,这是根据电容通交流阻直流的特性判断的,如果电容足够大,那么我们可以将频率过低的信号近似等效成直流信号,那么他就不会通过高通滤波器的第一个电容。 RC带通滤波器 仿真分析: 刚开始我也是在CSDN上面找大佬的电路,进行复现,但亲手做之后出现了许多问题,下面进行分析1.起振时间过长原理图如下我刚开始做的时候,波形怎么也出不来,也不知道啥原因,结果如下 偶然一次我运行仿真,然后忘记关了,再回过头发现居然出波形了 分析原因,是因为其中的R1过小,导致起振时间太长,再加上计算机仿真计算过慢,显示的1.9s,实际要二十多秒,所以我一直以为我失败了 我们加大R1的阻值后,波形如下 增大R1阻值后,起振时间明显变快 ,大概200多毫秒后可以明显看到电路起振。原因:当信号较小时,二极管不导通,放大倍数随R1的增大而增大,起振时间变快2.振荡幅度电路图我们换回原来的 它的输出波形为我们观察到其幅值为8.166V,我们改变R4的大小,需注意R4不能过大,R4+R5不宜过小,这里我们调小R4的阻值,改为10KΩ 观察其波形可以看到其输出幅值明显变小,为1.564V 猜想与解释,在这里我们可将二极管等效为一个电阻,它随的阻值随着压降的增大而减小当R4上的阻值较大时,那相应的R5和二极管的并联回路的等效电阻较小,即可以看成二极管的阻值变小了很多,压降变大了许多,所以到振荡稳定时所需的时间也相应增加,故输出幅值大当R4上的阻值较小时,那相应的R5和二极管的并联回路的等效电阻较大,二极管所需的压降不大,所以到振荡稳定时所需的时间较少,故输出信号持续放大的时间较少,故输出幅值较小3.输出频率前面原理已经说过了,输出频率和R2C1 、 R1C2有关,f=1/(2πRC)电阻电容为以下值时输出波形如下改变RC的值 得到以下波形频率明显改变 4.单电源供电原理图如下单电源供电时的输入信号如果以地作为参考,实际上也就是以供电电源的一端作为参考。例如这样的反向放大器在输入信号为正电压时,由于输出不可能低于最低供电电压,所以不能正常工作。这里我们引入一个偏置,即图中6V的VDD(1/2VCC),相当于一个虚拟地,让输入信号以6V电压为基准进行变化,使放大后的信号能在0-VCC之间变化,信号完整输出。同时我们在输出端在加上一个电容C4,根据电容“隔直通交”的特性,将会滤除直流成分,保留所需的交流信号。如果不加这个电容的话,示波器负极性端可以连上6V的VDD,使输出波形同上。输出波形如下 在这里解释下面几点C3的作用?C3的作用是让直流时与公共地断开,因为放大器“虚短”的特性,同向输入端电位等于反向输入端,而交流成分和之前分析一样。为什么R4改为13K?因为为15K时,交流信号的变化范围超过了放大器允许的输出范围,信号失真。如果不想改R4的值,还可以将VCC变为24V,使得运放的变化范围与双电源的一样。为什么引入6V的VDD?这里主要是方便理解,实际电路可用电阻分压的方法,得到1/2VCC(VDD),但是采用这种方式的话还需要考虑所引起的电路参数的变化。 实验总结: OP07引脚图和网上大多数放大器引脚映射不一样,实际电路须合理连线。 单电源供电需要加入偏置。 可以通过改变电阻值,选择合适的,利于观察的输出波形。 真就万物皆可等效为电阻

    2024-12-13 296浏览
  • 深入理解PDK的作用

    PDK(Process Design Kit,工艺设计套件)作为连接芯片设计和制造的桥梁,有以下重要作用: 一、设计方面 提供设计规则 定义了芯片制造过程中的几何限制,例如最小线宽、最小间距、层与层之间的对准公差等。这些规则确保芯片设计师在设计过程中遵循代工厂的制造能力,避免设计出无法制造或者制造后性能不符合要求的芯片。 比如在先进的7nm工艺中,PDK会明确规定金属布线层的最小宽度可能只有几十纳米,设计师必须按照这个规则来布局电路,否则在制造过程中可能会出现短路或断路等问题。 支持设计流程 包含了与设计工具(如EDA工具)集成的必要文件和模型。这使得设计师能够在熟悉的设计环境中进行工作,将自己的电路设计想法准确地转化为符合代工厂工艺要求的设计。 例如,PDK提供的标准单元库模型可以被逻辑综合工具识别和使用,从而将高级别的设计描述(如Verilog代码)转换为实际的电路网表。 二、制造方面 工艺信息传递 向芯片设计师传达代工厂的工艺技术细节,包括所使用的材料、制造工艺步骤(如光刻、蚀刻、掺杂等工艺的特性)等。这样设计师可以根据这些信息优化设计,以适应特定的制造工艺。 例如,如果代工厂的某种光刻工艺对特定形状的图案有更好的分辨率,设计师可以在设计中更多地采用这种形状的图案布局,提高芯片制造的良品率。 确保工艺兼容性 保证芯片设计与代工厂的制造设备和工艺流程相兼容。不同的代工厂可能有不同的设备和工艺,PDK就是一个桥梁,使得设计出来的芯片能够在特定的代工厂顺利制造。 例如,一家代工厂使用的是某种特定型号的光刻机,PDK会考虑该光刻机的特性,如曝光波长、分辨率等,从而确保芯片设计能够在该光刻机上正确制造。 下面的一份资料,供大家初步了解PDK在提升芯片设计效率中起到的作用 注:资料来源于网络,仅供学习,如有侵权联系删除 总结 FAB厂针对不同应用提供多种技术:如平面(Planner)技术适合低成本应用,而鳍式场效应晶体管(FinFet)和环绕式栅极(GAA)技术适用于更高性能的GPU/CPU类应用。 PDK是代表技术的基本构建模块,用于设计、验证、签核和制造。 PDK包含技术文件、运行设置、实用程序、端到端流程和文档。 功能丰富的PDK可实现高质量和按时的产品开发。

    2024-12-13 467浏览
  • BUCK电源输出放电功能怎么样?

    继续分析下输出放电功能...

    2024-12-13 210浏览
  • 芯片散热怎么设计?

    在IC中,一个温度参照点始终是器件的一个节点,即工作于给定封装中的芯片内部最热的点。

    2024-12-04 225浏览
  • 熔断器与断路器的选择性比较

    熔断器和断路器在主要性能方面存在一些差异,为了更好选择和使用熔断器和断路器,下面针对熔断器和断路器的主要性能进行对比。

    2024-08-13 400浏览
  • 实时操作系统RT-Thread与Freertos的对比

    Freertos是一个国外推出的一个迷你的实时操作系统内核,开源,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。 RT-Thread是中国人自己推出的一个集实时操作系统(RTOS)内核、中间件组件和开发者社区于一体的技术平台,开源os,RT-Thread除了有常规RTOS的功能,还具备一个IoT OS平台所需的所有关键组件。例如GUI、网络协议栈、安全传输、低功耗组件等等。下面比较一下Freertos和RT-Thread 在内核、支持的组件、驱动: freertos简称FR,rt-thread简称RT。首先FR和RT基本定位都是IoT系统。 1 、背景 FR是亚马逊旗下,RT背景和应用相对较弱。而国内没有大企业支持RT,而是各自开发IoT系统,华为-liteOS、腾讯TencentOS tiny、阿里AliOS Things。群雄割据,RT生存空间可想而知。 2、软件包和组件 FR和亚马逊IoT云服务结合是比较好的,国内组件结合度应该RT占优,例如阿里云。 3 、学习资料 RT有中文文档,FR有正点原子等众多视频4 文件:确实如下面RT介绍的,RT是一个包含组件的包,包含的东西很多,打开就能用。FR不是很清楚。从文件大小来说,RT 一百多MB,FR只有几MB。RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件。内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台,这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到60+,如下举例: 物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。 脚本语言相关的软件包:目前支持 JerryScript、MicroPython。 多媒体相关的软件包:Openmv、mupdf。 工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。 系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。 外设库与驱动类软件包:RealTek RTL8710BN SDK。

    2024-08-09 701浏览
  • 分析一个共集电极放大电路

    仿真前仿真中示波器波形图双击示波器图标,调节X轴扫描为500μS/Div,A、B通道Y轴幅度均为1V/Div。

    2024-07-25 264浏览
正在努力加载更多...
广告