目录

  • 摘要
  • 一、设计目标
  • 二、 设计方案
    • 1.硬件
    • 2.系统流程图
  • 三、具体实现步骤
    • 1.XADC的使用
    • 2.PmodDA3的调试
    • 3.Fir滤波器
      • - 系统自带的IP核
      • - Matlab生成DA滤波器
    • 4.开关控制
  • 四、总结

摘要

通过ZYBOZ7开发板实现了分布式结构的FIR滤波器,实现了AD输入两路信号,通过开关输入可以分别单路输出、相加、相乘、相加后滤波、相乘后滤波的功能。

一、设计目标

设计基于FPGA的分布式结构的FIR滤波器,实现对输入信号的采集、滤波和输出。

二、 设计方案

1.硬件

材料 型号 规格
ZyboZ7开发板 zynq-7000 xc7z020clg400
DA PmodDA3 16位串行/类SPI接口
AD拓展接口 - -

实物图:

2.系统流程图

#mermaid-svg-9yBcRbA8BSynhPPG .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-9yBcRbA8BSynhPPG .label text{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .node rect,#mermaid-svg-9yBcRbA8BSynhPPG .node circle,#mermaid-svg-9yBcRbA8BSynhPPG .node ellipse,#mermaid-svg-9yBcRbA8BSynhPPG .node polygon,#mermaid-svg-9yBcRbA8BSynhPPG .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-9yBcRbA8BSynhPPG .node .label{text-align:center;fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .node.clickable{cursor:pointer}#mermaid-svg-9yBcRbA8BSynhPPG .arrowheadPath{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-9yBcRbA8BSynhPPG .flowchart-link{stroke:#333;fill:none}#mermaid-svg-9yBcRbA8BSynhPPG .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-9yBcRbA8BSynhPPG .edgeLabel rect{opacity:0.9}#mermaid-svg-9yBcRbA8BSynhPPG .edgeLabel span{color:#333}#mermaid-svg-9yBcRbA8BSynhPPG .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-9yBcRbA8BSynhPPG .cluster text{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-9yBcRbA8BSynhPPG .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-9yBcRbA8BSynhPPG text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-9yBcRbA8BSynhPPG .actor-line{stroke:grey}#mermaid-svg-9yBcRbA8BSynhPPG .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-9yBcRbA8BSynhPPG .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-9yBcRbA8BSynhPPG #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-9yBcRbA8BSynhPPG .sequenceNumber{fill:#fff}#mermaid-svg-9yBcRbA8BSynhPPG #sequencenumber{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG #crosshead path{fill:#333;stroke:#333}#mermaid-svg-9yBcRbA8BSynhPPG .messageText{fill:#333;stroke:#333}#mermaid-svg-9yBcRbA8BSynhPPG .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-9yBcRbA8BSynhPPG .labelText,#mermaid-svg-9yBcRbA8BSynhPPG .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-9yBcRbA8BSynhPPG .loopText,#mermaid-svg-9yBcRbA8BSynhPPG .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-9yBcRbA8BSynhPPG .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-9yBcRbA8BSynhPPG .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-9yBcRbA8BSynhPPG .noteText,#mermaid-svg-9yBcRbA8BSynhPPG .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-9yBcRbA8BSynhPPG .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-9yBcRbA8BSynhPPG .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-9yBcRbA8BSynhPPG .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-9yBcRbA8BSynhPPG .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG .section{stroke:none;opacity:0.2}#mermaid-svg-9yBcRbA8BSynhPPG .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-9yBcRbA8BSynhPPG .section2{fill:#fff400}#mermaid-svg-9yBcRbA8BSynhPPG .section1,#mermaid-svg-9yBcRbA8BSynhPPG .section3{fill:#fff;opacity:0.2}#mermaid-svg-9yBcRbA8BSynhPPG .sectionTitle0{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .sectionTitle1{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .sectionTitle2{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .sectionTitle3{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-9yBcRbA8BSynhPPG .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG .grid path{stroke-width:0}#mermaid-svg-9yBcRbA8BSynhPPG .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-9yBcRbA8BSynhPPG .task{stroke-width:2}#mermaid-svg-9yBcRbA8BSynhPPG .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG .taskText:not([font-size]){font-size:11px}#mermaid-svg-9yBcRbA8BSynhPPG .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-9yBcRbA8BSynhPPG .task.clickable{cursor:pointer}#mermaid-svg-9yBcRbA8BSynhPPG .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-9yBcRbA8BSynhPPG .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-9yBcRbA8BSynhPPG .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-9yBcRbA8BSynhPPG .taskText0,#mermaid-svg-9yBcRbA8BSynhPPG .taskText1,#mermaid-svg-9yBcRbA8BSynhPPG .taskText2,#mermaid-svg-9yBcRbA8BSynhPPG .taskText3{fill:#fff}#mermaid-svg-9yBcRbA8BSynhPPG .task0,#mermaid-svg-9yBcRbA8BSynhPPG .task1,#mermaid-svg-9yBcRbA8BSynhPPG .task2,#mermaid-svg-9yBcRbA8BSynhPPG .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-9yBcRbA8BSynhPPG .taskTextOutside0,#mermaid-svg-9yBcRbA8BSynhPPG .taskTextOutside2{fill:#000}#mermaid-svg-9yBcRbA8BSynhPPG .taskTextOutside1,#mermaid-svg-9yBcRbA8BSynhPPG .taskTextOutside3{fill:#000}#mermaid-svg-9yBcRbA8BSynhPPG .active0,#mermaid-svg-9yBcRbA8BSynhPPG .active1,#mermaid-svg-9yBcRbA8BSynhPPG .active2,#mermaid-svg-9yBcRbA8BSynhPPG .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-9yBcRbA8BSynhPPG .activeText0,#mermaid-svg-9yBcRbA8BSynhPPG .activeText1,#mermaid-svg-9yBcRbA8BSynhPPG .activeText2,#mermaid-svg-9yBcRbA8BSynhPPG .activeText3{fill:#000 !important}#mermaid-svg-9yBcRbA8BSynhPPG .done0,#mermaid-svg-9yBcRbA8BSynhPPG .done1,#mermaid-svg-9yBcRbA8BSynhPPG .done2,#mermaid-svg-9yBcRbA8BSynhPPG .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-9yBcRbA8BSynhPPG .doneText0,#mermaid-svg-9yBcRbA8BSynhPPG .doneText1,#mermaid-svg-9yBcRbA8BSynhPPG .doneText2,#mermaid-svg-9yBcRbA8BSynhPPG .doneText3{fill:#000 !important}#mermaid-svg-9yBcRbA8BSynhPPG .crit0,#mermaid-svg-9yBcRbA8BSynhPPG .crit1,#mermaid-svg-9yBcRbA8BSynhPPG .crit2,#mermaid-svg-9yBcRbA8BSynhPPG .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-9yBcRbA8BSynhPPG .activeCrit0,#mermaid-svg-9yBcRbA8BSynhPPG .activeCrit1,#mermaid-svg-9yBcRbA8BSynhPPG .activeCrit2,#mermaid-svg-9yBcRbA8BSynhPPG .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-9yBcRbA8BSynhPPG .doneCrit0,#mermaid-svg-9yBcRbA8BSynhPPG .doneCrit1,#mermaid-svg-9yBcRbA8BSynhPPG .doneCrit2,#mermaid-svg-9yBcRbA8BSynhPPG .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-9yBcRbA8BSynhPPG .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-9yBcRbA8BSynhPPG .milestoneText{font-style:italic}#mermaid-svg-9yBcRbA8BSynhPPG .doneCritText0,#mermaid-svg-9yBcRbA8BSynhPPG .doneCritText1,#mermaid-svg-9yBcRbA8BSynhPPG .doneCritText2,#mermaid-svg-9yBcRbA8BSynhPPG .doneCritText3{fill:#000 !important}#mermaid-svg-9yBcRbA8BSynhPPG .activeCritText0,#mermaid-svg-9yBcRbA8BSynhPPG .activeCritText1,#mermaid-svg-9yBcRbA8BSynhPPG .activeCritText2,#mermaid-svg-9yBcRbA8BSynhPPG .activeCritText3{fill:#000 !important}#mermaid-svg-9yBcRbA8BSynhPPG .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-9yBcRbA8BSynhPPG g.classGroup text .title{font-weight:bolder}#mermaid-svg-9yBcRbA8BSynhPPG g.clickable{cursor:pointer}#mermaid-svg-9yBcRbA8BSynhPPG g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-9yBcRbA8BSynhPPG g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-9yBcRbA8BSynhPPG .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-9yBcRbA8BSynhPPG .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-9yBcRbA8BSynhPPG .dashed-line{stroke-dasharray:3}#mermaid-svg-9yBcRbA8BSynhPPG #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG .commit-id,#mermaid-svg-9yBcRbA8BSynhPPG .commit-msg,#mermaid-svg-9yBcRbA8BSynhPPG .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-9yBcRbA8BSynhPPG g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-9yBcRbA8BSynhPPG g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-9yBcRbA8BSynhPPG g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-9yBcRbA8BSynhPPG .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-9yBcRbA8BSynhPPG .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-9yBcRbA8BSynhPPG .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-9yBcRbA8BSynhPPG .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-9yBcRbA8BSynhPPG .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-9yBcRbA8BSynhPPG .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-9yBcRbA8BSynhPPG .edgeLabel text{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-9yBcRbA8BSynhPPG .node circle.state-start{fill:black;stroke:black}#mermaid-svg-9yBcRbA8BSynhPPG .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-9yBcRbA8BSynhPPG #statediagram-barbEnd{fill:#9370db}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-state .divider{stroke:#9370db}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-9yBcRbA8BSynhPPG .note-edge{stroke-dasharray:5}#mermaid-svg-9yBcRbA8BSynhPPG .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-9yBcRbA8BSynhPPG .error-icon{fill:#522}#mermaid-svg-9yBcRbA8BSynhPPG .error-text{fill:#522;stroke:#522}#mermaid-svg-9yBcRbA8BSynhPPG .edge-thickness-normal{stroke-width:2px}#mermaid-svg-9yBcRbA8BSynhPPG .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-9yBcRbA8BSynhPPG .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-9yBcRbA8BSynhPPG .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-9yBcRbA8BSynhPPG .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-9yBcRbA8BSynhPPG .marker{fill:#333}#mermaid-svg-9yBcRbA8BSynhPPG .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-9yBcRbA8BSynhPPG {color: rgba(0, 0, 0, 0.75);font: ;}

