当前位置:网站首页>[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
边栏推荐
- (一)Docker安装Redis实战(一主二从三哨兵)
- Redis details
- 一些常见mysql入门练习
- MySQL must know and must know (primary articles)
- 切分字符串进行输出显示
- HAVE FUN | “SOFA 星球”飞船计划、源码解析活动最新进展
- HAVE FUN | "SOFA Planet" spacecraft plan, the latest progress of source code analysis activities
- Configure checkstyle in IDEA
- [Embedded open source library] The use of MultiButton, an easy-to-use event-driven button driver module
- CentOS卸载Oracle 11gR2(x64)_转载
猜你喜欢
随机推荐
Linux中安装redis
【Cron】学习:cron 表达式
群晖DS220+ 应用小笔记
MFC Interprocess Communication (Shared Memory)
(一)Docker安装Redis实战(一主二从三哨兵)
阿里云无法远程连接数据库MySQL错误码10060解决办法_转载
Thymeleaf
Core Data 多线程设计
JedisLock_Redis分布式锁实现_转载
MFC 进程间通信(共享内存)
BGP Comprehensive Experiment
华为od德科面试数据算法解析 2022-8-10 迷宫问题
curl 命令调用接口demo
Day38 LeetCode
关于ie下href有中文出现RFC 7230 and RFC 3986问题的研究
原生态mongo连接查询代码
lspci 命令使用
【嵌入式开源库】MultiButton的使用,简单易用的事件驱动型按键驱动模块
提升你工作效率的技巧,你得知道——Navitcat 快捷键
MySQL必知必会(初级篇)









