有限解答C/C++/Xilinx方面的较难问题, 欢迎提问
RT,Xilinx用了多年了,除了Zynq没怎么折腾过,其它基本都用过,坑淌过不知多少了。从今天开始每天抽出一定时间解答有关的难题——注意,简单的问题请不要来这问。哪些是简单的问题:
(1)一大堆warning之类的。比如信号被优化掉了,请(1)检查信号有没有输出,(2)检查io port list是否把output/inout写成input了(用ISE模板生成器容易出这问题)。
(2)时序不对。请(1)检查always块是用的=还是用的<=,(2)如果是组合逻辑,assign的话注意检查是否会造成环路,仿真会卡死,(3)仿真器不能有效处理组合逻辑的多时钟域边沿翻转问题,仿真跨时钟域模块时请根据情况自行添加延时。
(3)语法问题等等。常用运算符的问题请不要耽误大家时间,谢谢。请多用()把每一个运算包含起来,以免产生比较优先级歧义的问题,谢谢。
除此之外的大部分都是比较难的问题了,我不可能做到全会,但是至少我淌过的坑一般不会再淌一次。注意:Task,Function之类我没用过,也不会用,有关这一块的我不会解答。
较难问题示例:
(1)一个多时钟域系统在某个输出端口收到的数据个数不对。——请检查数据通道的时钟是否正确配置。错误的时钟在设计良好的异步模块里是可以工作的,但是会造成数据出错。
(2)状态机运行不稳定,很容易卡死。——请检查是否有异步状态输入(包括pin直接输入的,只要是跨时钟域的都算)。
(3)流水线速度上不去。——检查组合逻辑深度(看pr时序报告)。还有,流水线不应当过宽(因为FPGA不适合宽输入的组合逻辑,先天缺陷,片内布线资源基本可以认为是平面的,过于密集的信号布不开)。等等。
(4)AXI协议有时会卡死。——注意当且仅当wvalid & wready或rvalid & rready时抓wlast或rlast,部分IP在前面信号组合无效时会输出随机信号。此外,aw/w和ar/r信号组务必做成完全并行的,同时必须相互握手保证idle状态同步。部分IP要求数据先行。自己设计AXI模块时一定要注意这一点。
(5)时序总是不过。——看一下报错的最长路径,有些路径在仔细设计过之后可以忽略warning,跨时钟域操作如有握手或fifo的请设TIG或false path,以免给布线带来问题。此外,部分器件存在挖空的区域(硬件IP核占用区域),会导致周边走线困难,这种情况只能降频,没别的办法。
(6)批量产品总有异常。——做约束时把时钟加快10~30%,比如输入25M就约束到30M以上。因为FPGA也是有体质差异的,一般建议用最快的器件添加至少10%的时序余量生成bin,然后用普通的片子来跑。目前产品已用上千片,全部是-3生成bin,-2C片子日常用,各种环境下没发现一例时序问题。
C/C++这块,template几乎不怎么用了,日常用不到,同上,语法问题请自己查书上网搜,涉及系统调用等功能代码请上csdn找代码,这里仅仅有限解答一些疑难杂症,谢谢支持。
请不要灌水,谢谢支持。{:biggrin:} 顶下,不过难和易,每个人在不同阶段的理解是不一样滴 浮生莫若闲 发表于 2020-3-21 23:46
顶下,不过难和易,每个人在不同阶段的理解是不一样滴
这应该就是不同级别的积累了。 朋友 ise带的逻辑分析仪如何把io信号加进来观察 本帖最后由 wye11083 于 2020-3-22 09:19 编辑
gwj221 发表于 2020-3-22 08:39
朋友 ise带的逻辑分析仪如何把io信号加进来观察
加个wire完事。
还有,IO应该是能直接加的。你看看你选的是不是port。 支持楼主 楼主整理一下遇到得一些常见问题和重要问题及解答,搞个问题集和经验分享造福坛友。 楼主分享经验套路吧 简单的问题都问不出来…… wye11083 发表于 2020-3-22 09:09
加个wire完事。
还有,IO应该是能直接加的。你看看你选的是不是port。
io加不了 加了wire也不行………… 我说的io就是port端口 支持楼主 支持楼主,这个应该不算灌水············只是为了这份热情舔砖······ 问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. clkA和clkB时钟频率差在50%以内。即A为100MHz,那么 50MHz <B <150Mhz
2. flagA出现频率不会超过 FclkA/4。即flagA最多4个clkA出现一次
3. flagA只会保持1个时钟周期
4. syncB尽量不要扩展为3位,减少延时
module crossflag(
input clkA,
input flagA,
input clkB,
output flagB
);
reg toggle = 0;
always @(posedge clkA) toggle <= toggle ^ flagA;
reg syncB = 0;
always @(posedge clkB) syncB <= {syncB, toggle};
assign flagB = (syncB ^ syncB);
endmodule canspider 发表于 2020-3-22 10:23
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. c ...
不能吧,flagA最短只有一个clka时钟,clkb又比clka慢,看不到toggle的脉冲吧。 canspider 发表于 2020-3-22 10:23
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. c ...
兄弟,跨时钟握手本来就是大延时保证可靠性的,如果你时钟相差100%,至少要a b都延时3个周期。想省时间用fifo,然而fifo同样有至少3cyc的延时! gwj221 发表于 2020-3-22 10:02
我说的io就是port端口
那还是你没选好。你仔细看看chipscope选项。我已经多年不用了,调试直接读状态机看状态。chipscope只能用jtag,非常麻烦。我多年不用jtag线了。 谢谢楼主带了一个好头!
希望有余力的高手跟进,让我们这里的技术交流更高效与火热。 get500wan 发表于 2020-3-22 10:47
不能吧,flagA最短只有一个clka时钟,clkb又比clka慢,看不到toggle的脉冲吧。
toggle只在flagA上升沿变化,频率最高FclkA/4,这个是低于clkB的 支持楼主 Xilinx有没有类似altera那样的内核Nios? 有没有关于FPGA内部总线方面的资料?
和同事调项目(FPGA+DSP),同事设计了套内部总线,参考了各个处理器的寄存器管理方式,把32bit地址划分为若干个region。每个region内部是同一个时钟域的寄存器,与总线之间用小深度的fifo做跨时钟域隔离
目前用着感觉还可以,但是想看看参考资料,看看有没有可改进的地方 chun2495 发表于 2020-3-22 11:57
Xilinx有没有类似altera那样的内核Nios?
帮楼主回答这个问题了。。
有,MicroBlaze,IP核直接生成,用起来还算简单,可以用它来点灯{:lol:} canspider 发表于 2020-3-22 11:35
toggle只在flagA上升沿变化,频率最高FclkA/4,这个是低于clkB的
哦,确实。考虑错了。 prow 发表于 2020-3-22 11:58
有没有关于FPGA内部总线方面的资料?
和同事调项目(FPGA+DSP),同事设计了套内部总线,参考了各个处理器 ...
现在流行axi,你找一下。axi4是主流。包括很多ip都是axi的了。 prow 发表于 2020-3-22 12:00
帮楼主回答这个问题了。。
有,MicroBlaze,IP核直接生成,用起来还算简单,可以用它来点灯...
多谢了。。。 外行来看看,有啥入门资料? powerk6 发表于 2020-3-22 18:52
外行来看看,有啥入门资料?
找本fpga教材,然后多练多写。fpga和c++重在积累。数据结构一定要非常熟,因为fpga内部全部都是最底层的按bit分配的数据结构。 FPGA和深度学习有什么结合的点嘛?
hls写出来的代码和xilinx家的dnndk编译出来的网络可以PK嘛?会不会手写就被取代掉了
有hls相关的资料吗?貌似最近很流行 支持楼主!复杂的问题问不出来,先啃书……就像2楼说的,难和易,每个人在不同阶段的理解是不一样 jjl3 发表于 2020-3-22 23:53
有hls相关的资料吗?貌似最近很流行
因为比较成熟了。比如opencv的haar人脸检测可以直接编译出来,代价是485t的90% sram用满。资料我没有,你找hls语法。hls是扩展的c语言,有几种标准io模型 。 韩乔二 发表于 2020-3-22 23:41
FPGA和深度学习有什么结合的点嘛?
hls写出来的代码和xilinx家的dnndk编译出来的网络可以PK嘛?会不会手写 ...
fpga可以做cnn核,但是复杂逻辑必须得soc紧耦合,否则面积大。目前整体还不够成熟,开源框架资源消耗极高,低端微小片子没一个能跑的,自己写可以针对性去写。软核用vexriscv即可,体积小速度快。大多数手写代码要比机器生成的代码好(当然你得熟练甚至精通,且没有冗余代码)。机器代码没有可读性,出个bug只能s13了。 我再来问个奇怪的问题,FPGA启动用的SPI FLASH可以换vivado里没有的型号么,计划使用GD的flash,但是id应该和常用型号不一致 楼主目前FPGA使用什么方式调试的,JTAG在线调试确实非常难用,另外之前看过楼主发的vexriscv的帖子,比较感兴趣但鉴于编译环境等问题一直是没找方向下手 谭春林 发表于 2020-3-24 15:23
楼主目前FPGA使用什么方式调试的,JTAG在线调试确实非常难用,另外之前看过楼主发的vexriscv的帖子,比较感 ...
自告奋勇回答一下。
看看 spinalhdl 的环境搭建。我用 spinalhdl 来写了一些代码,整体感觉非常好,主要是安装 msys2 的环境,安装 gcc 和 c++ 编译器,安装 verilator 用来仿真,安装 gtkwave 来查看波形。
下载 IDEA,添加 scala 的插件,然后 clone 模板库,导入,就可以做 spinalhdl 的开发。
如果对 IDE 没有兴趣,只要 vxxriscv,不原意安装 IDEA 的话,只要一个 sbt 就可以了。 谢谢楼主 支持楼主 prow 发表于 2020-3-24 14:58
我再来问个奇怪的问题,FPGA启动用的SPI FLASH可以换vivado里没有的型号么,计划使用GD的flash,但是id应该 ...
随便接。要是怕不兼容就用x1模式(不需要特别生成mcs文件!直接在generate bitstream选项里勾上生成bin,找找spi选x1就好)。注意CFG和SPI电压要保持一致,要么都1.8要么都3.3。 abutter 发表于 2020-3-24 16:14
自告奋勇回答一下。
看看 spinalhdl 的环境搭建。我用 spinalhdl 来写了一些代码,整体感觉非常好,主要 ...
不建议让他折腾spinalhdl了,这货语法完全不一样,入门看似简单,但是想做深很难。我verilog用了8年才达到现在这程度,之前看了看spinalhdl就没太大兴趣了——貌似这个东西就是为了vexriscv开发的。而且低版本有bug,生成的rv32核点不亮。 谭春林 发表于 2020-3-24 15:23
楼主目前FPGA使用什么方式调试的,JTAG在线调试确实非常难用,另外之前看过楼主发的vexriscv的帖子,比较感 ...
当你深入到一定程度,就会发现JTAG的鸡肋了。用这货编译一遍时间要长一倍,而且必须得接下载线。而我手边没有一条下载线了——全坏了。
wye11083 发表于 2020-3-24 21:27
当你深入到一定程度,就会发现JTAG的鸡肋了。用这货编译一遍时间要长一倍,而且必须得接下载线。而我手边 ...
能不能大概描述一下用什么方式调试呢,目前我用的z7,ps部分还可以不用下载器,pl部分就不行了,没找到调试办法。 zxq6 发表于 2020-3-24 22:53
能不能大概描述一下用什么方式调试呢,目前我用的z7,ps部分还可以不用下载器,pl部分就不行了,没找到调 ...
直接把状态机导出来就好。务必做好前仿。 wye11083 发表于 2020-3-24 21:26
不建议让他折腾spinalhdl了,这货语法完全不一样,入门看似简单,但是想做深很难。我verilog用了8年才达 ...
缺点的确如此,毕竟是一个开源软件。
优点就是:1,更少的代码量,2. 友好的 IDE 环境,3,如果不是特别在意,有一些常用库。 abutter 发表于 2020-3-25 07:42
缺点的确如此,毕竟是一个开源软件。
优点就是:1,更少的代码量,2. 友好的 IDE 环境,3,如果不是特别 ...
代码量一点都不少。框架自己代码都一大堆了。比如要点个灯,我记得例程里面足足写了十几行代码。而且是扩展的java语法——如果对java非常熟可以考虑折腾。 wye11083 发表于 2020-3-25 09:55
代码量一点都不少。框架自己代码都一大堆了。比如要点个灯,我记得例程里面足足写了十几行代码。而且是扩 ...
要看工程的体量,对于小工程的确不会少写代码,对 systemverilog 也没有优势,工程量大的时候,而且组件需要经常重用的时候就省的太多了。 abutter 发表于 2020-3-25 11:47
要看工程的体量,对于小工程的确不会少写代码,对 systemverilog 也没有优势,工程量大的时候,而且组件 ...
但是verilog模块也一样复用啊。工程量大的话,我就会把层级弄得足够深,这样每层就很简单了。
对了,还有就是可靠性。verilog是经过几十年工业验证的,包括intel,amd都是写的verilog。 wye11083 发表于 2020-3-25 11:48
但是verilog模块也一样复用啊。工程量大的话,我就会把层级弄得足够深,这样每层就很简单了。
对了,还 ...
呵呵,个人以为,spinalhdl 和 chisel 不是要替代 verlog 的,而且用 spinalhdl 也还是需要 verilog 的基础。 wye11083 发表于 2020-3-24 21:23
随便接。要是怕不兼容就用x1模式(不需要特别生成mcs文件!直接在generate bitstream选项里勾上生成bin, ...
但是使用ID不同的flash,vivado会报错啊,没办法烧写 prow 发表于 2020-3-25 12:27
但是使用ID不同的flash,vivado会报错啊,没办法烧写
不要用vivado,直接烧spi。 wye11083 发表于 2020-3-25 12:38
不要用vivado,直接烧spi。
好吧,这也是种方法 外行来看看,热闹不热闹 支持!支持! S6锁相环有时锁不住,那个锁相环是通过哪组电源供电的?谢谢 sdram 发表于 2020-3-26 00:34
S6锁相环有时锁不住,那个锁相环是通过哪组电源供电的?谢谢
你把频率控制好。s6 pll只能锁400~1000mhz vco。 我是外行,也点进来看看热闹 想学FPGA不知道怎么开始好一点. 买个开发板, 按例程搞? jackman 发表于 2020-3-27 11:33
想学FPGA不知道怎么开始好一点. 买个开发板, 按例程搞?
推荐 http://zipcpu.com/tutorial/ 谢谢。 想请教一下做FPGA行情好吗 转行难度高吗 待遇方面如何 ghos 发表于 2020-3-31 16:32
想请教一下做FPGA行情好吗 转行难度高吗 待遇方面如何
这就不清楚了,但是如果积累不够,项目是做不出来的。fpga对整体素质要求很高。 外行人来看热闹 楼主说一下做这个待遇能到多少? wye11083 发表于 2020-3-24 23:00
直接把状态机导出来就好。务必做好前仿。
"状态机导出来",用逻辑分析仪看波形? lyl520719 发表于 2020-4-2 21:14
"状态机导出来",用逻辑分析仪看波形?
用任何方式看都可以,UART,USB,etc。逻辑分析仪是最笨的办法。 wye11083 发表于 2020-4-2 21:31
用任何方式看都可以,UART,USB,etc。逻辑分析仪是最笨的办法。
当设计数模混合处理系统,混合信号示波器是必要的,靠uart等根本不现实 NJ8888 发表于 2020-4-3 07:17
当设计数模混合处理系统,混合信号示波器是必要的,靠uart等根本不现实
除了射频,没有什么是uart搞不定的(当然c代码要在pc仿真好)。 有个c的小白问题想请教一下,c51中如何对io进行指针操作? ghostxdy 发表于 2020-4-8 08:25
有个c的小白问题想请教一下,c51中如何对io进行指针操作?
c51好像不行,那是sfr直接寻址。你可以考虑写个函数来调。 wye11083 发表于 2020-4-8 08:41
c51好像不行,那是sfr直接寻址。你可以考虑写个函数来调。
函数也不能操作可变的sfr啊。这种sfr设计完全是个怪胎。没法做个指向sfr的指针。 wye11083 发表于 2020-4-8 08:41
c51好像不行,那是sfr直接寻址。你可以考虑写个函数来调。
除非,你写一大堆函数,每个函数固定操作一个sfr,然后用指针指向这一大堆函数中的某一个。
这也很烦。 redroof 发表于 2020-4-9 21:12
除非,你写一大堆函数,每个函数固定操作一个sfr,然后用指针指向这一大堆函数中的某一个。
这也很烦。 ...
一个switch case就搞定了。 wye11083 发表于 2020-4-9 22:22
一个switch case就搞定了。
对,siwtch case每一项操作的sfr地址是常数就行。
大不了写128个case项,这样就能动态操作全部sfr了 一个有单数的数组,如何取中间值?是要排序才行吗?想知道有没更快的方法,如3个,5个 miscell 发表于 2020-4-11 08:46
一个有单数的数组,如何取中间值?是要排序才行吗?想知道有没更快的方法,如3个,5个 ...
中值滤波比较麻烦。3阶直接比,5阶数据可以(1)两两比较,做一个大表,(2)针对比值大表做一个查找表,(3)根据查找表选择数据。大概需要3072bit的ram。
3x3的有快速算法,先按行排序,再按列取最大,中间,最小,然后再取中间。 谢谢!我目前只想到排序 ghostxdy 发表于 2020-4-8 08:25
有个c的小白问题想请教一下,c51中如何对io进行指针操作?
好奇,为啥要把这些SFR全部映射一遍呢? canspider 发表于 2020-3-22 10:23
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. c ...
你这个简单啊,clkA将flagA脉冲展宽为2个脉冲宽度,然后经过clkB两级同步就行了啊,这样经过同步到clkB,延时最多就2个clkB时钟呗 canspider 发表于 2020-3-22 10:23
问一个跨时钟域的问题,下面这个跨时钟域的代码能不能可靠工作,将A时钟的flag同步到B时钟
前提条件:
1. c ...
最好另外开贴。
PS, 大赞楼主分享精神。。 wye11083 发表于 2020-4-2 21:31
用任何方式看都可以,UART,USB,etc。逻辑分析仪是最笨的办法。
小资源fpga,调试伤不起,项目开始阶段得用资源多很多的pintopin的先调试{:cry:} ⼃ 请教一下楼主,vivado调用modelsim仿真时,每次代码修改都要重新打开modelsim吗,有没有办法在modelsim中只编译修改的部分,然后直接重新开始仿真? xxdd 发表于 2020-6-11 12:44
请教一下楼主,vivado调用modelsim仿真时,每次代码修改都要重新打开modelsim吗,有没有办法在modelsim中只 ...
modelsim我也不会用它直接仿真。但是并不算太耗时啊。你要是折腾fpga把cpu换成最新的吧,r7 3700x起步,固态换nvne,能节省一大半编译时间。 wye11083 发表于 2020-6-11 13:01
modelsim我也不会用它直接仿真。但是并不算太耗时啊。你要是折腾fpga把cpu换成最新的吧,r7 3700x起步, ...
那你怎么仿真呢? xxdd 发表于 2020-6-11 15:57
那你怎么仿真呢?
ise直接调 xxdd 发表于 2020-6-11 12:44
请教一下楼主,vivado调用modelsim仿真时,每次代码修改都要重新打开modelsim吗,有没有办法在modelsim中只 ...
可以只运行modelsim,运行仿真,修改代码,确认代码没问题了,再启动vivado进行综合布局布线。 本帖最后由 neqee 于 2020-6-26 06:19 编辑
(6)批量产品总有异常。——做约束时把时钟加快10~30%,比如输入25M就约束到30M以上。因为FPGA也是有体质差异的,一般建议用最快的器件添加至少10%的时序余量生成bin,然后用普通的片子来跑。目前产品已用上千片,全部是-3生成bin,-2C片子日常用,各种环境下没发现一例时序问题。
~~~做时序约束时,选好器件之后,ise软件就已经考虑了器件个体差异,如果出问题,可能是你没有考虑晶振或时钟的抖动,所以不建议约束时把时钟加快来约束,而是约束时加上晶振或时钟的抖动。另外不理解你为什么在最快的片子上加大约束来生成bin再到普通的片子上跑?多此一举而且不严谨 neqee 发表于 2020-6-26 06:15
(6)批量产品总有异常。——做约束时把时钟加快10~30%,比如输入25M就约束到30M以上。因为FPGA也是有体质 ...
器件批量一致性是不可靠的。而且我们是应用在24x365场合的。加抖动解决不了所有问题,留出足够余量才能做到。 支持楼主,很想学习下xlinix方面的知识 顶个,楼主,理解深刻 支持楼主,只是为了这份热情舔砖···· 来看看。。。。。。。。。。。。 支持楼主,逛贴也学到不少知识 请教楼主一个c语言enum方面的问题。
我现在在用mdk编译环境,由于程序结构的要求,enum必须为两个字节。
我现在能想到的办法是再每个type enum结构体的最后定义个16bit的变量,这样编译器会自动将enum编译为2个字节。
我使用到的type enum比较多,每个都加很麻烦。
楼主有没有好的实现type enum 2字节的方法,或者退而求其次,使用一些技巧,
让每个type enum最后自己增加一个16bit变量。
下面是我现在的实现方式:
#define FORCE_ENUM_SIZE (0xFFFF)
typedef enum tagSPEED_CONTROL_SOURCE
{
SPEED_PANEL_SRC = 0, /*!< Speed given by the panel */
SPEED_AI_CTRL = 1, /*!< Speed given by the analog input */
SPEED_COM_CTRL = 2, /*!< Speed given by the modbus protocol */
SPEED_CAN_CTRL = 3, /*!< Speed given by the CAN(private protocol) */
ENUM_FORMAT_FILL= FORCE_ENUM_SIZE
} SPEED_CONTROL_SOURCE_T;
本帖最后由 wye11083 于 2020-7-4 11:47 编辑
simplorer 发表于 2020-7-4 11:29
请教楼主一个c语言enum方面的问题。
我现在在用mdk编译环境,由于程序结构的要求,enum必须为两个字节。
我 ...
你这问题有点{:sweat:} VC和gcc等默认是int型,会占4个字节。如果enum后面跟的是个uint16,则后面的变量一般会自动对齐到变量位宽,除非指定pack大小。
通常情况下C99和C++规范是支持typedef enum : uint16_t之类的声明,表示这个enum用某一类存储大小。但是不是所有编译器都能支持。所以你可以使用typedef来做操作:
typedef uint16_t SPEED_CONTROL_SOURCE;
则例化为:SPEED_CONTROL_SOURCE tSPEED_CONTROL_SOURCE,
赋值的时候用tSPEED_CONTROL_SOURCE = (SPEED_CONTROL_SOURCE)tagSPEED_CONTROL_SOURCE::SPEED_PANEL_SRC来操作(注意域声明符只有C99/C++才支持,可以去掉,但是C++11强类型enum必须使用域声明符),会麻烦一些,或者直接关掉编译器警告。
你先试一下enum : uint16_t声明,看看能不能编译过。不行的话就重新指定uint16_t 为enum名。据我的试验,VC6只能用后者,gcc都可以用。 wye11083 发表于 2020-7-4 11:46
你这问题有点 VC和gcc等默认是int型,会占4个字节。如果enum后面跟的是个uint16,则后面的变量 ...
我知道要求有些蛋疼{:lol:}
mdk中编译器会根据enum赋值的情况自动调整enum占用的字节数,编译选项可以指定为int型,这又与我的要求不符。
您提出的这种方式有些复杂,项目中不大合适。
我再研究一下,多谢回复。 simplorer 发表于 2020-7-4 12:02
我知道要求有些蛋疼
mdk中编译器会根据enum赋值的情况自动调整enum占用的字节数,编译选项可以指 ...
我与层主有同样的需求,
因此我的enum是作为一个modbus寄存器,而modbus寄存器必须是16-bit的。
我使用IAR for MSP430编译环境,也是采用层主相同的方法,因为也不支持enum xxx : uint16_t语法。 C++使用线程可以100ms执行一次吗?线程开启后,CPU使用率占到50%,有什么办法解决? zw_7627 发表于 2020-7-28 21:42
C++使用线程可以100ms执行一次吗?线程开启后,CPU使用率占到50%,有什么办法解决? ...
加个sleep就搞定了 为楼主的无私奉献点个赞! 为楼主的无私奉献点个赞!最近没有时间上网!来冒个泡!
页:
[1]
2