📄 ex_319_tb.v
字号:
`timescale 1 ns/1 ns
module testbench;
reg reset, clk;
reg [7:0] addr;
reg rd_n, wr_n;
wire [7:0] data, gpio0, gpio1, gpio2, gpio3, gpio4, gpio5;
reg [7:0] data_out;
reg [7:0] gp0_i, gp1_i, gp2_i, gp3_i, gp4_i, gp5_i;
reg data_ctl;
reg p0_ctl, p1_ctl, p2_ctl, p3_ctl, p4_ctl, p5_ctl;
EX_319_tristatebus_gpio_top EX319_instance(
.reset(reset), .clk(clk), .addr(addr),
.rd_n(rd_n), .wr_n(wr_n), .data(data),
.gpio0(gpio0), .gpio1(gpio1), .gpio2(gpio2),
.gpio3(gpio3), .gpio4(gpio4), .gpio5(gpio5) );
assign data = (data_ctl==1'b1) ? data_out : 8'hz;
assign gpio0 = (p0_ctl==1'b1) ? gp0_i : 8'hz;
assign gpio1 = (p1_ctl==1'b1) ? gp1_i : 8'hz;
assign gpio2 = (p2_ctl==1'b1) ? gp2_i : 8'hz;
assign gpio3 = (p3_ctl==1'b1) ? gp3_i : 8'hz;
assign gpio4 = (p4_ctl==1'b1) ? gp4_i : 8'hz;
assign gpio5 = (p5_ctl==1'b1) ? gp5_i : 8'hz;
// set up clk with 20 ns period 50 MHz
parameter clkper = 20;
initial
begin
clk = 1; // Time = 0
end
always
begin
#(clkper / 2) clk = ~clk;
end
initial
begin
reset = 1'b0; // Time = 0
addr = 8'h00;
rd_n = 1'b1;
wr_n = 1'b1;
data_ctl = 1'b0;
p0_ctl = 1'b0;
p1_ctl = 1'b1; // config gpio1 as input port
p2_ctl = 1'b0;
p3_ctl = 1'b1; // config gpio3 as input port
p4_ctl = 1'b0;
p5_ctl = 1'b1; // config gpio5 as input port
data_out = 8'h00;
gp0_i = 8'h00;
gp1_i = 8'h38; // drive gpio1 0x38
gp2_i = 8'h00;
gp3_i = 8'h55; // drive gpio3 0x55
gp4_i = 8'h00;
gp5_i = 8'h68; // drive gpio5 0x68
#105; // Time = 105
reset = 1'b1;
#100; // Time = 205
//--one write cycle-----------------------------------------
addr = 8'hF3; // program gpio0 as output port
data_ctl = 1'b1; // gpio1 as input port
data_out = 8'b0000_0101; // gpio2 as output port
#50; // Time = 255
wr_n = 1'b0;
#200; // Time = 455
wr_n = 1'b1;
#50; // Time = 505
addr = 8'h00;
data_ctl = 1'b0;
data_out = 8'h00;
#100; // Time = 605
//--one write cycle-----------------------------------------
addr = 8'hF7; // program gpio3 as input port
data_ctl = 1'b1; // gpio4 as output port
data_out = 8'b0000_0010; // gpio5 as input port
#50; // Time = 655
wr_n = 1'b0;
#200; // Time = 855
wr_n = 1'b1;
#50; // Time = 905
addr = 8'h00;
data_ctl = 1'b0;
data_out = 8'h00;
#100; // Time = 1005
//--one write cycle-----------------------------------------
addr = 8'hF0; // write aa to gpio0
data_ctl = 1'b1;
data_out = 8'haa;
#50; // Time = 1055
wr_n = 1'b0;
#200; // Time = 1255
wr_n = 1'b1;
#50; // Time = 1305
addr = 8'h00;
data_ctl = 1'b0;
data_out = 8'h00;
#100; // Time = 1405
//--one write cycle-----------------------------------------
addr = 8'hF2; // write bb to gpio2
data_ctl = 1'b1;
data_out = 8'hbb;
#50; // Time = 1455
wr_n = 1'b0;
#200; // Time = 1655
wr_n = 1'b1;
#50; // Time = 1705
addr = 8'h00;
data_ctl = 1'b0;
data_out = 8'h00;
#100; // Time = 1805
//--one write cycle-----------------------------------------
addr = 8'hF5; // write cc to gpio4
data_ctl = 1'b1;
data_out = 8'hcc;
#50; // Time = 1855
wr_n = 1'b0;
#200; // Time = 2055
wr_n = 1'b1;
#50; // Time = 2105
addr = 8'h00;
data_ctl = 1'b0;
data_out = 8'h00;
#100; // Time = 2205
//--one read cycle------------------------------------------
addr = 8'hF1; // read gpio1
#50; // Time = 2255
rd_n = 1'b0;
#200; // Time = 2455
rd_n = 1'b1;
#50; // Time = 2505
addr = 8'h00;
#100; // Time = 2605
//--one read cycle------------------------------------------
addr = 8'hF4; // read gpio3
#50; // Time = 2655
rd_n = 1'b0;
#200; // Time = 2855
rd_n = 1'b1;
#50; // Time = 2905
addr = 8'h00;
#100; // Time = 3005
//--one read cycle------------------------------------------
addr = 8'hF6; // read gpio5
#50; // Time = 3055
rd_n = 1'b0;
#200; // Time = 3255
rd_n = 1'b1;
#50; // Time = 3305
addr = 8'h00;
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -