[Verilog] I2S Master Test Bench

因工作需要,写了一个模拟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

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值