当前位置:网站首页>[Verilog] I2S Master Test Bench
[Verilog] I2S Master Test Bench
2022-08-11 05:14:00 【LateLinux】
因工作需要,写了一个模拟I2S Master总线协议激励的test bench。左右声道的数据分别为16-bit,采样率为8kHz,因为需要重复发送,所以发送部分写了一个task,仿真中重复调用。
event bclk_negedge; // 定义一个event,叫“bclk_negedge”
always @(negedge i2s_bclk) begin
-> bclk_negedge; // 就是i2s_bclk的下降沿
end
task send_i2s_data(
input i2s_bclk, // bit clock
input [15:0] left_data, // left channel voice data
input [15:0] right_data, // right channel voice data
output ws, // word select, namely sampling rate
output sdo // serial data output
);
integer i; // counter
for (i=0;i<64;i=i+1) begin
if (i==0) ws = 1'b0; // cycle #0,
else if (i<=15) sdo = left_data[16-i]; // cycle #1 to #15
else if (i<=31) sdo = 1'b0; // cycle #16 to #31
else if (i==32) ws = 1'b1; // cycle #32
else if (i<=47) sdo = right_data[48-i]; // cycle #33 to #47
else sdo = 1'b0; // cycle #48 to #63
@(bclk_negedge); // 等待bclk_negedge事件
end
endtask //of send_i2s_data
// 以上for 循环中 if分支判断值可以做成几个宏,如果数据不是16-bit而是20-bit或24-bit的情况,方便修改。或者复杂一点用条件编译,没来得及研究。下面的TB中激励部分的代码,略去例化逻辑模块部分的代码。
module tb_XXXX();
real PERIOD_12M288 = 40.690; // 1/(12288000*2);
real PERIOD_2M048 = 244.141; // 1/(2048000*2);
real PERIOD_BCLK = 1953.125; // 1/(256000*2);
integer PERIOD_8K = 62500; // 1/(8000*2);
reg reset_n;
reg osc_clk;
reg i2s_bclk;
reg i2s_ws;
reg i2s_sdo;
initial begin // 生成晶振时钟
osc_clk = 1'b0;
forever begin
#PERIOD_12M288 osc_clk = 1'b0;
#PERIOD_12M288 osc_clk = 1'b1;
end
end // 生成晶振时钟
initial begin // 生成i2s的bit clock时钟
i2s_bclk = 1'b0;
forever begin
#PERIOD_BCLK i2s_bclk = 1'b0;
#PERIOD_BCLK i2s_bclk = 1'b1;
end
end // 生成i2s的bit clock时钟
initial begin // 主激励部分
#0 reset_n = 1'b0;
i2s_ws = 1'b1;
i2s_sdo = 1'b0;
#100 reset_n = 1'b1;
@(posedge dcm_lock)
reset_n = 1'b1;
#(1*PERIOD_BCLK)
send_i2s_data(i2s_bclk,16'hfc25,16'hda78,i2s_ws,i2s_sdo);
end // 主激励部分
// 例化DUT模块的代码,略
// ......
endmodule
边栏推荐
- Configure checkstyle in IDEA
- 一、Jmeter环境部署
- Thymeleaf
- Weekly recommended short video: your commonly used Polaroid, its predecessor turned out to be like this!
- prometheus:(二)监控概述(你永远逃不出我的手掌哈哈)
- 基于 TF-IDF 文本匹配实战详细教程 数据+代码 可直接运行
- IDEA使用记录
- Redis - the solution to the failure of connecting to the redis server in linux using jedis
- Oracle常用语句归纳_持续更新
- (三)Redis 如何进行压测
猜你喜欢
随机推荐
Oracle常用语句归纳_持续更新
【无2022上海市安全员A证考试题库及模拟考试
【嵌入式开源库】MultiButton的使用,简单易用的事件驱动型按键驱动模块
【Cron】学习:cron 表达式
curl 命令调用接口demo
切分字符串进行输出显示
Mysql introductory exercise
报表控件Stimulsoft报告中的数据矩阵条形码介绍
关于ie下href有中文出现RFC 7230 and RFC 3986问题的研究
imx6 yocto编译备忘
Flask framework learning: trailing slashes for routes
Oracle中如何用一个表的数据更新另一个表中的数据_转载
课堂练习--0708
注解式编程小记
pytorch基础之 pytorch 模型开发模板
oracle表空间与用户的创建
(三)性能实时监控平台搭建(Grafana+Prometheus+Node_explorer+Jmeter)
Tips to make your code more and more taller and taller - code specification, you have to know
【嵌入式开源库】MultiTimer 的使用,一款可无限扩展的软件定时器
[ARM] rk3399 mounts nfs error



![[Embedded open source library] The use of cJSON, an efficient and streamlined json parsing library](/img/11/26ec988a23b239d7b01e2e29e3e32d.png)