信号发生器1
信号发生器2
AD
FIR核
DA
示波器

三、具体实现步骤

1.XADC的使用


XADC包括一个双12位、1兆每秒采样(MSPS) ADC和片上ADC传感器。上图显示了XADC的框图。双重adc支持多种操作模式,例如,外部触发和同步。支持单极和差分输入。adc最多可以访问17个外部模拟输入通道。
由数据手册可知,ADC由两种操作模式:事件触发和连续转换模式。连续转换模式会在上次转换完成后继续下一次转换,默认一次转换需要26个ADCCLK;事件触发模式使用外部信号上升沿触发,启动一次转换。因为需按照固定采样率采样,故选择事件触发模式,使用100K信号触发,故采样率为100k。同时配置XDAC的时钟分频系数为4,clk为100MHz,所以ADCCLK实际大约为25MHz。
ADC的通道采样模式有四种:双ADC、独立ADC、单通道、多通道序列采样。因为本文须同时对两路信号信号进行采样,所以选择双ADC的模式,此模式下,在被外界信号触发后,两路ADC同时开始转换,并将结果保存的寄存器中。

ADC的接口可以配置为DRP(Dynamic Reconfiguration Port)和AXI,因为本文没有使用到PS部分,所以使用DRP接口。DRP接口读写时序如上图所示。

