FPGA-DA模块demo

简介: FPGA-DA模块demo

DA是数字信号转换为模拟信号的模块,应用的话,最近在准备电赛,可以通过主控芯片给的数字信号来模拟出信号源(后面博文会讲)(但是不推荐使用,因为信号的噪声太多,经过运放后基本不可以使用。。。准备比赛的话还是选高精度是DA/DA吧)

DA 百度百科

DA这里用的是iic协议,在之前的博文中也讲过iic协议的一些编写方法,下面就直接贴代码,我的测试是用开发板的da进行呼吸灯的显示,比较简单,不多说了,代码如下:

da驱动代码(可以共用,需要作改动)


moduledac_drive(dac_data,rst_n,clk,scl,sda,dac_en    );
inputclk          ;//输入时钟信号分频后inputrst_n        ;//复位信号input  [7:0]dac_data;//DAC输出数据inputdac_en       ;//使能信号outputregscl      ;//IIC的SCLinoutsda          ;//IIC的SDAparameterI2C_ILDE=4'D0,  //起始状态    I2C_START=4'D1,  //起始信号    I2C_DAC_ADDR=4'D2,  //器件地址    I2C_DAC_ACK1=4'D3,  //应答信号    I2C_DAC_CTRL_MS=4'D4,  //控制信号+4位数据  I2C_DAC_ACK2=4'D5,  //应答信号    I2C_DAC_LS_NONE=4'D6,  //4位数据+无用信号      I2C_DAC_ACK3=4'D7,  //应答信号    I2C_STOP=4'D9;  //停止信号parameterDEVICE_ADDR=8'b1001_1000;  //器件地址wire [7:0]dac_mdata={4'b0000,dac_data[7:4]};wire [7:0]dac_ldata={dac_data[3:0],4'b0000};parameterI2C_FREQ=250,     //时钟频率SEND_BIT=8;       //发送数据位数reg [7:0]cnt;            //scl计数寄存器reg [2:0]byte_cnt;       //数据位寄存器reg [3:0]state_c,state_n;//状态寄存器regsdar;                //sda输出寄存器regsdalink;             //sda方向控制器0-input1-outputassignscl_hc=(cnt==(I2C_FREQ>>2));
assignscl_lc=(cnt==(I2C_FREQ>>2)*3);
//iic时钟信号产生逻辑always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begincnt<=1'b0;endelseif(cnt==I2C_FREQ-1'b1)begincnt<=1'b0;endelsebegincnt<=cnt+1'b1;endendalways@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)beginscl<=1'b0;endelseif(cnt>=1'b0 &&cnt <= (I2C_FREQ>>1)-1'b1)beginscl<=1'b1;endelsebeginscl<=1'b0;endend//iic状态机控制信号always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)beginstate_c<=I2C_ILDE;
endelsebeginstate_c<=state_n;
endendalways@(*)beginstate_n<=state_c;
case(state_c)
I2C_ILDE:
if(dac_en==1'b1)beginstate_n<=I2C_START;
endI2C_START:
if(scl_hc==1'b1)beginstate_n<=I2C_DAC_ADDR;
endI2C_DAC_ADDR:
if(scl_lc==1'b1&&byte_cnt==3'd0)beginstate_n<=I2C_DAC_ACK1;
endI2C_DAC_ACK1:
if(scl_lc==1'b1)beginstate_n<=I2C_DAC_CTRL_MS;
endI2C_DAC_CTRL_MS:
if(scl_lc==1'b1&&byte_cnt==3'd0)beginstate_n<=I2C_DAC_ACK2;
endI2C_DAC_ACK2:
if(scl_lc==1'b1)beginstate_n<=I2C_DAC_LS_NONE;
endI2C_DAC_LS_NONE:
if(scl_lc==1'b1&&(byte_cnt==3'd0))beginstate_n<=I2C_DAC_ACK3;
endI2C_DAC_ACK3:
if(scl_lc==1'b1)beginstate_n<=I2C_STOP;
endI2C_STOP:
if(scl_hc==1'b1)beginstate_n<=I2C_ILDE;
enddefault:state_n<=I2C_ILDE;
endcaseend//数据位寄存器控制always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)beginbyte_cnt<=3'd0;endelsebegincase(state_c)
I2C_DAC_ADDR,I2C_DAC_CTRL_MS,I2C_DAC_LS_NONE:
if(scl_lc==1'b1)beginbyte_cnt<=byte_cnt-1'b1;enddefault: byte_cnt<=3'd7;endcaseendend//数据输入输出控制always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)beginsdar<=1'b1;sdalink<=1'b1;endelsebegincase(state_c)
I2C_ILDE:
beginsdar<=1'b1;sdalink<=1'b1;endI2C_START:
beginif(scl_hc==1'b1)beginsdar<=1'b0;sdalink<=1'b1;endendI2C_DAC_ADDR:
beginif(scl_lc==1'b1)beginsdar<=DEVICE_ADDR[byte_cnt];
sdalink<=1'b1;endendI2C_DAC_CTRL_MS:
beginif(scl_lc==1'b1)beginsdar<=dac_mdata[byte_cnt];
sdalink<=1'b1;endendI2C_DAC_LS_NONE:
beginif(scl_lc==1'b1)beginsdar<=dac_ldata[byte_cnt];
sdalink<=1'b1;endendI2C_DAC_ACK1,I2C_DAC_ACK2:
beginif(scl_lc==1'b1)beginsdar<=1'b0;sdalink<=1'b0;endendI2C_DAC_ACK3:
beginif(scl_lc==1'b1)beginsdar<=1'b0;sdalink<=1'b1;endendI2C_STOP:  
beginif(scl_hc==1'b1)beginsdar<=1'b1;sdalink<=1'b1;endenddefault: ;
endcaseendendassignsda=sdalink?sdar:1'bz;endmodule

测试模块:


moduledac_controller(clk,rst_n,en,dac_data    );
inputclk;
inputrst_n;
outputen;
outputreg[7:0]dac_data;
reg [17:0] cnt; //10ms计数器always@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begincnt<=18'd0;endelseif(cnt<18'd249_999)begincnt<=cnt+1'b1;endelsebegincnt<=1'b0;endendalways@(posedgeclkornegedgerst_n)beginif(rst_n==1'b0)begindac_data<=1'b0;endelseif(cnt==18'd249_999)begindac_data<=dac_data+1'b1;endendassignen=1'b1; endmodule

顶层模块连接:


moduletop(clk,rst_n,iic_sck,iic_sda    );
inputclk;
inputrst_n;
outputiic_sck;
inoutiic_sda;
wire [7:0]dac_data;
dac_driveuut_dac_drive(
    .dac_data(dac_data),
    .rst_n(rst_n),
    .clk(clk),
    .scl(iic_sck),
    .sda(iic_sda),
    .dac_en(dac_en)
    );
dac_controlleruut_dac_controller(
    .clk(clk),
    .rst_n(rst_n),
    .en(dac_en),
    .dac_data(dac_data)
    );
endmodule

下板子后就可以在自己的对应的da模块上显示呼吸灯的效果了。

(后面讲简单的波形发生器,还有DDS的可调信号发生器)

目录
相关文章
|
2月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的16QAM调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本项目基于FPGA实现了16QAM基带通信系统,包括调制、信道仿真、解调及误码率统计模块。通过Vivado2019.2仿真,设置不同SNR(如8dB、12dB),验证了软解调相较于传统16QAM系统的优越性,误码率显著降低。系统采用Verilog语言编写,详细介绍了16QAM软解调的原理及实现步骤,适用于高性能数据传输场景。
159 69
|
1月前
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的16psk调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16PSK调制解调系统的硬件测试版本。系统在原有仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比下的性能测试。16PSK通过改变载波相位传输4比特信息,广泛应用于高速数据传输。硬件测试操作详见配套视频。开发板使用及移植方法也一并提供。
37 6
|
2月前
|
数据采集 算法 测试技术
【硬件测试】基于FPGA的QPSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的QPSK调制解调系统的硬件实现与仿真效果。系统包含测试平台(testbench)、高斯信道模块、误码率统计模块,支持不同SNR设置,并增加了ILA在线数据采集和VIO在线SNR设置功能。通过硬件测试验证了系统在不同信噪比下的性能,提供了详细的模块原理及Verilog代码示例。开发板使用说明和移植方法也一并给出,确保用户能顺利在不同平台上复现该系统。
82 15
|
1月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的8PSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于FPGA实现8PSK调制解调系统,包含高斯信道、误码率统计、ILA数据采集和VIO在线SNR设置模块。通过硬件测试和Matlab仿真,展示了不同SNR下的星座图。8PSK调制通过改变载波相位传递信息,具有高频谱效率和抗干扰能力。开发板使用及程序移植方法详见配套视频和文档。
44 7
|
2月前
|
移动开发 算法 数据安全/隐私保护
基于FPGA的QPSK调制+软解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的QPSK调制解调系统,通过Vivado 2019.2进行仿真,展示了在不同信噪比(SNR=1dB, 5dB, 10dB)下的仿真效果。与普通QPSK系统相比,该系统的软解调技术显著降低了误码率。文章还详细阐述了QPSK调制的基本原理、信号采样、判决、解调及软解调的实现过程,并提供了Verilog核心程序代码。
82 26
|
2月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的2FSK调制解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的2FSK调制解调系统,包含高斯信道、误码率统计模块及testbench。系统增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同SNR下的硬件测试,并提供操作视频指导。理论部分涵盖频移键控(FSK)原理,包括相位连续与不连续FSK信号的特点及功率谱密度特性。Verilog代码实现了FSK调制解调的核心功能,支持在不同开发板上移植。硬件测试结果展示了不同SNR下的性能表现。
80 6
|
3月前
|
算法 异构计算
基于FPGA的4ASK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4-ASK调制解调系统的算法仿真效果、理论基础及Verilog核心程序。仿真在Vivado2019.2环境下进行,分别测试了SNR为20dB、15dB、10dB时的性能。理论部分概述了4-ASK的工作原理,包括调制、解调过程及其数学模型。Verilog代码实现了4-ASK调制器、加性高斯白噪声(AWGN)信道模拟、解调器及误码率计算模块。
88 8
|
3月前
|
算法 物联网 异构计算
基于FPGA的4FSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的4FSK调制解调系统的Verilog实现,包括高斯信道模块和误码率统计模块,支持不同SNR设置。系统在Vivado 2019.2上开发,展示了在不同SNR条件下的仿真结果。4FSK调制通过将输入数据转换为四个不同频率的信号来提高频带利用率和抗干扰能力,适用于无线通信和数据传输领域。文中还提供了核心Verilog代码,详细描述了调制、加噪声、解调及误码率计算的过程。
109 11
|
7月前
|
数据采集 传感器 监控
如何在LabVIEW中使用FPGA模块
如何在LabVIEW中使用FPGA模块
237 1
|
3月前
|
算法 数据安全/隐私保护 异构计算
基于FPGA的1024QAM基带通信系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不同SNR
本文介绍了基于FPGA的1024QAM调制解调系统的仿真与实现。通过Vivado 2019.2进行仿真,分别在SNR=40dB和35dB下验证了算法效果,并将数据导入Matlab生成星座图。1024QAM调制将10比特映射到复数平面上的1024个星座点之一,适用于高数据传输速率的应用。系统包含数据接口、串并转换、星座映射、调制器、解调器等模块。Verilog核心程序实现了调制、加噪声信道和解调过程,并统计误码率。
76 1

热门文章

最新文章