基于FPGA的信号发生器 的TESTBENCH(测试文本)程序怎么编

基于FPGA的信号发生器 的TESTBENCH(测试文本)程序怎么编,第1张

1.激励的设置

相应于被测试模块的输入激励设置为reg型,输出相应设置为wire类型,双向端口inout在测试中需要进行处理。

方法1:为双向端口设置中间变量inout_reg作为该inout的输出寄存,inout口在testbench中要定义为wire型变量,然后用输出使能控制传输方向。

eg:

inout [0:0] bi_dir_port;

wire [0:0] bi_dir_port;

reg [0:0] bi_dir_port_reg;

reg bi_dir_port_oe;

assign bi_dir_port=bi_dir_port_oebi_dir_port_reg:1'bz;

用bi_dir_port_oe控制端口数据方向,并利用中间变量寄存器改变其值。等于两个模块之间用inout双向口互连。往端口写(就是往模块里面输入)

方法2:使用force和release语句,这种方法不能准确反映双向端口的信号变化,但这种方法可以反映块内信号的变化。具体如示:

module test();

wire data_inout;

reg data_reg;

reg link;

#xx; //延时

force data_inout=1'bx; //强制作为输入端口

#xx;

release data_inout; //释放输入端口

endmodule

从文本文件中读取和写入向量

1)读取文本文件:用 $readmemb系统任务从文本文件中读取二进制向量(可以包含输入激励和输出期望值)。$readmemh 用于读取十六进制文件。例如:

reg [7:0] mem[1:256] // a 8-bit, 256-word 定义存储器mem

initial $readmemh ( "memdata", mem ) // 将dat文件读入寄存器mem中

initial $readmemh ( "memdata", mem, 128, 1 ) // 参数为寄存器加载数据的地址始终

2)输出文本文件:打开输出文件用$fopen 例如:

integer out_file; // out_file 是一个文件描述,需要定义为 integer类型

out_file = $fopen ( " cpudata " ); // cpudata 是需要打开的文件,也就是最终的输出文本

设计中的信号值可以通过$fmonitor, $fdisplay,

2 Verilog和Ncverilog命令使用库文件或库目录

ex) ncverilog -f runf -v lib/libv -y lib2 +libext+v //一般编译文件在runf中, 库文件在libv中,lib2目录中的v文件系统自动搜索

使用库文件或库目录,只编译需要的模块而不必全部编译

3.Verilog Testbench信号记录的系统任务:

1) SHM数据库可以记录在设计仿真过程中信号的变化 它只在probes有效的时间内记录你set probe on的信号的变化

ex) $shm_open("wavesshm"); //打开波形数据库

$shm_probe(top, "AS"); // set probe on "top",

第二个参数: A -- signals of the specific scrope

S -- Ports of the specified scope and below, excluding library cells

C -- Ports of the specified scope and below, including library cells

AS -- Signals of the specified scope and below, excluding library cells

AC -- Signals of the specified scope and below, including library cells

还有一个 M ,表示当前scope的memories, 可以跟上面的结合使用, "AM" "AMS" "AMC"

什么都不加表示当前scope的ports;

$shm_close //关闭数据库

2) VCD数据库也可以记录在设计仿真过程中信号的变化 它只记录你选择的信号的变化

ex) $dumpfile("filename"); //打开数据库

$dumpvars(1, topu1); //scope = topu1, depth = 1

第一个参数表示深度, 为0时记录所有深度; 第二个参数表示scope,省略时表当前的scope

$dumpvars; //depth = all scope = all

$dumpvars(0); //depth = all scope = current

$dumpvars(1, topu1); //depth = 1 scope = topu1

$dumpoff //暂停记录数据改变,信号变化不写入库文件中

$dumpon //重新恢复记录

3) Debussy fsdb数据库也可以记录信号的变化,它的优势是可以跟debussy结合,方便调试

如果要在ncverilog仿真时,记录信号, 首先要设置debussy:

a setenv LD_LIBRARY_PATH :$LD_LIBRARY_PATH

