0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【紫光同创国产FPGA教程】【第十一章】录音与播放例程

FPGA技术专栏 来源:芯驿电子科技 作者:芯驿电子科技 2021-02-19 13:41 次阅读

原创声明:

本原创教程由芯驿电子科技(上海)有限公司(ALINX)创作,版权归本公司所有,如需转载,需授权并注明出处(alinx.com)。

适用于板卡型号:

PGL22G/PGL12G

1. 实验简介

本实验的录音和播放实验因为开发板上没有音频部分的电路,需要外接一个芯驿电子的AUDIO音频模块AN831。

AN831

音频模块上有三个音频连接器,其中粉色的接口为麦克风输入;绿色的接口为耳机输出;蓝色的接口为音频输入, 用于连接DVD等音频输出口。本实验将实现音频模块和FPGA之间的数据通信, 通过音频模块把麦克风输入的语音数据存储到SDRAM存储器里, 再把音频数据发送给音频模块,从耳机接口进行语音的播放,从而实现录音和播放的功能。

2. 实验原理

2.1 硬件介绍

开发板通过40PIN的扩展口和AN831音频模块连接,AN831音频模块使用WOLFSON公司的WM8731芯片实现声音信号的A/D和D/A转换功能。以下为AN831音频模块的硬件电路:

o4YBAGAvT3SAJXIcAAB44UOqtTw452.jpg

2.2 WM8731配置和时序

这里简单介绍一下音频模块AN831用到的音频编/解码芯片WM8731。该芯片在本设计中主要完成声音信号在采集和回放过程中的A/D和D/A转换功能。该芯片的ADCDAC的采样频率为8KHz到96KHz可调,可转换的数据长度为16-32位可调。WM8731的内部有11个寄存器。该芯片的初始化以及工作时的工作状态和功能都是通过以I2C总线方式对其内部的这11个寄存器进行相应的配置来实现的。本设计中WM8731工作于主模式,采样频率设为48KHZ,转换的数据位长度为16位。WM8731的数字音频接口有5根引脚,分别为:BCLK(数字音频位时钟)、DACDAT(DAC数字音频数据输入)、DACLRC(DAC采样左/右声道信号)、ADCDAT(ADC数字音频信号输出)、ADCLRC(ADC采样左/右声道信号)。在本设计中FPGA为从设备,WM8731为主设备。ADCDAT、DACDAT、ADCLRC和DACLRC与位时钟BCLK同步,在每个BCLK的下降沿进行一次数据传输。BCLK、DACDAT、DACLRC、ADCLRC为WM8731的输入信号。ADCDAT为WM8731的输出信号。

pIYBAGAvT3WAFexoAACY1EN5Zw4710.jpg

在本系统中FPAG和WM8731的控制和数据通信将用到I2C和数字音频总线接口。FPGA通过I2C接口配置WM8731的寄存器,通过I2S总线接口来进行音频数据的通信。关于I2C接口,其他实验中已经有讲解,下面我们主要来了解数字音频接口

数字音频接口可提供4种模式:

  • Right justified

  • Left justified

  • I2S

  • DSP mode

o4YBAGAvT3WAGN7KAAA1TSfqouI330.jpgLeft justified模式pIYBAGAvT3aAO3DMAAA5LhaamWk072.jpgI2S模式pIYBAGAvT3eAL_g4AAA1906MFDA910.jpgRight justified模式o4YBAGAvT3eAModyAAAdzrBeYBo101.jpgDSP/PCM 模式(MODE A)o4YBAGAvT3iAI1jsAAAdcoTQbHs628.jpgDSP/PCM 模式(MODE B)

本实验选择Right justified模式。

pIYBAGAvT3iAVJNzAAFsk6UD-_I607.jpg

3. 程序设计

本实验的功能是程序检测按键KEY2是否按下,如果检测到KEY2按下了,开始录音,录音的最长时间为20秒;录音结束后,开始播放刚才录下的音频。本程序设计包含四大部分:SDRAM的读写控制程序,音频录音和播放,按键检测和系统控制。

