小梅哥测试代码(供学习) - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki
D1
特点:wait()用法, @(clk)用法
`timescale 1ns/1ns
module adc128s102_tb;
reg Clk;
reg Reset_n;
reg Conv_Go;
reg [2:0]Addr;
wire Conv_Done;
wire[11:0]Data;
wire ADC_SCLK;
wire ADC_CS_N;
wire ADC_DIN;
reg ADC_DOUT;
adc128s102 adc128s102(
.Clk(Clk),
.Reset_n(Reset_n),
.Conv_Go(Conv_Go),
.Addr(Addr),
.Conv_Done(Conv_Done),
.Data(Data),
.ADC_SCLK(ADC_SCLK),
.ADC_CS_N(ADC_CS_N),
.ADC_DIN(ADC_DIN),
.ADC_DOUT(ADC_DOUT)
);
initial Clk = 1;
always #10 Clk = ~Clk;
initial begin
Reset_n = 0;
Conv_Go = 0;
Addr = 0;
#201;
Reset_n = 1;
#200;
Conv_Go = 1;
Addr = 3;
#20;
Conv_Go = 0;
wait(!ADC_CS_N);
//16'h0A58
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB15
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB14
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB13
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB12
@(negedge ADC_SCLK);
ADC_DOUT = 1; //DB11
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB10
@(negedge ADC_SCLK);
ADC_DOUT = 1; //DB9
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB8
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB7
@(negedge ADC_SCLK);
ADC_DOUT = 1; //DB6
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB5
@(negedge ADC_SCLK);
ADC_DOUT = 1; //DB4
@(negedge ADC_SCLK);
ADC_DOUT = 1; //DB3
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB2
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB1
@(negedge ADC_SCLK);
ADC_DOUT = 0; //DB0
wait(ADC_CS_N);
#20000;
Conv_Go = 1;
Addr = 7;
#20;
Conv_Go = 0;
wait(!ADC_CS_N);
//16'h0893
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 1;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 1;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 1;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 0;
@(negedge ADC_SCLK);
ADC_DOUT = 1;
@(negedge ADC_SCLK);
ADC_DOUT = 1;
wait(ADC_CS_N);
#200;
#2000;
$stop;
end
endmodule
D2
特点:while() begin @(clk)... end的用法
`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2024/01/02 13:53:39
// Design Name:
// Module Name: bram_sync_fifo_test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module bram_sync_fifo_test();
reg Reset;
reg Clk;
reg [7:0]din;
reg wr_en;
reg rd_en;
wire [7:0]dout;
wire full;
wire almost_full;
wire wr_ack;
wire overflow;
wire empty;
wire almost_empty;
wire valid;
wire underflow;
wire [7:0]data_count;
bram_sync_fifo bram_sync_fifo (
.clk(Clk), // input wire clk
.srst(Reset), // input wire srst
.din(din), // input wire [7 : 0] din
.wr_en(wr_en), // input wire wr_en
.rd_en(rd_en), // input wire rd_en
.dout(dout), // output wire [7 : 0] dout
.full(full), // output wire full
.almost_full(almost_full), // output wire almost_full
.wr_ack(wr_ack), // output wire wr_ack
.overflow(overflow), // output wire overflow
.empty(empty), // output wire empty
.almost_empty(almost_empty), // output wire almost_empty
.valid(valid), // output wire valid
.underflow(underflow), // output wire underflow
.data_count(data_count) // output wire [7 : 0] data_count
);
initial Clk = 1;
always #10 Clk = ~Clk;
initial begin
Reset = 1'b1;
wr_en = 1'b0;
rd_en = 1'b0;
din = 8'hff;
#21;
Reset = 1'b0;
//写操作,从0到255,共256个数据
while(full == 1'b0)
begin
@(posedge Clk);
#1;
wr_en = 1'b1;
din = din + 1'b1;
end
//再多写一个数据,看overflow的变化
din = 8'hf0;
@(posedge Clk);
#1;
wr_en = 1'b0;
#2000;
//读操作,读256次
while(empty == 1'b0)
begin
@(posedge Clk);
#1;
rd_en = 1'b1;
end
//再多给一个读使能,看underflow的变化
@(posedge Clk);
#1;
rd_en = 1'b0;
//复位
#200;
Reset = 1'b1;
#21;
Reset = 1'b0;
#2000;
$stop;
end
endmodule
D3
特点:defparam的用法
`timescale 1ns / 1ns
module led_ctrl_tb();
reg Clk;
reg Reset_n;
wire Led;
reg [7:0]SW;
led_ctrl3 led_ctrl3(
.Clk(Clk),
.Reset_n(Reset_n),
.SW(SW),
.Led(Led)
);
//defparam led_ctrl1.TIME_UNIT_MS = 1;
defparam led_ctrl3.MCNT0 = 12500-1;
defparam led_ctrl3.MCNT2 = 50_000-1;
initial Clk = 1;
always #10 Clk = ~Clk;
initial begin
Reset_n = 0;
SW=8'b1010_1001;
#201;
Reset_n = 1;
#40000000;
$stop;
end
endmodule
D4
特点:repeat begin ....end的用法
`timescale 1ns / 1ps
module ram_tb;
reg clka ;
reg ena ;
reg wea ;
reg [15:0] addra;
reg [15:0] dina ;
reg clkb ;
reg enb ;
reg [15:0] addrb;
wire [15:0] doutb;
ram ram (
.clka (clka), // input wire clka
.ena (ena), // input wire ena
.wea (wea), // input wire [0 : 0] wea
.addra(addra), // input wire [15 : 0] addra
.dina (dina), // input wire [15 : 0] dina
.clkb (clkb), // input wire clkb
.enb (enb), // input wire enb
.addrb(addrb), // input wire [15 : 0] addrb
.doutb(doutb) // output wire [15 : 0] doutb
);
initial clka = 1; always #10 clka = ~clka;
initial clkb = 1; always #15 clkb = ~clkb;
initial begin
ena = 0;
wea = 0;
addra = 0;
dina = 0;
addrb = 0;
enb = 0;
// 写入 写满
#201;
repeat(65536) begin
ena = 1;
wea = 1;
#20;
addra = addra + 1;
dina = dina + 1;
end
ena = 0;
wea = 0;
#20000;
// 读出
addrb = 65535;
#300;
repeat(65536) begin
enb = 1;
#30;
addrb = addrb - 1;
end
#2000;
$stop;
end
endmodule
D5
特点:repeat() begin....end的用法
`timescale 1ns / 1ps
module rom_tb();
reg clka;
reg [9:0] addra;
wire [9:0] douta;
rom ROM (
.clka(clka), // input wire clka
.addra(addra), // input wire [9 : 0] addra
.douta(douta) // output wire [9 : 0] douta
);
initial clka = 1;
always #10 clka = !clka;
initial begin
addra = 100;
#201;
repeat(3000) begin
addra = addra + 1'd1;
#20;
end
#2000;
$stop;
end
endmodule
D6
特点:与外设模块的交互,用set start/data....wait(end==1)的方法交互
`timescale 1ns / 1ps
module TLV5618_Driver_tb();
reg Clk;
reg Rst_n;
reg [15:0]DAC_DATA;
reg Set_Go;
wire Set_Done;
wire DAC_CS_N;
wire DAC_DIN;
wire DAC_SCLK;
TLV5618_Driver TLV5618_Driver(
.Clk(Clk),
.Rst_n(Rst_n),
.DAC_DATA(DAC_DATA),
.Set_Go(Set_Go),
.Set_Done(Set_Done),
.DAC_CS_N(DAC_CS_N),
.DAC_DIN(DAC_DIN),
.DAC_SCLK(DAC_SCLK)
);
initial Clk = 1;
always#10 Clk = ~Clk;
initial begin
Rst_n = 0;
Set_Go = 0;
DAC_DATA = 0;
#201;
Rst_n = 1;
#200;
DAC_DATA = 16'hC_AAA;
Set_Go = 1;
#20;
Set_Go = 0;
#200;
wait(Set_Done);
#20001;
DAC_DATA = 16'h4_555;
Set_Go = 1;
#20;
Set_Go = 0;
#200;
wait(Set_Done);
#20001;
DAC_DATA = 16'h1_555;
Set_Go = 1;
#20;
Set_Go = 0;
#200;
wait(Set_Done);
#20001;
DAC_DATA = 16'hf_555;
Set_Go = 1;
#20;
Set_Go = 0;
#200;
wait(Set_Done);
#20000;
$stop;
end
endmodule
D7
`timescale 1ns / 1ps
module uart_byte_rx_tb();
reg Clk;
reg Reset_n;
reg uart_rx;
wire Rx_Done;
wire [7:0]Rx_Data;
uart_byte_rx uart_byte_rx(
.Clk(Clk),
.Reset_n(Reset_n),
.uart_rx(uart_rx),
.Rx_Done(Rx_Done),
.Rx_Data(Rx_Data)
);
initial Clk = 1;
always #10 Clk= ~Clk;
initial begin
Reset_n = 0;
uart_rx = 1;
#201;
Reset_n = 1;
#200;
//8'b0101_0101
uart_rx = 0; #(5208*20); //起始位
uart_rx = 1; #(5208*20); //bit0
uart_rx = 0; #(5208*20); //bit1
uart_rx = 1; #(5208*20); //bit2
uart_rx = 0; #(5208*20); //bit3
uart_rx = 1; #(5208*20); //bit4
uart_rx = 0; #(5208*20); //bit5
uart_rx = 1; #(5208*20); //bit6
uart_rx = 0; #(5208*20); //bit7
uart_rx = 1; #(5208*20); //停止位
#(5208*20*10);
//8'b1010_1010
uart_rx = 0; #(5208*20); //起始位
uart_rx = 0; #(5208*20); //bit0
uart_rx = 1; #(5208*20); //bit1
uart_rx = 0; #(5208*20); //bit2
uart_rx = 1; #(5208*20); //bit3
uart_rx = 0; #(5208*20); //bit4
uart_rx = 1; #(5208*20); //bit5
uart_rx = 0; #(5208*20); //bit6
uart_rx = 1; #(5208*20); //bit7
uart_rx = 1; #(5208*20); //停止位
#(5208*20*10);
//8'b1111_0000
uart_rx = 0; #(5208*20); //起始位
uart_rx = 0; #(5208*20); //bit0
uart_rx = 0; #(5208*20); //bit1
uart_rx = 0; #(5208*20); //bit2
uart_rx = 0; #(5208*20); //bit3
uart_rx = 1; #(5208*20); //bit4
uart_rx = 1; #(5208*20); //bit5
uart_rx = 1; #(5208*20); //bit6
uart_rx = 1; #(5208*20); //bit7
uart_rx = 1; #(5208*20); //停止位
#(5208*20*10);
//8'b0000_1111
uart_rx = 0; #(5208*20); //起始位
uart_rx = 1; #(5208*20); //bit0
uart_rx = 1; #(5208*20); //bit1
uart_rx = 1; #(5208*20); //bit2
uart_rx = 1; #(5208*20); //bit3
uart_rx = 0; #(5208*20); //bit4
uart_rx = 0; #(5208*20); //bit5
uart_rx = 0; #(5208*20); //bit6
uart_rx = 0; #(5208*20); //bit7
uart_rx = 1; #(5208*20); //停止位
#(5208*20*10);
$stop;
end
endmodule