ADC的通道选择AD7和AD15,XADC引出如下引脚。查询时序图每次转换完成时会有eoc信号上升沿,channel会在转换完成时输出通道地址(AD7地址为7’h17,AD15地址为7’h1f),因为采用双ADC模式,所以channel只会输出AD7的地址。为了在每次转换完成时读取两通道AD的值,故编写XADC_wrapper.v封装了一层。编写如下状态机实现一次eoc信号触发两通道采样结果的读取:

#mermaid-svg-rSOdNzJSWF4c6lRU .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .label text{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .node rect,#mermaid-svg-rSOdNzJSWF4c6lRU .node circle,#mermaid-svg-rSOdNzJSWF4c6lRU .node ellipse,#mermaid-svg-rSOdNzJSWF4c6lRU .node polygon,#mermaid-svg-rSOdNzJSWF4c6lRU .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rSOdNzJSWF4c6lRU .node .label{text-align:center;fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .node.clickable{cursor:pointer}#mermaid-svg-rSOdNzJSWF4c6lRU .arrowheadPath{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-rSOdNzJSWF4c6lRU .flowchart-link{stroke:#333;fill:none}#mermaid-svg-rSOdNzJSWF4c6lRU .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-rSOdNzJSWF4c6lRU .edgeLabel rect{opacity:0.9}#mermaid-svg-rSOdNzJSWF4c6lRU .edgeLabel span{color:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-rSOdNzJSWF4c6lRU .cluster text{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-rSOdNzJSWF4c6lRU .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rSOdNzJSWF4c6lRU text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-rSOdNzJSWF4c6lRU .actor-line{stroke:grey}#mermaid-svg-rSOdNzJSWF4c6lRU .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-rSOdNzJSWF4c6lRU #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .sequenceNumber{fill:#fff}#mermaid-svg-rSOdNzJSWF4c6lRU #sequencenumber{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU #crosshead path{fill:#333;stroke:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .messageText{fill:#333;stroke:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-rSOdNzJSWF4c6lRU .labelText,#mermaid-svg-rSOdNzJSWF4c6lRU .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-rSOdNzJSWF4c6lRU .loopText,#mermaid-svg-rSOdNzJSWF4c6lRU .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-rSOdNzJSWF4c6lRU .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-rSOdNzJSWF4c6lRU .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rSOdNzJSWF4c6lRU .noteText,#mermaid-svg-rSOdNzJSWF4c6lRU .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-rSOdNzJSWF4c6lRU .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-rSOdNzJSWF4c6lRU .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-rSOdNzJSWF4c6lRU .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-rSOdNzJSWF4c6lRU .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU .section{stroke:none;opacity:0.2}#mermaid-svg-rSOdNzJSWF4c6lRU .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-rSOdNzJSWF4c6lRU .section2{fill:#fff400}#mermaid-svg-rSOdNzJSWF4c6lRU .section1,#mermaid-svg-rSOdNzJSWF4c6lRU .section3{fill:#fff;opacity:0.2}#mermaid-svg-rSOdNzJSWF4c6lRU .sectionTitle0{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .sectionTitle1{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .sectionTitle2{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .sectionTitle3{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-rSOdNzJSWF4c6lRU .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU .grid path{stroke-width:0}#mermaid-svg-rSOdNzJSWF4c6lRU .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-rSOdNzJSWF4c6lRU .task{stroke-width:2}#mermaid-svg-rSOdNzJSWF4c6lRU .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU .taskText:not([font-size]){font-size:11px}#mermaid-svg-rSOdNzJSWF4c6lRU .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-rSOdNzJSWF4c6lRU .task.clickable{cursor:pointer}#mermaid-svg-rSOdNzJSWF4c6lRU .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rSOdNzJSWF4c6lRU .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rSOdNzJSWF4c6lRU .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-rSOdNzJSWF4c6lRU .taskText0,#mermaid-svg-rSOdNzJSWF4c6lRU .taskText1,#mermaid-svg-rSOdNzJSWF4c6lRU .taskText2,#mermaid-svg-rSOdNzJSWF4c6lRU .taskText3{fill:#fff}#mermaid-svg-rSOdNzJSWF4c6lRU .task0,#mermaid-svg-rSOdNzJSWF4c6lRU .task1,#mermaid-svg-rSOdNzJSWF4c6lRU .task2,#mermaid-svg-rSOdNzJSWF4c6lRU .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-rSOdNzJSWF4c6lRU .taskTextOutside0,#mermaid-svg-rSOdNzJSWF4c6lRU .taskTextOutside2{fill:#000}#mermaid-svg-rSOdNzJSWF4c6lRU .taskTextOutside1,#mermaid-svg-rSOdNzJSWF4c6lRU .taskTextOutside3{fill:#000}#mermaid-svg-rSOdNzJSWF4c6lRU .active0,#mermaid-svg-rSOdNzJSWF4c6lRU .active1,#mermaid-svg-rSOdNzJSWF4c6lRU .active2,#mermaid-svg-rSOdNzJSWF4c6lRU .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-rSOdNzJSWF4c6lRU .activeText0,#mermaid-svg-rSOdNzJSWF4c6lRU .activeText1,#mermaid-svg-rSOdNzJSWF4c6lRU .activeText2,#mermaid-svg-rSOdNzJSWF4c6lRU .activeText3{fill:#000 !important}#mermaid-svg-rSOdNzJSWF4c6lRU .done0,#mermaid-svg-rSOdNzJSWF4c6lRU .done1,#mermaid-svg-rSOdNzJSWF4c6lRU .done2,#mermaid-svg-rSOdNzJSWF4c6lRU .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-rSOdNzJSWF4c6lRU .doneText0,#mermaid-svg-rSOdNzJSWF4c6lRU .doneText1,#mermaid-svg-rSOdNzJSWF4c6lRU .doneText2,#mermaid-svg-rSOdNzJSWF4c6lRU .doneText3{fill:#000 !important}#mermaid-svg-rSOdNzJSWF4c6lRU .crit0,#mermaid-svg-rSOdNzJSWF4c6lRU .crit1,#mermaid-svg-rSOdNzJSWF4c6lRU .crit2,#mermaid-svg-rSOdNzJSWF4c6lRU .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-rSOdNzJSWF4c6lRU .activeCrit0,#mermaid-svg-rSOdNzJSWF4c6lRU .activeCrit1,#mermaid-svg-rSOdNzJSWF4c6lRU .activeCrit2,#mermaid-svg-rSOdNzJSWF4c6lRU .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-rSOdNzJSWF4c6lRU .doneCrit0,#mermaid-svg-rSOdNzJSWF4c6lRU .doneCrit1,#mermaid-svg-rSOdNzJSWF4c6lRU .doneCrit2,#mermaid-svg-rSOdNzJSWF4c6lRU .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-rSOdNzJSWF4c6lRU .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-rSOdNzJSWF4c6lRU .milestoneText{font-style:italic}#mermaid-svg-rSOdNzJSWF4c6lRU .doneCritText0,#mermaid-svg-rSOdNzJSWF4c6lRU .doneCritText1,#mermaid-svg-rSOdNzJSWF4c6lRU .doneCritText2,#mermaid-svg-rSOdNzJSWF4c6lRU .doneCritText3{fill:#000 !important}#mermaid-svg-rSOdNzJSWF4c6lRU .activeCritText0,#mermaid-svg-rSOdNzJSWF4c6lRU .activeCritText1,#mermaid-svg-rSOdNzJSWF4c6lRU .activeCritText2,#mermaid-svg-rSOdNzJSWF4c6lRU .activeCritText3{fill:#000 !important}#mermaid-svg-rSOdNzJSWF4c6lRU .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-rSOdNzJSWF4c6lRU g.classGroup text .title{font-weight:bolder}#mermaid-svg-rSOdNzJSWF4c6lRU g.clickable{cursor:pointer}#mermaid-svg-rSOdNzJSWF4c6lRU g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rSOdNzJSWF4c6lRU g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-rSOdNzJSWF4c6lRU .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-rSOdNzJSWF4c6lRU .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rSOdNzJSWF4c6lRU .dashed-line{stroke-dasharray:3}#mermaid-svg-rSOdNzJSWF4c6lRU #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU .commit-id,#mermaid-svg-rSOdNzJSWF4c6lRU .commit-msg,#mermaid-svg-rSOdNzJSWF4c6lRU .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-rSOdNzJSWF4c6lRU g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-rSOdNzJSWF4c6lRU g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-rSOdNzJSWF4c6lRU g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-rSOdNzJSWF4c6lRU .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-rSOdNzJSWF4c6lRU .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-rSOdNzJSWF4c6lRU .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-rSOdNzJSWF4c6lRU .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-rSOdNzJSWF4c6lRU .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-rSOdNzJSWF4c6lRU .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-rSOdNzJSWF4c6lRU .edgeLabel text{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-rSOdNzJSWF4c6lRU .node circle.state-start{fill:black;stroke:black}#mermaid-svg-rSOdNzJSWF4c6lRU .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-rSOdNzJSWF4c6lRU #statediagram-barbEnd{fill:#9370db}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-state .divider{stroke:#9370db}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-rSOdNzJSWF4c6lRU .note-edge{stroke-dasharray:5}#mermaid-svg-rSOdNzJSWF4c6lRU .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-rSOdNzJSWF4c6lRU .error-icon{fill:#522}#mermaid-svg-rSOdNzJSWF4c6lRU .error-text{fill:#522;stroke:#522}#mermaid-svg-rSOdNzJSWF4c6lRU .edge-thickness-normal{stroke-width:2px}#mermaid-svg-rSOdNzJSWF4c6lRU .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-rSOdNzJSWF4c6lRU .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-rSOdNzJSWF4c6lRU .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-rSOdNzJSWF4c6lRU .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-rSOdNzJSWF4c6lRU .marker{fill:#333}#mermaid-svg-rSOdNzJSWF4c6lRU .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-rSOdNzJSWF4c6lRU {color: rgba(0, 0, 0, 0.75);font: ;}