lut_wm8731模块将寄存器配置地址和配置信息通过查找表的形式通过I2C总线写入音频模块中,具体的请参考例程代码和wm9731的芯片数据手册。

audio_rx接收模块,接收从麦克风输入的语音信号,完成左右声道的音频接收,将串行数据转换成并行数据。通过“Right justified”模式的时序图可以看到接收语音信号时在LRC信号为高电平,且BCLK信号的上升沿时左声道接收数据并完成串行信号转换成并行信号的过程。在LRC信号为低电平,且BCLK 信号的上升沿时右声道接收数据并完成串行信号转换成并行信号的过程。

信号名称 方向 说明
clk in 时钟输入
rst in 异步复位输入,高复位
sck_bclk in 数字音频接口bit时钟
ws_lrc in ADC采样时钟
sdata in 音频数字接口串行数据输入
left_data out 左声道数据
right_data out 右声道数据
data_valid out 音频数据有效

audio_rx音频接收模块端口

audio_tx是音频发送模块,完成左右声道音频数据的串行化。同样通过时序图可以看到,语音信号完成模数,数模转换从SDRAM输出后进入发送模块,在LRC信号上升沿,且即将跳变为高电平时接收左声道数据,BCLK信号下降沿时完成缓存将并行信号转换为串行信号的过程;在LRC信号上升沿且即将跳变为低电平时接收右声道数据,在BCLK信号下降沿时完成缓存将并行信号转换为串行信号的过程。

信号名称 方向 说明
clk in 时钟输入
rst in 异步复位输入,高复位
sck_bclk in 数字音频接口bit时钟
ws_lrc in ADC采样时钟
sdata out 音频数字接口串行数据输入
left_data in 左声道数据
right_data in 右声道数据
read_data_en out 音频数据读取,提前一个采样周期读取

audio_tx音频发送模块端口

在模块‘frame_read_write’中使用到了FIFO 的IP core,通过两个FIFO分别作为DDR3控制器的读写接口,避免复杂的DDR3时序。因为时钟速率的不同,所使用的是异步FIFO。以write_buf写入模块的FIFO为例在vivado中FIFO IP core设置如下:

  1. 打开Tools菜单下的“IP Compiler”, 在弹出的界面下进行如下设置,设置完成后点击”Customize”:

o4YBAGAvT3mAEgWkAABPU5AkGIM147.jpg

  1. 在弹出的界面下进行如下设置,设置完成后点击保存后Generate即可生成IP:

pIYBAGAvT3qAEmJSAACx1CaW5dE449.jpg

  1. 接着在模块中直接例化FIFO 的端口名就可以使用FIFO了,在read_buf中也是同样的操作步骤。具体的参数设置和端口例化的信号连接参考例程。

frame_fifo_write模块完成FIFO数据到外部存储器的写入,如果FIFO接口是异步FIFO,可以完成写数据的跨时钟域转换。状态机转换图如下,收到写数据请求后进入应答状态“S_ACK”,如果写请求撤销,则进入检测FIFO空间大小状态“S_CHECK_FIFO”,检查FIFO内数据是否够一次突发写,如果有足够多的数据,进入突发写存储器状态“S_WRITE_BURST”,突发写完成后进入“S_WRITE_BURST_END”状态。

o4YBAGAvT3uAAXcUAAAZjUc6nXk543.jpgframe_fifo_write模块状态机

