当前位置:网站首页>[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
边栏推荐
猜你喜欢
我的四核Cortex-A53学习之路
Redis-数据类型(基本指令、String、List、Set、Hash、ZSet、BitMaps、HyperLogLog、GeoSpatial)/发布和订阅
Prometheus :(一)基本概念
Delphi7学习记录-demo实例
IDEA中配置checkstyle
Weekly recommended short video: your commonly used Polaroid, its predecessor turned out to be like this!
Core Data 多线程设计
Unity WebGL RuntimeError: integer overflow
flask框架学习:debug与配置项
StarUML使用心得
随机推荐
让你代码越来越高大上的技巧——代码规范,你得知道
MySQL存储引擎概念
金仓数据库 KingbaseGIS 使用手册(6.8. 几何对象输入函数)
华为od德科面试数据算法解析 2022-8-10 迷宫问题
CentOS卸载Oracle 11gR2(x64)_转载
guava RateLimiter均匀限流
Linux中安装redis
JedisLock_Redis分布式锁实现_转载
Tips to make your code more and more taller and taller - code specification, you have to know
Thymeleaf
Golden Warehouse Database KingbaseGIS User Manual (6.8. Geometry Object Input Function)
pytorch和tensorflow函数对应表
prometheus:(二)监控概述(你永远逃不出我的手掌哈哈)
tensorflow代码翻译成pytorch代码 -详细教程+案例
Idea提升工作效率的必备技巧
Unity WebGL RuntimeError: integer overflow
MyEclipse数据库工具使用教程:使用驱动程序
将double类型的数据转为字符串
redis分布式锁
代码在线审查(添加网页批注)的实现