Eoc转换完成信号
ToReadAD7
WaitAD7
ToReadAD15
WaitAD15

仿真结果如下:

代码整理好后会上传到Github。

2.PmodDA3的调试

Pmod DA3是一个基于Analog Devices AD5541A的16位数字模拟转换器,参考电压为2.5V,其单端SMA输出口能够将从类SPI接口所获得的信息转换成一个清晰、有保障的单调模拟输出。
为了控制PmodDA3,需要编写一个并转串行的模块,此模块的外部接口如下图所示:输入16为数据,在DA_drdy信号上升沿时将数据读入并转化为串行后通过Pmod接口发送给DA模块。

参考AD5541A用户手册的时序图编写并转串模块,SCK为发送数据的时钟,其由clk分频得到,本文配置其为25Mhz;_CS为片选信号,_CS信号拉低时,DA会在下个SCLK的上升沿读取DIN信号作为信号最高位(DB15),每个SCLK读取一个二进制位,16个上升沿读取完成,_CS信号置高。_LDAC信号为装载信号,在数据传输完成后拉低,触发DA模块内部数据装载到DAC单元实现模拟信号输出。

编写状态机实现上述时序:

#mermaid-svg-L0GCJFodGeskPUxS .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-L0GCJFodGeskPUxS .label text{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .node rect,#mermaid-svg-L0GCJFodGeskPUxS .node circle,#mermaid-svg-L0GCJFodGeskPUxS .node ellipse,#mermaid-svg-L0GCJFodGeskPUxS .node polygon,#mermaid-svg-L0GCJFodGeskPUxS .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-L0GCJFodGeskPUxS .node .label{text-align:center;fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .node.clickable{cursor:pointer}#mermaid-svg-L0GCJFodGeskPUxS .arrowheadPath{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-L0GCJFodGeskPUxS .flowchart-link{stroke:#333;fill:none}#mermaid-svg-L0GCJFodGeskPUxS .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-L0GCJFodGeskPUxS .edgeLabel rect{opacity:0.9}#mermaid-svg-L0GCJFodGeskPUxS .edgeLabel span{color:#333}#mermaid-svg-L0GCJFodGeskPUxS .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-L0GCJFodGeskPUxS .cluster text{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-L0GCJFodGeskPUxS .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-L0GCJFodGeskPUxS text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-L0GCJFodGeskPUxS .actor-line{stroke:grey}#mermaid-svg-L0GCJFodGeskPUxS .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-L0GCJFodGeskPUxS .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-L0GCJFodGeskPUxS #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-L0GCJFodGeskPUxS .sequenceNumber{fill:#fff}#mermaid-svg-L0GCJFodGeskPUxS #sequencenumber{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS #crosshead path{fill:#333;stroke:#333}#mermaid-svg-L0GCJFodGeskPUxS .messageText{fill:#333;stroke:#333}#mermaid-svg-L0GCJFodGeskPUxS .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-L0GCJFodGeskPUxS .labelText,#mermaid-svg-L0GCJFodGeskPUxS .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-L0GCJFodGeskPUxS .loopText,#mermaid-svg-L0GCJFodGeskPUxS .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-L0GCJFodGeskPUxS .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-L0GCJFodGeskPUxS .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-L0GCJFodGeskPUxS .noteText,#mermaid-svg-L0GCJFodGeskPUxS .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-L0GCJFodGeskPUxS .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-L0GCJFodGeskPUxS .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-L0GCJFodGeskPUxS .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-L0GCJFodGeskPUxS .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS .section{stroke:none;opacity:0.2}#mermaid-svg-L0GCJFodGeskPUxS .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-L0GCJFodGeskPUxS .section2{fill:#fff400}#mermaid-svg-L0GCJFodGeskPUxS .section1,#mermaid-svg-L0GCJFodGeskPUxS .section3{fill:#fff;opacity:0.2}#mermaid-svg-L0GCJFodGeskPUxS .sectionTitle0{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .sectionTitle1{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .sectionTitle2{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .sectionTitle3{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-L0GCJFodGeskPUxS .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS .grid path{stroke-width:0}#mermaid-svg-L0GCJFodGeskPUxS .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-L0GCJFodGeskPUxS .task{stroke-width:2}#mermaid-svg-L0GCJFodGeskPUxS .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS .taskText:not([font-size]){font-size:11px}#mermaid-svg-L0GCJFodGeskPUxS .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-L0GCJFodGeskPUxS .task.clickable{cursor:pointer}#mermaid-svg-L0GCJFodGeskPUxS .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-L0GCJFodGeskPUxS .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-L0GCJFodGeskPUxS .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-L0GCJFodGeskPUxS .taskText0,#mermaid-svg-L0GCJFodGeskPUxS .taskText1,#mermaid-svg-L0GCJFodGeskPUxS .taskText2,#mermaid-svg-L0GCJFodGeskPUxS .taskText3{fill:#fff}#mermaid-svg-L0GCJFodGeskPUxS .task0,#mermaid-svg-L0GCJFodGeskPUxS .task1,#mermaid-svg-L0GCJFodGeskPUxS .task2,#mermaid-svg-L0GCJFodGeskPUxS .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-L0GCJFodGeskPUxS .taskTextOutside0,#mermaid-svg-L0GCJFodGeskPUxS .taskTextOutside2{fill:#000}#mermaid-svg-L0GCJFodGeskPUxS .taskTextOutside1,#mermaid-svg-L0GCJFodGeskPUxS .taskTextOutside3{fill:#000}#mermaid-svg-L0GCJFodGeskPUxS .active0,#mermaid-svg-L0GCJFodGeskPUxS .active1,#mermaid-svg-L0GCJFodGeskPUxS .active2,#mermaid-svg-L0GCJFodGeskPUxS .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-L0GCJFodGeskPUxS .activeText0,#mermaid-svg-L0GCJFodGeskPUxS .activeText1,#mermaid-svg-L0GCJFodGeskPUxS .activeText2,#mermaid-svg-L0GCJFodGeskPUxS .activeText3{fill:#000 !important}#mermaid-svg-L0GCJFodGeskPUxS .done0,#mermaid-svg-L0GCJFodGeskPUxS .done1,#mermaid-svg-L0GCJFodGeskPUxS .done2,#mermaid-svg-L0GCJFodGeskPUxS .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-L0GCJFodGeskPUxS .doneText0,#mermaid-svg-L0GCJFodGeskPUxS .doneText1,#mermaid-svg-L0GCJFodGeskPUxS .doneText2,#mermaid-svg-L0GCJFodGeskPUxS .doneText3{fill:#000 !important}#mermaid-svg-L0GCJFodGeskPUxS .crit0,#mermaid-svg-L0GCJFodGeskPUxS .crit1,#mermaid-svg-L0GCJFodGeskPUxS .crit2,#mermaid-svg-L0GCJFodGeskPUxS .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-L0GCJFodGeskPUxS .activeCrit0,#mermaid-svg-L0GCJFodGeskPUxS .activeCrit1,#mermaid-svg-L0GCJFodGeskPUxS .activeCrit2,#mermaid-svg-L0GCJFodGeskPUxS .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-L0GCJFodGeskPUxS .doneCrit0,#mermaid-svg-L0GCJFodGeskPUxS .doneCrit1,#mermaid-svg-L0GCJFodGeskPUxS .doneCrit2,#mermaid-svg-L0GCJFodGeskPUxS .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-L0GCJFodGeskPUxS .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-L0GCJFodGeskPUxS .milestoneText{font-style:italic}#mermaid-svg-L0GCJFodGeskPUxS .doneCritText0,#mermaid-svg-L0GCJFodGeskPUxS .doneCritText1,#mermaid-svg-L0GCJFodGeskPUxS .doneCritText2,#mermaid-svg-L0GCJFodGeskPUxS .doneCritText3{fill:#000 !important}#mermaid-svg-L0GCJFodGeskPUxS .activeCritText0,#mermaid-svg-L0GCJFodGeskPUxS .activeCritText1,#mermaid-svg-L0GCJFodGeskPUxS .activeCritText2,#mermaid-svg-L0GCJFodGeskPUxS .activeCritText3{fill:#000 !important}#mermaid-svg-L0GCJFodGeskPUxS .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-L0GCJFodGeskPUxS g.classGroup text .title{font-weight:bolder}#mermaid-svg-L0GCJFodGeskPUxS g.clickable{cursor:pointer}#mermaid-svg-L0GCJFodGeskPUxS g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-L0GCJFodGeskPUxS g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-L0GCJFodGeskPUxS .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-L0GCJFodGeskPUxS .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-L0GCJFodGeskPUxS .dashed-line{stroke-dasharray:3}#mermaid-svg-L0GCJFodGeskPUxS #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS .commit-id,#mermaid-svg-L0GCJFodGeskPUxS .commit-msg,#mermaid-svg-L0GCJFodGeskPUxS .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-L0GCJFodGeskPUxS g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-L0GCJFodGeskPUxS g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-L0GCJFodGeskPUxS g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-L0GCJFodGeskPUxS .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-L0GCJFodGeskPUxS .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-L0GCJFodGeskPUxS .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-L0GCJFodGeskPUxS .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-L0GCJFodGeskPUxS .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-L0GCJFodGeskPUxS .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-L0GCJFodGeskPUxS .edgeLabel text{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-L0GCJFodGeskPUxS .node circle.state-start{fill:black;stroke:black}#mermaid-svg-L0GCJFodGeskPUxS .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-L0GCJFodGeskPUxS #statediagram-barbEnd{fill:#9370db}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-state .divider{stroke:#9370db}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-L0GCJFodGeskPUxS .note-edge{stroke-dasharray:5}#mermaid-svg-L0GCJFodGeskPUxS .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-L0GCJFodGeskPUxS .error-icon{fill:#522}#mermaid-svg-L0GCJFodGeskPUxS .error-text{fill:#522;stroke:#522}#mermaid-svg-L0GCJFodGeskPUxS .edge-thickness-normal{stroke-width:2px}#mermaid-svg-L0GCJFodGeskPUxS .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-L0GCJFodGeskPUxS .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-L0GCJFodGeskPUxS .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-L0GCJFodGeskPUxS .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-L0GCJFodGeskPUxS .marker{fill:#333}#mermaid-svg-L0GCJFodGeskPUxS .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-L0GCJFodGeskPUxS {color: rgba(0, 0, 0, 0.75);font: ;}