信号名称 方向 说明
mem_clk in 外部存储器用户时钟输入
rst in 异步复位输入,高复位
wr_burst_req out 对接存储器控制器,写请求
wr_burst_len out 对接存储器控制器,写请求长度
wr_burst_addr out 对接存储器控制器,写请求基地址
wr_burst_data_req in 对接存储器控制器,写请求数据索取,提前一个时钟周期发出,用于连接FIFO的读数据
wr_burst_finish in 对接存储器控制器,写请求完整
write_req in 一帧(大量数据)写开始,收到应答后必须撤销请求,新的请求会中断正在进行的请求
write_req_ack out 一帧(大量数据)写应答
write_finish out 一帧(大量数据)完成
write_addr_0 in 一帧(大量数据)写基地址0
write_addr_1 in 一帧(大量数据)写基地址1
write_addr_2 in 一帧(大量数据)写基地址2
write_addr_3 in 一帧(大量数据)写基地址3
write_addr_index in 一帧(大量数据)写基地址选择,0:write_addr_01:write_addr_12:write_addr_23:write_addr_3
write_len in 一帧(大量数据)写长度
fifo_aclr out 在收到写请求后,模块会清空FIFO
rdusedw in FIFO读端的数据使用量

frame_fifo_write模块端口

frame_fifo_read读模块完成从外部存储器读取数据,然后写到FIFO,如果使用异步FIFO可以完成数据从存储器时钟域到其他时钟域的转换。状态机转换图如下图所示,收到读请求以后进入应答状态“S_ACK”,等待读请求撤销后应答,进入FIFO深度检测状态“S_CHECK_FIFO”,如果FIFO空间足够一次突发读,进入突发读状态“S_READ_BURST”,突发读结束后进入“S_READ_BURST_END”。

pIYBAGAvT3uATis0AAAYlMY04Z0333.jpgframe_fifo_read模块状态机

信号名称 方向 说明
mem_clk in 外部存储器用户时钟输入
rst in 异步复位输入,高复位
rd_burst_req out 对接存储器控制器,读请求
rd_burst_len out 对接存储器控制器,读请求长度
rd_burst_addr out 对接存储器控制器,读请求基地址
rd_burst_data_valid in 对接存储器控制器,读请求数据有效
rd_burst_finish in 对接存储器控制器,读请求完全
read_req in 一帧数据读开始
read_req_ack out 一帧数据读应答
read_finish out 一帧数据读完成
read_addr_0 in 一帧数据读基地址0
read_addr_1 in 一帧数据读基地址1
read_addr_2 in 一帧数据读基地址2
read_addr_3 in 一帧数据读基地址3
read_addr_index in 一帧数据读基地址选择0:read_addr_01:read_addr_12:read_addr_23:read_addr_3
read_len in 帧数据读长度
fifo_aclr out 外部FIFO异步复位
wrusedw in FIFO写端使用空间大小

frame_fifo_read模块端口

audio_key模块主要完成录音播放的按键控制,状态转换如下,当按键按下后进入录音状态,当按键松开时进入播放状态。

o4YBAGAvT3yAQ-lwAAAOKGQbkuw987.jpgaudio_key模块状态转换图

信号名称 方向 说明
clk in 时钟输入
rst in 异步复位输入,高复位
key in 按键输入
record out 录音状态指示
play out 播放状态指示
write_req out 写数据开始
write_req_ack in 写数据应答
read_req out 读数据开始
read_req_ack in 读数据应答

frame_read_write模块完成音频帧数据读写的封装,这里使用了异步FIFO来解决跨时钟问题,例如FIFO 输入宽度和输出宽度的不同来完成数据位宽的转换。

4. 实验现象

开发板首先将音频模块插入扩展口,同时插入麦克风和耳机,然后下载实验程序,按下KEY2不放,进行录音,松开按键后可通过耳机回放录音。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21309

    浏览量

    593127
  • 电路
    +关注

    关注

    170

    文章

    5480

    浏览量

    169507
  • 音频
    +关注

    关注

    28

    文章

    2598

    浏览量

    79964
  • 开发板
    +关注

    关注

    25

    文章

    4426

    浏览量

    93940
  • 紫光同创
    +关注

    关注

    4

    文章

    68

    浏览量

    27249
