err*_*per 5 audio verilog signal-processing libsndfile icarus
我想写一个VPI/PLI接口,它将打开音频文件(即wav,aiff等)并将数据呈现给Verilog模拟器.我目前正在使用Icarus,并希望使用libsndfile来处理输入文件格式和数据类型转换.
我不太清楚在C代码中使用什么...已经看过IEEE 1364-2001并且仍然混淆了我应该使用哪些函数.
理想情况下,我想要一个带有数据端口(串行或并行),时钟输入和启动/停止引脚的verilog模块.我想实现两个模块,一个用于从文件中回放,另一个用于记录测试中的过滤器的输出.
我可以在C中完成所有操作,只需在我的测试平台中实例化模块,或者我必须编写一个函数(比如说$read_audio_data
)和包装器模块在每个时钟脉冲上调用它吗?
嗯,或者可能是我需要创建模块然后获取它的句柄并以某种方式将值/ vect传递给句柄?
我不太关心如何设置文件名,因为我可能不会从verilog代码中做到这一点.我可能暂时坚持使用24位整数样本,并且
libsndfile
应该很好地处理转换.也许,我现在会坚持连续(甚至可能以类似I2S的方式)并在需要时在Verilog中对其进行反序列化.
此外,我看过Icarus 插件,它实现了一个读取PNG文件的摄像机,尽管图像处理有很多方面,但还有音频.因此,目前代码看起来有点过于复杂 - 我没有设法让它运行.
我建议这样处理:
界面可能非常简单。一个函数用于打开音频文件并指定任何必要的参数(样本大小、大/小端字节序等),另一个函数返回下一个样本。如果您需要支持在同一模拟中读取多个文件,则需要将某种句柄传递给 PLI 函数以识别您正在读取哪个文件。
Verilog 的用法可以很简单:
initial $OpenAudioFile ("filename");
always @(posedge clk)
audio_data <= $ReadSample;
Run Code Online (Sandbox Code Playgroud)
image-vpi 示例看起来是一个合理的起点。C 代码中使用的基本习惯用法是:
参数访问
// Get a handle to the system task/function call that invoked your PLI routine
vpiHandle tf_obj = vpi_handle (vpiSysTfCall, NULL)
// Get an iterator for the arguments to your PLI routine
vpiHandle arg_iter = vpi_iterate (vpiArgument, tf_obj)
// Iterate through the arguments
vpiHandle arg_obj;
arg_obj = vpi_scan (arg_iter);
// do something with the first argument
arg_obj = vpi_scan (arg_iter);
// do something with the second argument
Run Code Online (Sandbox Code Playgroud)
从 Verilog 检索值
s_vpi_value v;
v.format = vpiIntVal;
vpi_get_value (handle, &v);
// value is in v.value.integer
Run Code Online (Sandbox Code Playgroud)
将值写入 Verilog
s_vpi_value v;
v.format = vpiIntVal;
v.value.integer = 0x1234;
vpi_put_value (handle, &v, NULL, vpiNoDelay);
Run Code Online (Sandbox Code Playgroud)
要读取或写入大于 32 位的值,您需要使用,vpiVectorVal
来代替vpiIntVal
, 并对 s_vpi_vector 结构进行解码/编码。
归档时间: |
|
查看次数: |
2651 次 |
最近记录: |