DA_drdy信号触发
Start
Idle
SendData
LoadData

仿真结果:

编写个小程序:定义 reg[15:0] counter=0,每来一个clk ,counter+100,到65535溢出。如此就可以实现控制DA生成锯齿波,嘿嘿!

3.Fir滤波器

- 系统自带的IP核

- Matlab生成DA滤波器

4.开关控制

开关控制较为简单,顶层模块定义[3:0] sw输入信号,对其分配管脚,通过case(sw)语句块实现更改开关状态切换功能。

按键状态 功能
0001 AD7单路输出
0010 AD15单路输出
0011 两路相乘
1011 两路相加
0111 两路相乘滤波
1111 两路相加滤波

实现代码如下:

//Control Logic
parameter[3:0]   OnlyAd7=4'b0001;
parameter[3:0]   OnlyAd15=4'b0010;
parameter[3:0]   Ad15_AD7_mlt=4'b0011;
parameter[3:0]   Ad15_AD7_add=4'b1011;
parameter[3:0]   Ad15_AD7_mlt_Fir=4'b0111;
parameter[3:0]   Ad15_AD7_add_Fir=4'b1111;
always@(posedge clk)
begincase(sw)OnlyAd7:beginda_indata<=_DataAD7;da_invalid<=Data_rdy;endOnlyAd15:beginda_indata<=_DataAD15;da_invalid<=Data_rdy;                endAd15_AD7_mlt:beginDataAD7=_DataAD7;DataAD15=_DataAD15;da_indata=DataAD15[15:8]*DataAD7[15:8]; da_invalid<=Data_rdy;                   endAd15_AD7_add:beginDataAD7=_DataAD7;DataAD15=_DataAD15;da_indata=DataAD15[15:1]+DataAD7[15:1];da_invalid<=Data_rdy;               endAd15_AD7_mlt_Fir:beginDataAD7=_DataAD7;DataAD15=_DataAD15;fir_indata=DataAD15[15:8]*DataAD7[15:8]; fir_invalid<=Data_rdy;da_indata<=(fir_outdata<<2);da_invalid<=fir_outvalid; da_invalid<=Data_rdy;                 endAd15_AD7_add_Fir:beginDataAD7=_DataAD7;DataAD15=_DataAD15;fir_indata=DataAD15[15:1]+DataAD7[15:1];fir_invalid<=Data_rdy;da_indata<=(fir_outdata<<2);da_invalid<=fir_outvalid; da_invalid<=Data_rdy;                   enddefault:beginda_indata<=_DataAD7;da_invalid<=Data_rdy;    endendcase
end