收藏 人收藏

    评论

    相关推荐

    紫光同创新品开发板,盘古PGX系列PGX-MINI 4K开发板,板卡集成下载器~

    迎来迅猛发展。国产FPGA由于拥有高性价比、完整自主可控知识产权产业链,越来越成为行业热门选择。 作为国产FPGA专业厂商紫光
    发表于 03-01 19:02

    紫光同创FPGA有哪些型号

    请问紫光同创FPGA有哪些型号?分别用于什么场景?
    发表于 01-24 10:48

    国产FPGA介绍-紫光同创

    紫光同创紫光集团旗下紫光国微的子公司,成立于2013年,有十余年可编程逻辑器件研发经历,布局覆盖高中低端FPGA产品。 早在2015年,
    发表于 01-24 10:45

    2024新品|紫光同创盘古系列FPGA开发板套件,100%国产化方案

    专业厂商紫光同创生态合作伙伴,小眼睛科技一直深耕FPGA产品和解决方案,基于紫光同创器件,推出100%
    发表于 12-28 14:18

    紫光同创FPGA开发套件,高性能国产FPGA方案

    紫光同创FPGA开发套件,高性能国产FPGA方案,100%国产化,全系列产品,方案可定制,满足多
    发表于 11-16 17:25

    基于紫光同创PGL25G的FPGA方案~

    基于紫光同创PGL25G的FPGA方案展示@小眼睛FPGA~
    发表于 11-02 18:00

    基于紫光同创FPGA的多路视频采集与AI轻量化加速的实时目标检测系统

    基于紫光同创FPGA的多路视频采集与AI轻量化加速的实时目标检测系统#2023集创赛#紫光同创#小眼睛科技助力
    发表于 11-02 17:51

    基于紫光同创PGL50H-6IFBG484的光端机方案

    基于紫光同创PGL50H-6IFBG484的光端机方案展示#小眼睛FPGA#紫光同创#国产
    发表于 11-02 17:44

    更新 | 持续开源 迅为RK3568驱动指南第十一篇-pinctrl子系统

    《iTOP-RK3568开发板驱动开发指南》更新,本次更新内容对应的是驱动(第十一期_pinctrl子系统-全新升级)视频,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。 文档
    发表于 10-18 11:12

    紫光同创PGL22G开发板|盘古22K开发板,国产FPGA开发板,接口丰富,高性价比

    盘古22K开发板是基于紫光同创Logos系列PGL22G芯片设计的一款FPGA开发板,全面实现国产化方案,板载资源丰富,高容量、高带宽,外围接口丰富,不仅适用于高校教学,还可以用于实验
    发表于 09-21 18:16

    紫光同创PGL22G开发板|盘古22K开发板,国产FPGA开发板

    ​ 本原创文章由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处 盘古22K开发板是基于紫光同创Logos系列PGL22G芯片设计的一款FPGA开发板,全面实现国产
    发表于 08-31 14:21

    【免费试用】紫光同创PGL50H开发平台,高性能国产FPGA,盘古50K开发板试用活动火热征集中!

    的可编程逻辑器件平台和系统解决方案。 为方便更多用户熟练掌握国产FPGA开发平台,在导入国产化器件时可以实现快速转化,紫光同创联合生态合作伙
    发表于 08-21 16:16

    紫光同创国产FPGA教程】【PGC1/2KG第二章】LED 流水灯实验例程

    适用于板卡型号: 紫光同创PGC1/2KG开发平台(盘古1K/2K) 一:盘古1K/2K开发板(紫光同创PGC2KG开发平台)简介 盘古1/2K 开发板是一套基于
    发表于 08-09 11:58

    紫光同创国产FPGA教程】【PGC1/2KG第一章】控制LED灯实验例程

    适用于板卡型号: 紫光同创PGC1/2KG开发平台(盘古1K/2K) 一:盘古1K/2K开发板(紫光同创PGC2KG开发平台)简介 盘古1/2K 开发板是一套基于
    发表于 08-08 11:49