我和我正在尝试用DE2-115板为我们的本科顶点项目创建一个合成器。
我们唯一能弄清楚的是如何将频率映射到"键"通过板载音频端口正确输出。我们已经浏览了网页,所有提供的文档都包含了编解码器的数据表,但是我们无法弄清楚如何使它在VHDL中正常工作。
有没有人曾经通过WM8731输出音频,如果有的话,他们是否愿意帮助我们?
答案 0 :(得分:1)
几年前我做过这件事,并不是太难,但我使用的是带有SOPC构建器的NIOS处理器。
我使用了Altera大学计划IP核available here。
这些核心提供与DE2相关的不同功能,也可能提供其他相关的功能。
根据我的日志,我使用了其中3个核心来使音频工作。
altera_up_avalon_audio_and_video_config
,用于在初始化时配置音频CODEC芯片。
第二个IP提供与音频芯片的数据输入/输出接口:altera_up_avalon_audio
。
最后一个是altera_up_avalon_clocks
。我无法准确记住它的作用,但正如名称所暗示的那样,音频芯片的时钟是必需的。我认为它需要一个输入时钟并生成一个PLL,以便为CODEC提供正确的时钟。
正如我所说,我使用了NIOS处理器,仍然根据我的日志,我使用的C代码是:
void audio_isr(void* context, alt_u32 id)
{
const int len = 2682358;
static signed char *ptr = test_snd;
unsigned int x[128];
alt_up_audio_dev *audio_dev = (alt_up_audio_dev *)context;
unsigned int n = alt_up_audio_write_fifo_space(audio_dev, ALT_UP_AUDIO_RIGHT);
for(unsigned int i = 0; i < n; i++) {
x[i] = 0x800000 + ((int)*ptr++) << 9;
if (ptr > test_snd+len) {
ptr = test_snd;
printf("Done\n");
}
}
alt_up_audio_write_fifo(audio_dev, x, n, ALT_UP_AUDIO_RIGHT);
alt_up_audio_write_fifo(audio_dev, x, n, ALT_UP_AUDIO_LEFT);
}
static void audio_init(void)
{
alt_up_audio_dev *audio_dev = alt_up_audio_open_dev (AUDIO_0_NAME);
if ( audio_dev == NULL)
printf ("Error: could not open audio device \n");
else
printf ("Opened audio device \n");
alt_up_audio_reset_audio_core(audio_dev);
alt_up_audio_disable_write_interrupt(audio_dev);
alt_up_audio_disable_read_interrupt(audio_dev);
alt_irq_register(AUDIO_0_IRQ, (void *)audio_dev, audio_isr);
alt_up_audio_enable_write_interrupt(audio_dev);
}
我不记得这有多好。足够值得提交,但它仍然是一个测试,所以不要过于重视。我的最终代码太复杂了,不能在这里呈现。
希望这足以让您开始走上正确的轨道,即使用Altera的IP。这些IP是明确的AFAIR,所以如果你不想要NIOS,从源头开始比从头开始应该更简单。
答案 1 :(得分:1)
您可能需要3个模块,时钟发生器,音频配置以及音频串行器和解串器。您无需进行基于NIOS II的设计。 Plz检查altera实验室实验,了解它是如何工作的。
pdf link - ftp://ftp.altera.com/up/pub/Altera_Material/Laboratory_Exercises/Digital_Logic/DE2-115/vhdl/lab12_VHDL.pdf。
还要检查演示文件