四、总结

总耗时3周,系统实现了AD输入两路信号,通过开关输入可以分别单路输出、相加、相乘、相加后滤波、相乘后滤波的功能。缺点是滤波器设计截至频率和实际测试截至频率不同,大约相差10倍,至今未找到原因在哪。
因为Fir核不是自己编写的,所以整体难度一般。主要是通过此项目对ZYNQ的FPGA部分进行入门学习,个人感觉开发过程中除了需要Verilog语言基础,仿真和Debug方法尤为重要。
欢迎和各位交流分享

Zynq实现分布式Fir滤波器相关推荐

  1. 【DA算法】基于DA算法的FIR滤波器的FPGA实现

    1.软件版本 quartusii 2.本算法理论知识 DA算法的主要特点是,巧妙地利用查找表将固定系数的MAC运算转化为查表操作,其运算速度不随系数和输入数据位数的增加而降低,而且相对直接实现乘法器而 ...

  2. FIR数字滤波器的FPGA实现(一)-FIR滤波器基本原理

    (一)FIR数字滤波器的FPGA实现-FIR滤波器基本原理 文章目录 (一)FIR数字滤波器的FPGA实现-FIR滤波器基本原理 1 FIR滤波器基本原理 1.1 FIR滤波器的结构及设计 1.1.1 ...

  3. FIR数字滤波器的FPGA实现(二)-串行FIR滤波器设计(1)

    (二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计 文章目录 (二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计 0 串行FIR滤波器基本原理 1 基于移位寄存器的串行 FIR 滤波器 ...

  4. FIR数字滤波器的FPGA实现(三)-并行FIR滤波器设计

    (三)FIR数字滤波器的FPGA实现-并行FIR滤波器设计 文章目录 (三)FIR数字滤波器的FPGA实现-并行FIR滤波器设计 0 并行FIR滤波器基本原理 1 基于直接型结构的全并行 FIR 滤波 ...

  5. FIR数字滤波器的FPGA实现(二)-串行FIR滤波器设计(2)

    (二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计 文章目录 (二)FIR数字滤波器的FPGA实现-串行FIR滤波器设计 0 串行FIR滤波器基本原理 1 基于移位寄存器的串行 FIR 滤波器 ...

  6. m基于FPGA的多级抽取滤波器组verilog设计,包括CIC滤波,HB半带滤波以及DA分布式FIR滤波

    目录 1.算法描述 2.仿真效果预览 3.verilog核心程序 4.完整FPGA 1.算法描述 数字下变频中的低通滤波器是由多级抽取滤波器组实现的.信号的同相分量和正交分量再分别经由积分梳状滤波器( ...

  7. (多图) 基于并行流水线结构的可重配FIR滤波器的FPGA实现

    1 并行流水结构FIR的原理 在用FPGA或专用集成电路实现数字信号处理算法时,计算速度和芯片面积是两个相互制约的主要问题.实际应用FIR滤波器时,要获得良好的滤波效果,滤波器的阶数可能会显著增加,有 ...

  8. FPGA数字信号处理(二)并行FIR滤波器Verilog设计

    该篇是FPGA数字信号处理的第二篇,选题为DSP系统中极其常用的FIR滤波器.本文将简单介绍FIR滤波器的原理,详细介绍使用Verilog HDL设计并行FIR滤波器的流程和方法.接下来几篇会介绍串行 ...

  9. AD9361 FIR 滤波器设计

    通过MATLAB,使用AD9361 Filter Design Wizard App设计Tx/Rx FIR滤波器,生成的.fir文件可以在 AD936x 配置软件(AD936x Evaluation ...

最新文章

  1. stm31.js使用详解(网页魔法菜单)
  2. Eclipse Debug maven test
  3. jquery ajax传值和后台取参数
  4. 黄冈学计算机的学校怎么样,广元市黄冈学校怎么样、好不好
  5. VisualVM远程连接Linux服务器通过jstatd方式监控JVM内存状态
  6. Elasticsearch 性能监控2(五种常见问题的解决办法)
  7. 删除Word文档中的全部汉字
  8. sea 配置资料收集
  9. python+appium 自动化2--元素定位uiautomatorviewer
  10. 不是区块链的特征_区块链的四大特征
  11. LintCode Python 简单级题目 41.最大子数组 - 44.最小子数组和
  12. 第一届对象存储技术及应用大会:Esri中国周宁——万物互联时代,云存储技术的变革与展望...
  13. 软件项目中的成本构成及估算方法
  14. QEMU-KVM设备热插拔机制简析
  15. 一文读懂自然语言处理NLP(图解+学习资料)
  16. 阿里巴巴入选的JCP最高执行委员会,何方神圣?
  17. Andorid通话自动录音
  18. 探秘手机距离传感器工作背后的那些事儿
  19. Hadoop生态圈(十六)- HDFS Snapshot快照详解
  20. java中的for语句格式_Java中foreach循环语句的格式可以写成(        )。

热门文章

  1. linux系统禁用声卡,Ubuntu Linux系统下声卡独占的解决方法
  2. Go 使用 buger/jsonparser 优化反序列化性能
  3. html5 canvas创建弹性碰撞动画
  4. IC设计基础001:寄存器读写,读清是如何实现的
  5. node-v14.21版本的下载安装
  6. WPF——后台代码实现将多张图片拼接成一张
  7. 电大计算机网考试题,电大计算机应用基础网考统考试题及答案
  8. android activity切换动画关闭,Activity取消界面切换的默认动画方法(推荐)
  9. 金银岛(信息学奥赛一本通 - T1225)
  10. PPT文档播放没声音了怎么办?