Audio 用于打开音频文件的简单Verilog VPI模块
我想编写一个VPI/PLI接口,用于打开音频文件(即wav、aiff等) 并将数据呈现给Verilog模拟器。我现在正在使用Icarus,希望 使用libsndfile处理输入文件格式和数据类型转换 我不太确定在C代码中使用什么。。。已经看过IEEE 1364-2001,但仍然 我不知道应该使用哪些函数 理想情况下,我希望有一个带有数据端口(串行或并行)、时钟输入的verilog模块 和启动/停止销。我想实现两个模块,一个用于从文件播放,另一个用于记录测试过滤器的输出 我能用C语言完成所有工作,然后在我的测试台上实例化模块吗?否则我必须编写 一个函数(例如,Audio 用于打开音频文件的简单Verilog VPI模块,audio,signal-processing,verilog,libsndfile,icarus,Audio,Signal Processing,Verilog,Libsndfile,Icarus,我想编写一个VPI/PLI接口,用于打开音频文件(即wav、aiff等) 并将数据呈现给Verilog模拟器。我现在正在使用Icarus,希望 使用libsndfile处理输入文件格式和数据类型转换 我不太确定在C代码中使用什么。。。已经看过IEEE 1364-2001,但仍然 我不知道应该使用哪些函数 理想情况下,我希望有一个带有数据端口(串行或并行)、时钟输入的verilog模块 和启动/停止销。我想实现两个模块,一个用于从文件播放,另一个用于记录测试过滤器的输出 我能用C语言完成所有工作,
$read\u audio\u data
)和包装模块,用于在每个时钟脉冲上调用它???
嗯,或者我可能需要创建模块,然后获取该模块的句柄并传递value/vect
不知怎么搞的
我不太关心如何设置文件名,因为我可能
无论如何都不会从verilog代码中执行。
我现在可能会坚持使用24位整数样本
libsndfile
应该可以很好地处理转换。
也许,我会坚持现在的串行(甚至可能是在I2S一样的时尚做)和
如果需要,在Verilog中将其反序列化
我还研究了Icarus,它实现了一个可以读取PNG文件的摄像机,
虽然图像处理还有很多方面,但音频方面的问题还没有解决。
因此,在我看来,这段代码现在有点过于复杂了——我都没有做到
它需要运行。我建议这样处理它:
initial $OpenAudioFile ("filename");
always @(posedge clk)
audio_data <= $ReadSample;
从Verilog检索值
s_vpi_value v;
v.format = vpiIntVal;
vpi_get_value (handle, &v);
// value is in v.value.integer
s_vpi_value v;
v.format = vpiIntVal;
v.value.integer = 0x1234;
vpi_put_value (handle, &v, NULL, vpiNoDelay);
将值写入Verilog
s_vpi_value v;
v.format = vpiIntVal;
vpi_get_value (handle, &v);
// value is in v.value.integer
s_vpi_value v;
v.format = vpiIntVal;
v.value.integer = 0x1234;
vpi_put_value (handle, &v, NULL, vpiNoDelay);
要读取或写入大于32位的值,您需要使用
vpiVectorVal
而不是vpiIntVal
,并对s_-vpi_向量结构进行反编码。我花了几天时间实现PLI测试台,
如果有人读了这篇文章,他们可能会发现它很有用-
这是我的名片。下面有一个自述文件
是一些基本结果的屏幕截图;)
使用git克隆git://github.com/errordeveloper/sftb
获取
代码将重新发布或从github.com下载
我也写过这方面的文章,希望如此
如果有人搜索这种东西,他们会找到的。
我找不到任何类似的,因此开始了这个项目 这听起来很适合一个开源项目,该项目将VPI抽象出来,为DUT提供一个Pythonic接口。您不必编写任何额外的Verilog测试台或包装器RTL,也不必从Verilog调用VPI任务或函数,因为测试台是纯Python的 您所描述的测试台如下所示:
导入cocotb
从cocotb.clock导入时钟
从cocotb.triggers导入RisingEdge
#无论你最喜欢什么样的音频文件IO库。。。
从scikets.audiolab导入wavread
@cocotb.test()
def流_文件(dut,fname=“testfile.wav”)
#启动时钟发生器
cocotb.fork(时钟(dut.clk,5000))
数据,采样频率,编码=wavread(fname)
结果=[]
而数据:
产量上升边缘(dut.clk)
dut.data_in我在实现音频_数据时遇到了一些问题太棒了!如果我回到Verilog,我一定会试试Cocotb!