Audio 用于打开音频文件的简单Verilog VPI模块

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语言完成所有工作,

我想编写一个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文件的摄像机, 虽然图像处理还有很多方面,但音频方面的问题还没有解决。 因此,在我看来,这段代码现在有点过于复杂了——我都没有做到
它需要运行。

我建议这样处理它:

  • 找出你的C/Verilog接口
  • 使用该接口实现音频文件访问,但不必担心VPI
  • 使用VPI实现C/Verilog胶水
  • 接口可能非常简单。一个函数用于打开音频文件并指定任何必要的参数(样本大小、大/小端点等),另一个函数用于返回下一个样本。如果需要支持在同一个模拟中读取多个文件,则需要将某种句柄传递给PLI函数,以识别正在读取的文件

    Verilog的使用可以简单到:

    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!