(path for debpliso file (/share/PLI/nc_xl//nc_loadpli1))

b while invoking ncverilog use the +ncloadpli1 option

ncverilog -f runf +debug +ncloadpli1=debpli:deb_PLIPtr

fsdb数据库文件的记录方法,是使用$fsdbDumpfile和$fsdbDumpvars系统函数,使用方法参见VCD

注意: 在用ncverilog的时候,为了正确地记录波形,要使用参数: "+access+rw", 否则没有读写权限

在记录信号或者波形时需要指出被记录信号的路径,如:tbmoduleu1clk

………………………………………………………………………………………………………

关于信号记录的系统任务的说明:

在testbench中使用信号记录的系统任务,就可以将自己需要的部分的结果以及波形文件记录下来(可采用sigalscan工具查看),适用于对较大的系统进行仿真,速度快,优于全局仿真。使用简单,在testbench中添加:initial begin

$shm_open("wavesshm");

$shm_probe("要记录信号的路径“,”AS“);

#10000

$shm_close; 即可。

4 ncverilog编译的顺序: ncverilog file1 file2

有时候这些文件存在依存关系,如在file2中要用到在file1中定义的变量,这时候就要注意其编译的顺序是

从后到前,就先编译file2然后才是file2

5 信号的强制赋值force

首先, force语句只能在过程语句中出现,即要在initial 或者 always 中间 去除force 用 release 语句

initial begin force sig1 = 1'b1; ; release sig1; end

force可以对wire赋值,这时整个net都被赋值; 也可以对reg赋值

6.加载测试向量时,避免在时钟的上下沿变化

为了模拟真实器件的行为,加载测试向量时,避免在时钟的上下沿变化,而是在时钟的上升沿延时一个时间单位后,加载的测试向量发生变化。如:

assign #5 c=a^b

……

@(posedge clk) #(01`cycle) A=1;

//testbench的波形输出

module top;

initial

begin

$dumpfile("/topvcd"); //存储波形的文件名和路径,一般是vcd格式

$dumpvars(1,top); //存储top这一层的所有信号数据

$dumpvars(2,topu1); //存储topu1之下两层的所有数据信号(包含topu1这一层)

$dumpvars(3,topu2); //存储topu2之下三层的所有数据信号(包含topu2这一层)

$dumpvars(0,topu3); //存储topu3之下所有层的所有数据信号

end

endmodule

//产生随机数,seed是种子

$random(seed);

ex: din <= $random(20);

//仿真时间,为unsigned型的64位数据

$time

ex:

time condition_happen_time;

condition_happen_time = $time;

$monitor($time,"data output = %d", dout);

//参数

parameter para1 = 10,

para2 = 20,

para3 = 30;

//显示任务

$display();

//监视任务

$monitor();

//延迟模型

specify

//describ pin-to-pin delay

endspecify

ex:

module nand_or(Y,A,B,C);

input A,B,C;

output Y;

AND2 #02 (N,A,B);

OR2 #01 (Y,C,N);

specify

(A->Y) = 02;

(B->Y) = 03;

(C->Y) = 01;

endspecify

endmodule

//时间刻度

`timescale 单位时间/时间精确度

//文件I/O

1打开文件

integer file_id;

file_id = fopen("file_path/file_name");

2写入文件

//$fmonitor只要有变化就一直记录

$fmonitor(file_id, "%format_char", parameter);

eg:$fmonitor(file_id, "%m: %t in1=%d o1=%h", $time, in1, o1);

//$fwrite需要触发条件才记录

$fwrite(file_id, "%format_char", parameter);

//$fdisplay需要触发条件才记录

$fdisplay(file_id, "%format_char", parameter);

$fstrobe();

3读取文件

integer file_id;

file_id = $fread("file_path/file_name", "r");

4关闭文件

$fclose(fjile_id);

5由文件设定存储器初值

$readmemh("file_name", memory_name"); //初始化数据为十六进制

$readmemb("file_name", memory_name"); //初始化数据为二进制

//仿真控制

$finish(parameter); //parameter = 0,1,2

$stop(parameter);

//读入SDF文件

$sdf_annotate("sdf_file_name", module_instance, "scale_factors");

//module_instance: sdf文件所对应的instance名

//scale_factors:针对timming delay中的最小延时min,典型延迟typ,最大延时max调整延迟参数

//generate语句,在Verilog-2001中定义用于表达重复性动作

//必须事先声明genvar类型变量作为generate循环的指标

eg:

genvar i;

generate for(i = 0; i < 4; i = i + 1)

begin

assign = din[i] = i % 2;

end

endgenerate

//资源共享

always @(A or B or C or D)

sum = sel (A+B):(C+D);

//上面例子使用两个加法器和一个MUX,面积大

//下面例子使用一个加法器和两个MUX,面积小

always @(A or B or C or D)

begin

tmp1 = sel A:C;

tmp2 = sel B:D;

end

always @(tmp1 or tmp2)

sum = tmp1 + tmp2;

模板:

module testbench; //定义一个没有输入输出的module

reg …… //将DUT的输入定义为reg类型

……

wire…… //将DUT的输出定义为wire类型

……

//在这里例化DUT

initial

begin

…… //在这里添加激励(可以有多个这样的结构)

end

always…… //通常在这里定义时钟信号

initial

//在这里添加比较语句(可选)

end

initial

//在这里添加输出语句(在屏幕上显示仿真结果)

end

endmodule

一下介绍一些书写Testbench的技巧:

1如果激励中有一些重复的项目,可以考虑将这些语句编写成一个task,这样会给书写和仿真带来很大方便。例如,一个存储器的testbench的激励可以包含write,read等task。

2如果DUT中包含双向信号(inout),在编写testbench时要注意。需要一个reg变量来表示其输入,还需要一个wire变量表示其输出

/

/ 信号发生器 (正弦波,方波,三角波)

/

// #include<reg52h> #include <intrinsh> #define uchar unsigned char #define uint unsigned int

sbit cs=P2^0; //tlc5615片选端口 sbit clk=P2^1; //tlc5615时钟线 sbit din=P2^2;

//tlc5615传输端口

sbit key1=P1^0; sbit key2=P1^1;

//按键的单片机接口

uchar keydat;

uchar flag;

//波形发生终止信号的标志位 一旦

被置零立马停止发信号

uchar flagsqu; //方波高低电平控制为(运用定时器1

中断控制)

uchar m,num; uchar dat=0xff;

uchar code tosin[141]={ //正弦波的编码

0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08, 0x09,0,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,<a href=">

程序很简单的,关键在写程序的时候要注意DAC0832的保持时间和转换速度。

建议你先弄个单缓冲或者直接控制的。

接着控制的会比较简单:

就是DAC8032 1,2,3,10,17,18脚GND。20,19,8脚VCC

能明白吧!程序自己写比较好,这样能学到更多东西

给你点参考,这个程序能让你对它的工作方式更熟悉!!

ORG 0000H

MAIN:MOV A,P1

MOV R0,A ;设置高电平

MOV R1,#00H ;设置低电平

LCALL BOXING

SJMP MAIN

BOXING: JNB P10,SANJIAO ;P10控制三角波的输出

JNB P11,JUXING ;P11控制矩形波的输出

JNB P12,JUCHI ;P12控制锯齿波的输出

RET

;三角波

SANJIAO:

MOV DPTR,#7FFFH ; 选中DA0832

MOV A,#00H

UP1: MOVX @DPTR,A ; 向0832输出数据

INC A

JNZ UP1 ; A=!0 跳转反之顺序执行

DOWN1:DEC A

MOVX @DPTR,A

JNZ DOWN1

RET

;矩形波

JUXING:

MOV DPTR,#7FFFH

LP:MOV A,R0 ;设置输出上限

MOVX @DPTR,A

LCALL DEL_H ;调高电平延时程序

MOV A,R1

MOVX @DPTR,A

LCALL DEL_L ;调低电平延时程序

RET

;锯齿波

JUCHI:

MOV DPTR,#7FFFH

MOV A,#00H

LOOP:MOVX @DPTR,A

INC A

;SJMP LOOP

RET

;延时程序

DEL_H: ;高电平

MOV R7,#250

DE:MOV R6,#4

DJNZ R6,$

DJNZ R7,DE

RET

DEL_L: ;低电平

MOV R7,#250

DEL:MOV R6,#4

DJNZ R6,$

DJNZ R7,DE

RET

;

END

安捷伦(Agilent)是一家电子测试与测量设备的制造商,提供各种类型的测试设备,包括信号发生器。如果您需要使用安捷伦的信号发生器来输出调制信号,则可以按照以下步骤进行 *** 作:

1 选择合适的信号发生器:安捷伦的信号发生器多种多样,有不同的型号和参数。您需要根据您的需求,选择适合的型号和参数的信号发生器。

2 设置信号发生器:连接信号发生器到被测系统中,设置信号发生器的频率和调制参数,例如:频率范围、调制信号波形、幅度、调制深度等。

3 输出调制信号:设置完信号发生器后,您就可以将仪器的输出信号连接到被测系统中,输出您需要的调制信号。

具体步骤将因信号发生器型号不同而略有差异,下面是一个简单的安捷伦信号发生器(E4433B)输出AM调制信号的示例:

1 连接信号发生器:将信号发生器与被测系统连接,使用同轴电缆和BNC连接器将信号发生器输出和被测器输入连接起来。

2 设置调制参数:按照您的需求设置调制参数,例如AM调制的频率、深度和波形等等,可以通过设备的控制面板、键盘和菜单栏进行设置。

3 确认输出信号:在确认设备设置合适后,您可以通过仪器的面板或者菜单栏确认输出的信号波形,以确保输出正确的信号。

希望这些信息能帮助您输出需要的调制信号。在 *** 作设备时,请务必查看设备手册,并参考安捷伦提供的 *** 作指南。

module sin(clk,rst,step,data);

input clk,rst;

input[5:0] step;

output[9:0] data;

reg[9:0] data;

reg[9:0] count;

always@(negedge rst,posedge clk)

if(!rst)

count <= 0;

else

count <= count + step + 8'd1;

wire[9:0] q;

rom U0 (count,clk,q);

always@(posedge clk)

data <= q;

endmodule

rom 用quartus 的megawizard建立

rom数据 太大附不上

;Editor by zzy

;v1123

;

IOY0 EQU 0D400H ;片选IOY0端口始地址

IOY1 EQU 0D440H ;片选IOY1端口始地址

IOY2 EQU 0D480H ;片选IOY2端口始地址

IOY3 EQU 0D4C0H ;片选IOY3端口始地址

;

ADC0809 EQU IOY0+00H ;ADC0809端口地址

PA55 EQU IOY1+00H ;8255的A口地址

PB55 EQU IOY1+04H ;8255的B口地址

PC55 EQU IOY1+08H ;8255的C口地址

PCTL EQU IOY1+0CH ;8255的控制寄存器地址

DAC0832 EQU IOY2+00H ;DAC0832端口地址

TIMER0 EQU IOY3+00H ;8254计数器0端口地址

TIMER1 EQU IOY3+04H ;8254计数器1端口地址

TIMER2 EQU IOY3+08H ;8254计数器2端口地址

TCTL EQU IOY3+0CH ;8254控制寄存器端口地址

STACK1 SEGMENT STACK

DW 256 DUP()

STACK1 ENDS

DATA SEGMENT

STR1 DB 'Please input password:',0AH,0DH,'$'

STR2 DB 'The password is not right !!!Please try again!!!',0AH,0DH,'$'

STR3 DB 'Welcome to the signal creat machine',0AH,0DH,'Loading ADC0809',0AH,0DH,'$'

STR4 DB 'DIS',0AH,0DH,'$'

DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H ;7段数码管的段位值

STABLE DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H,0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFH,0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E2H,0DAH,0D1H,0C7H,0BCH,0B0H,0A5H,98H,8CH,80H,7FH,73H,67H,5AH,4FH,43H,38H,2EH,25H,1DH,15H,0FH,09H,05H,02H,00H,00H,02H,05H,09H,0FH,15H,1DH,25H,2EH,38H,43H,4FH,5AH,67H,73H,7FH

AD DB ; 保存ad转换结果

PASSWORD DB 41H,42H,43H,44H ;预设密码 要改!!!!

PW DB 4 DUP () ;密码预留

YU DB 20 DUP () ;预留20个空间存放数据

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

L0: MOV DX,OFFSET STR1 ;显示提示信息

MOV AH,9

INT 21H

MOV SI,OFFSET PW

MOV CX,4

SCAN: MOV AH,01H

INT 21H

CMP AL,'E'

JZ QUIT

MOV [SI],AL

INC SI

LOOP SCAN

CALL COMP;看不懂

CMP AL,4

JB ERRO;什么意思

JMP RIGHT

ERRO: MOV DX,OFFSET STR2 ;显示提示信息

MOV AH,9

INT 21H

JMP L0

RIGHT: MOV DX,OFFSET STR3 ;显示提示信息

MOV AH,9

INT 21H

CALL CLK ;ADC0809 CLK输入 ,启动8254

MOV DX,PCTL ;初始化8255工作方式

MOV AL,88H ;1000 1000方式0,A口,B口输出,C口高四位输入

OUT DX,AL ;

DISAD: CALL AD0809

MOV DL,0FFH ;判断主键盘有无键按下

MOV AH,6

INT 21H

JZ DISAD

CMP AD,15H

JNB M1

CALL JIETI

JMP L0

M1: CMP AD,80H

JNB M2

CALL SIN

JMP L0

M2: CMP AD,0A0H

JNB M3

CALL TIXING

JMP L0

M3: CMP AD,0C0H

JNB M4

CALL FANG500

JMP L0

M4: CALL FANG1K

JMP L0

QUIT: MOV AX,4C00H ;结束程序退出

INT 21H

COMP PROC NEAR

MOV AL,0 ;初始化al,AL中保存相同字符的个数

MOV SI,OFFSET PW

MOV DI,OFFSET PASSWORD

MOV CX,4

COMPLOOP:

MOV AH,[DI]

CMP [SI],AH

JZ COMPS1

JMP COMPS2

COMPS1:INC AL

COMPS2:INC SI

INC DI

LOOP COMPLOOP

RET

COMP ENDP

DIS PROC NEAR ;显示键值子程序

PUSH AX ;以缓冲区存放的键值为键值表偏移找到键值并显示

MOV SI,3000H

MOV DL,0FDH

MOV AL,DL

AGAIN: PUSH DX

MOV DX,PA55

OUT DX,AL ;设置X1~X4,选通一个数码管

MOV AL,[SI] ;取出缓冲区中存放键值

MOV BX,OFFSET DTABLE

AND AX,00FFH

ADD BX,AX

MOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值

MOV DX,PB55

OUT DX,AL ;写入数码管A~Dp

CALL DALLY

INC SI ;取下一个键值

POP DX

MOV AL,DL

TEST AL,01H ;判断是否显示完?

JZ OUT1 ;显示完,返回

ROR AL,1

MOV DL,AL

JMP AGAIN ;未显示完,跳回继续

OUT1: POP AX

RET

DIS ENDP

AD0809 PROC NEAR ;将IN0结果保存于bl中

MOV DX,ADC0809 ;启动0809的IN0

OUT DX,AL

AD1: MOV DX,PC55

IN AL,DX

CMP AL,80H

JB AD1

MOV DX,ADC0809

IN AL,DX

MOV AD,AL

MOV AH,AL

AND AL,0FH

MOV SI,3000H

MOV [SI],AL

MOV CL,4

SHR AH,CL

MOV [SI+1],AH

CALL DIS

RET

AD0809 ENDP

CLK PROC NEAR ;方波CLK时钟18432K子程序

;初始化8254计数器0工作在方式3,以十进制计数,初值为100

PUSH DX ;保护现场

PUSH AX ;保护现场

MOV DX,TCTL

MOV AL,17H ;0001 0111B

OUT DX,AL

MOV DX,TIMER0 ;装初值100

MOV AL,100D

OUT DX,AL

POP AX ;恢复现场

POP DX ;恢复现场

RET

CLK ENDP

FANG1K PROC NEAR ;方波1KHz子程序

;初始化8254计数器1工作在方式3,以十进制计数; 踔滴84

PUSH DX ;保护现场

PUSH AX ;保护现场

MOV DX,TCTL

MOV AL,56H ;0101 0110B

OUT DX,AL

MOV DX,TIMER1

MOV AL,184

OUT DX,AL

MOV DL,0FFH ;判断主键盘有无键按下

MOV AH,6

INT 21H

POP AX ;恢复现场

POP DX ;恢复现场

RET

FANG1K ENDP

FANG500 PROC NEAR ;方波500Hz子程序

;初始化8254计数器1工作在方式3,以十进制计数,初值为368

PUSH DX ;保护现场

PUSH AX ;保护现场

MOV DX,TCTL

MOV AL,76H ;0111 0110B

OUT DX,AL

MOV DX,TIMER1

MOV AL,70H ;368D分高低位写入

OUT DX,AL

MOV AL,01H

OUT DX,AL

MOV DL,0FFH ;判断主键盘有无键按下

MOV AH,6

INT 21H

POP AX ;恢复现场

POP DX ;恢复现场

RET

FANG500 ENDP

JIETI PROC NEAR ;阶梯波子程序

PUSH DX

PUSH AX

J0: MOV AL,00H

J1: MOV DX,DAC0832

OUT DX,AL

CALL JIETIDALLY

ADD AL,33H

CMP AL,0FFH

JNE J1

MOV DL,0FFH ;判断主键盘有无键按下

MOV AH,6

INT 21H

JZ J0

POP AX

POP DX

RET

JIETI ENDP

SIN PROC NEAR ;正弦波子程序

PUSH AX

PUSH BX

PUSH DX

S1: MOV SI,OFFSET STABLE

MOV CX,64D

S2: MOV AL,[SI]

MOV DX,DAC0832

OUT DX,AL

INC SI

LOOP S2

MOV DL,0FFH ;判断主键盘有无键按下

MOV AH,6

INT 21H

JZ S1

POP DX

POP BX

POP AX

RET

SIN ENDP

TIXING PROC NEAR ;梯形波子程序

T : MOV AL,7FH

MOV DX,DAC0832

OUT DX,AL

CALL TIXINGDALLY

T2:

MOV DX,DAC0832

OUT DX,AL

DEC AL

CMP AL,00H

JNZ T2

T3:

MOV DX,DAC0832

OUT DX,AL

INC AL

CMP AL,7FH

JNZ T3

MOV DL,0FFH ;判断主键盘有无键按下

MOV AH,6

INT 21H

JZ T

RET

TIXING ENDP

;延时子程序

DALLY PROC NEAR

PUSH CX

PUSH AX

MOV CX,4000H

D1: MOV AX,0600H

D2: DEC AX

JNZ D2

LOOP D1

POP AX

POP CX

RET

DALLY ENDP

JIETIDALLY PROC NEAR

PUSH CX

PUSH AX

MOV CX,1000H

DD1: MOV AX,10H

DD2: DEC AX

JNZ DD2

LOOP DD1

POP AX

POP CX

RET

JIETIDALLY ENDP

TIXINGDALLY PROC NEAR

PUSH CX

PUSH AX

MOV CX,1000H

DDD1: MOV AX,0FFH

DDD2: DEC AX

JNZ DDD2

LOOP DDD1

POP AX

POP CX

RET

TIXINGDALLY ENDP

CODE ENDS

END START

写代码不难,只不清楚你的接口是怎样连接的。

可以提示下:

1一个正弦信号可以用12个点表示。直接把量化值写入单片机内。

2用定时器定时1/(频率12)秒一个中断,在定时中断程序里循环输出那12个量化的正弦值到DAC0832,输出即要求的频率信号值。

3有效值测量,就是在定时中断里读取ADC0809的量化数据,并按比例换算成10进制字符显示。就转换稍微麻烦点。不过数据不多也可以用查表方式,反正存储空间有的是。

以上就是关于基于FPGA的信号发生器 的TESTBENCH(测试文本)程序怎么编全部的内容,包括:基于FPGA的信号发生器 的TESTBENCH(测试文本)程序怎么编、急求!!!在c51单片机上的三角波信号发生器,求原理图与c程序代码.、函数信号发生器用单片机和DAC032做的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9379201.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存