无法在这个位置找到: head2.htm
当前位置: 建站首页 > 新闻动态 > 公司新闻 >

FPGA完成串口与iic操纵器小结(3)

时间:2021-01-30 16:55来源:未知 作者:jianzhan 点击:
在分析了《深层次浅出轻松玩FPGA》的串口编码和IIC操纵器编码、xilinx官方网的xilinx的iic操纵器(参照书《FPGACPLD设计方案专用工具──Xilinx ISE应用详细说明》)、《片上系统软件设计方

在分析了《深层次浅出轻松玩FPGA》的串口编码和IIC操纵器编码、xilinx官方网的xilinx的iic操纵器(参照书《FPGACPLD设计方案专用工具──Xilinx ISE应用详细说明》)、《片上系统软件设计方案观念与源码剖析》一书里含有wishbone插口的iic操纵器后,文中试着对之上做一些小结,并剖析不一样的iic操纵器的完成差别。

上一讲,大家剖析了权利的iic操纵器的完成,这一讲将再次另2种含有系统总线插口和更充足完成iic协议书的事例。下一讲下谈一谈SOC构架中的wishbone系统总线构架及外设挂载,及其一些硬软件融合的最底层的物品,关键参照《自身动手能力写cpu》一书及有关的网页页面材料等,烦请希望。

 

2、IIC操纵器

2.2 xilinx的iic操纵器

该操纵器关键是参照《FPGACPLD设计方案专用工具──Xilinx ISE应用详细说明》第一0章和官方网编码,材料连接见文末得出的免费下载连接详细地址。

iic协议书的专业知识一样已不过多阐释,仅仅提几个方面上一讲中沒有或不用关心的地区:

1、I2C系统总线通讯时,起止位后的第一个字节数用以寻址方式,该字节数包括7比特的从机详细地址和1比特的读写能力标示比特, 一般来讲,从机详细地址由一个固定不动一部分和一个可程序编写一部分组成。

2、复合型文件格式中,这时服务器持续对从机开展数次读写能力实际操作,因而在造成起止位、收取和发送数据信息、造成终止位的全部传送全过程中,数据信息的方位产生数次更改,传送更改方位时,服务器会再次传出反复起止位和从机详细地址(上一讲中为何读的步骤要繁杂些的缘故)。

3、I2C系统总线在一个時刻只有有一个服务器,当I2C系统总线同时有2个或大量的器件想变成服务器时,就必须开展诉讼,数字时钟同歩全过程的目地是为诉讼出示一个明确的数字时钟。SCL 线低电平常间在于低电平常间最多的服务器,高电平常间在于高电平常间最少的服务器。服务器总是在 I2C 系统总线空余时造成起止位,可是在起止位的维持時间 tHD;STA内将会有2个或之上的服务器造成起止位,最后系统总线上的起止位由他们中间的线与计算决策,诉讼在接着 SDA 网上推送的比特中开展。假如一个服务器具备从机作用,那麼当它丧失诉讼时,务必马上转换到从机情况,由于它将会已经被别的服务器寻址方式。

4、如图所示

说完了这种有关iic协议书的点再次下边的一部分.

I2C系统总线操纵器的关键功效是出示UC(Microcontroller,微操纵器或片式机)和I2C系统总线中间的插口,为二者中间的通讯出示物理学层协议书的变换。这种I2C协议书的器件,也不能立即和片式机外场系统总线相接,这种器件能够挂在一套I2C系统总线上,再根据I2C系统总线操纵器和 C连起來,如图所示所显示。在SOC设计方案中相近的协议书变换控制模块用到十分多。


I2C 系统总线操纵器包括2个关键一部分,一是微操纵器插口,通称 C插口,二是 I2C Master/Slave 插口,即I2C插口,根据这2个插口,I2C系统总线操纵器完成了微操纵器外场系统总线和 I2C 系统总线的联接。那麼这儿的微操纵器插口是哪样操纵器?是不是是哪样系统总线协议书,依据readme文档能够发觉原先是 MC68307片式机,是一款集成化的多系统总线解决器。

讲明楚了基本原理,大家看来看实际设计方案:

This zip file contains the following folders:
-- Verilog Source Files:
i2c_blk_ver.v - top level file
i2c_control_blk_ver.v - control function for the I2C master/slave
shift8_blk_ver.v - shift register
uc_interface_blk_ver.v - uC interface function for an 8-bit 68000-like uC
t4_blk_ver.v - 4-bit up counter

能看到五个文档。uc_interface_blk_ver.v 完成了一些寄放器及其对下一层控制模块的操纵数据信号,shift8_blk_ver.v是串行通信收取和发送,t4_blk_ver.v是4位电子计数器,i2c_blk_ver.v 是高层,例化了uc_interface_blk_ver和i2c_control_blk_ver。i2c_control_blk_ver则完成了诉讼,start等收取和发送步骤情况机等。总体构架以下图:


全部构思還是很清晰的。插口处关键是一些寄放器,寄放器的数据信号到iic中控台制最底层的运行。

C 插口关键包括情况寄放器MBSR、操纵寄放器MBCR、详细地址寄放器MADR、数据信息寄放器MBDR 和详细地址译码/系统总线插口控制模块。情况寄放器标示I2C系统总线操纵器确当前情况,如传输是不是进行、系统总线是不是忙等信息内容,操纵寄放器是 C操纵I2C系统总线操纵器的关键方式,根据置0/置1能够进行I2C系统总线操纵器使能、终断使能、Master/Slave方式挑选、造成起止位等实际操作。详细地址寄放器储存着I2C系统总线操纵器做为Slave时的详细地址。数据信息寄放器用以储存接受或者待推送的数据信息。

下边剖析源码,因为源码诸多,只有摘出一部分,整理关键构思和关键数据信号线,大伙儿能够免费下载我注解的编码。

i2c_blk_ver.v 高层文档:

 

module i2c_blk (sda, scl, addr_bus, data_bus, as, ds, r_w, dtack, irq, mcf, clk,
 reset);
 parameter I2C_ADDRESS = 16 b0000;
 // I2C bus signals
 inout sda;
 inout scl;
 // uC interface signals
 input [23:0] addr_bus;
 inout [7:0] data_bus;
 input as; // address strobe, active low
 input ds; // data strobe, active low
 input r_w; // read/write
 output dtack; // data transfer acknowledge 给解决器的,表明数据信息是不是提前准备好啦
 output irq; // interrupt request
 inout mcf; // temporary output for testing 给解决器,表明传送是不是完毕
 // clock and reset
 input clk;
 input reset;
这一是高层的键入輸出,并不是甚么独特的系统总线构造,较为好了解,pdf中有详尽的汉语表述每一个数据信号的含意。

 

接下去是一些wire型,具体上便是这些寄放器中有含意的每一名,即各种各样操纵数据信号线,有利于例化的 i2c_control I2C_CTRL与 uC_interface #(I2C_ADDRESS) uC_CTRL控制模块间的插口互连。

接下去从高层向下,uC_interface控制模块:

 

 // Internal I2C Bus Registers
 // Address Register (Contains slave address)
 inout [7:0] madr;
 // Control Register 
 inout men; // I2C Enable bit
 inout mien; // interrupt enable
 inout msta; // Master/Slave bit
 inout mtx; // Master read/write
 inout txak; // acknowledge bit
 inout rsta; // repeated start
 output mbcr_wr; // indicates that the control reg has been written
 // Status Register
 input mcf; // end of data transfer
 input maas; // addressed as slave
 input mbb; // bus busy
 input mal; // arbitration lost
 input srw; // slave read/write
 input mif; // interrupt pending
 input rxak; // received acknowledge
 output mal_bit_reset; // indicates that the MAL bit should be reset
 output mif_bit_reset; // indicates that the MIF bit should be reset
 input msta_rst; // resets the MSTA bit if arbitration is lost
 // Data Register
 inout [7:0] mbdr_micro;
 input [7:0] mbdr_i2c;
 output mbdr_read;
能看到具体上这一控制模块的许多輸出数据信号便是这种寄放器的位,操纵更最底层的怎样完成。能够参照pdf查寻实际的寄放器(八位)的某一名是啥含意。例如情况寄放器全是input型,由于他关键意见反馈给uc当今情况,错误最底层的情况机操纵。数据信息寄放器中mbdr_micro是inout型,表明是uc系统总线那一端的,mbdr_i2c是input型,表明是以iic接受到的那一端的。

 

 

 // State Machine Signals
 `define STATE_TYPE_IDLE 2 d0
 `define STATE_TYPE_ADDR 2 d1
 `define STATE_TYPE_DATA_TRS 2 d2
 `define STATE_TYPE_ASSERT_DTACK 2 d3
 // Constant Declarations
 parameter RESET_ACTIVE = 1 
 // Base Address for I2C Module (addr_bus[23:8])
 parameter MBASE = UC_ADDRESS;
 // Register Addresses (5 Total):
 // Address Register (MBASE + 8Dh)
 `define MADR_ADDR 8 b
 // Control Register (MBASE + 91h)
 `define MBCR_ADDR 8 b
 // Status Register (MBASE + 93h)
 `define MBSR_ADDR 8 b
 // Data I/O Register (MBASE + 95h)
 `define MBDR_ADDR 8 b
uc一部分的情况机, C和 I2C系统总线操纵器中间的互动要采用 I2C系统总线操纵器內部的寄放器,寄放器的详细地址是24位的,在其中高16比特为I2C系统总线操纵器的基址,低八位用以差别不一样寄放器。接下去界定了10好几个wire型的正中间自变量,这种事情况机中造成的控制操纵情况机的。因为wire型自变量不可以再always中取值,因此后边又用这类方法界定一个相对的reg型自变量。

 

 

// Address match
 wire address_match;
 reg visual_0_address_match;
 assign address_match = visual_0_address_match;

再加了visual_0的作为前缀,那样做的益处?我觉得一是数字时钟同歩,reg数据信号由clock打一拍同歩,也有利于除去毛刺,由于assign数据信号立即相接,稍有颤动就会有毛刺,reg数据信号打拍子能够防止这类难题。二是能够一些数据信号做相近案子检验一样的消抖,举例说明:

 

51 input as; 
221 begin
      visual_0_as_int //这儿又有一个数字时钟的延迟时间一拍
      visual_0_as_int_d1 //历经一个数字时钟的延迟时间一拍,以便检验到恰当的降低沿而沒有颤动的影响
      visual_0_ds_int = ds;
      if ((!as as_int_d1 addr_bus[23:8] == MBASE)) //低八位是差别哪个寄放器
        visual_0_address_match = 1 
      else
        visual_0_address_match = 1 
    end
135   reg visual_0_as_int;
  assign as_int = visual_0_as_int;
138  reg visual_0_as_int_d1;
  assign as_int_d1 = visual_0_as_int_d1;

 

 

能看见从221行刚开始,获得as键入,历经好多个正中间自变量的资金周转,在if中通快递过!as as_int_d1来做到相近案子去抖的实际效果。此外一些自变量是对外开放輸出的,也需变为reg型。 这一部分的具体工作中步骤如图所示: 依据图中的步骤:第一个always块, // Process:SYNCH_INPUTS 分辨as是不是有合理的降低沿,随后系统总线的高16位是不是是恰当的大家这一iic机器设备在整个cpu外设系统总线上的详细地址。为真,则visual_0_address_match数据信号为1,起止相匹配为address_match,这一变成事后的操纵分辨,情况机的关键根据。接下去是uc控制模块的主情况机:
// Wait for falling edge of as if (as_int_d1 !as) //as表明键入详细地址合理数据信号,低合理,这儿的as_int_d1具体上是一个相近功能键去抖的实际效果,延迟时间了2拍,跟踪数据信号便可以发觉 // falling edge of AS visual_0_next_state = `STATE_TYPE_ADDR; `STATE_TYPE_ADDR : // ---------- ADDR State (01) -------------- // Check that this module is being address if (address_match) //225行由键入的bus决策,也是打过一拍,保证数字时钟同歩 // Wait for ds to be asserted, active low if (!ds_int) //由键入的ds决策 visual_0_next_state = `STATE_TYPE_DATA_TRS; else visual_0_next_state = `STATE_TYPE_ADDR; else // this module is not being addressed visual_0_next_state = `STATE_TYPE_IDLE; `STATE_TYPE_DATA_TRS : begin // -------- DATA_TRS State (10) ------------ // Read or write from enabled register visual_0_next_state = `STATE_TYPE_ASSERT_DTACK; //衔接态,以便得出oe的数据信号,內部操纵线 visual_0_dtack_oe = 1 //前边被置为0了的 `STATE_TYPE_ASSERT_DTACK : begin // ------ ASSERT_DTACK State (11) ---------- // Assert dtack to uProcessor = 1 //前边被置为1了的 visual_0_dtack_oe = 1 // Wait for rising edge of as and ds if ((!as_int_d1) (!ds_int)) //锁存实际操作,直到DTACK合理,乃至能够剖析锁存了好多个数字时钟? visual_0_next_state = `STATE_TYPE_ASSERT_DTACK; else if ((as_int_d1) (ds_int)) visual_0_next_state = `STATE_TYPE_IDLE; endcase end
 /pre pre code_snippet_id= 1669606 snippet_file_name= blog__10_3192142 name= code >
因此sda具体上经过sda_out_reg,visual_0_sda_out_reg,sda_out,visual_0_sda_out操纵,即下面的图情况机中的visual_0_sda_out具体意味着了sda,一样scl也一样。

 

 

 

该情况机還是较为清楚的。

next_state数据信号根据好多个正中间自变量的资金周转,還是赋给了prs_state完成情况自动跳转,是一个情况机转变的正中间数据信号,转换成dtack_int变为dtack数据信号,dtack_oe决策是不是輸出dtack数据信号。与visual_0_dtack_oe这儿每一次被重设。最先是idle情况,检验到合理的as数据信号。进到addr情况,检测详细地址是不是配对,数据信息是不是来啦,来啦就进到trs,不然再次等。Trs情况是衔接态,以便得出visual_0_dtack_oe数据信号,与visual_0_dtack_oe被设定说明数据信息早已放进uc与iic的系统总线上。等候ds无效,返回idle情况。那麼大量的全过程具体上是依据情况机的正中间自变量,在其他always块中完成的,能够剖析下二者间的相对性時间关联。

接下去的always完成visual_0_prs_state = next_state;驱动器情况更替。接下去是分辨哪个24位的详细地址是投射到哪个寄放器,每一个寄放器得出一个数据信号线,若选定则为1,驱动器下一个always块中的数据信息实际传入哪一个寄放器中。下一个always块中,完成了对不一样情况下的一些数据信号量的设定,而沒有在以前的情况机中完成。每根数据信号线的含意能够查pdf。mbcr_wr意味着了mbcr是被读过還是被写了。实际上Status Register是写保护的,写得话会造成复位。别的好多个寄放器相近,较为好了解,了解有关数据信息寄放器的数据信息流入。这儿面的八位数据信息全是一个clk进行,留意与上边的dtack的含意在时钟频率上是不是矛盾,由于dtack是定性分析数据信息早已提前准备好

最终便是好多个assign句子,依据上边的数据信号解决是不是有终断,dtack,决策是传送进去某一数据信号還是得出某一数据信号。

总体来说构造较为清楚,控制模块化较为清楚。情况机选用了按段式的书写。

i2c_control_blk_ver.v文档

它的插口关键是uc插口文档中的寄放器的数据信号线。各自界定了数据信息步骤的情况机和scl数据信号的情况机。接下去是一堆的正中间数据信号的界定和相近的再加visual_0后的reg解决。

t4控制模块用于统计分析bit数。它是一个不到顶的4位电子计数器,可是能够键入一个4十位数据来改动计标值。接下去再例化一个用以clk的计数,做到分频的实际效果。接下去是例化了两个SHIFT8_blk,改控制模块能够load和輸出一个八位数,也可串行通信接受和推送一个一名数。例化了两个第一个是iic端的,一个是uc端的。接下去是系统总线诉讼,关键是msta_rst与arb_lost位。当主导机,scl_in为scl的取样。尚需关键剖析?

接下去是scl数据信号的一个情况机:

I2C 系统总线操纵器复位后处在IDLE 情况,不驱动器SCL 和SDA,这时I2C 系统总线上的别的Master 能够操纵SCL 和SDA。假如I2C 系统总线操纵器处在Master 方式,并且I2C 系统总线处在空余情况, C 根据置位MBCR 寄放器的MSTA 比特使GEN_START 数据信号为高,那麼情况机进到START 情况。

在 START 情况,SCL 维持为高电平,同时驱动器SDA 数据信号降低,进而在I2C 系统总线上造成一个起止位。系统软件数字时钟电子计数器起动计数,直至考虑I2C 标准规定的起止标准维持時间( 4ns),情况机进到SCL_LOW_EDGE情况。

在 SCL_LOW_EDGE 情况,情况机使SCL 造成一个降低沿并复位系统软件数字时钟电子计数器,随后在下一个数字时钟沿来临时进到SCL_LOW 情况。

在SCL_LOW 情况,SCL 维持为低,同时开展计数,直至造成要求的SCL 低电平常间( 4.7ns)。造成要求的 SCL 低电平常间后,假如丧失诉讼,那麼进行一个字节数的传送以后情况机返回IDLE 情况,不然情况机进到SCL_HI_EDGE 情况。

在 SCL_HI_EDGE 情况中,情况机释放出来SCL 线,期待造成SCL 升高沿,可是SCL 线将会被别的Master 置低,因而情况机其实不立即迁移到SCL_HI 情况,只是等候SCL 数据信号变高以后才进到SCL_HI 情况。

进到 SCL_HI 情况后,系统软件数字时钟电子计数器开展计数,以造成I2C标准规定的SCL高电平常间( 4.0ns),假如检验到反复起止标准或终止标准,情况机将在1/2SCL 高电平常间以后迁移到 START情况再次刚开始,或迁移到 IDLE情况,不然造成规定的 SCL高电平常间后情况机进到 SCL_LOW_EDGE情况,再次造成下一个 SCL单脉冲。

接下去是情况机的驱动器visual_0_scl_state =next_scl_state;接下去是visual_0_sda_in这种数据信号,这一解决,visual_0_scl_in其实不是由scl扇出,只是是对这一数据信号的一个取样。也是上边大家分辨scl是不是被他人拉升的根据。

后边是start和stop数据信号造成和检验的一个数据信号线的解决,也包含主从关系机的。在出来便是主情况机了:

 

复位后,情况机在 IDLE 情况,当检验到 START 数据信号时,迁移到HEADER 情况。START数据信号由 I2C 系统总线上的起止位开启,开启这一起止位的 Master 能够是 I2C 系统总线操纵器自身或别的的 I2C 系统总线服务器。

在 HEADER 情况,假如 I2C 系统总线操纵器处在 Master 方式,它会把 MBDR 中的数据信息做为HEADER 推送到 I2C 系统总线上,以寻址方式特殊的 Slave。无论 I2C 系统总线操纵器处在 Master 還是Slave方式,在HEADER 情况时,I2C 系统总线操纵器都是接受系统总线上的数据信息,储存到 I2C Header Shift Register 中,接到8 个比特后,情况机迁移至 ACK_HEADER 情况。

在 ACK_HEADER 情况,假如 I2C 系统总线操纵器处在 Master 方式,它会取样 SDA 线,以判 断 所 寻 址 的Slave 是 否 响 应 。 如 果 没 有 响 应 , 状 态 机 转 移 到STOP 状 态 , 通 知SCL/START/STOPGenerator 造成STOP 数据信号,中断传送。假如 Slave 造成了响应比特,情况机依据 Header 的最少位分辨进行的是推送实际操作還是接受实际操作,随后迁移到 RCV_DATA 情况或 XMIT_DATA 情况。假如I2C 操纵器处在Slave 方式,电源电路会持续较为 Header Shift Register 的內容和 I2C 系统总线操纵器详细地址寄放器 MADR 的內容是不是相同,假如相同,表明本I2C系统总线操纵器被别的 Master 寻址方式,因此 I2C 系统总线操纵器马上变换到 Slave 方式,并把情况寄放器 MBSR 的 MAAS 比特置 1,标示 I2C 系统总线操纵器被别的 Master 寻址方式。同时MBSR 的SRW 比特纪录Header 的最少位,便于 C 分辨Master 恳求的是读還是写实际操作。

在 RCV_DATA 情况, I2C 系统总线操纵器处在接受情况(即服务器接受情况或从机接受情况),情况机读入 I2C 系统总线上的数据信息并储存到移位寄放器中,念完 8 比特的数据信息后入入ACK_DATA 情况,传出响应比特。响应比特的赋值依据 I2C 系统总线操纵器是 Master 還是 Slave有一定的不一样,当I2C 系统总线操纵器是Slave 时,响应比特应是 0,表明一切正常接受;当 I2C 系统总线操纵器是Master 时,假如早已接到了充足的数据信息,响应比特要设定为 1,通告 Slave 终止推送,不然响应比特应是 0,通告Slave 再次推送。响应比特的值由 MBCR 的 TXAK 位决策, C 能够在适度的情况下载入。检验到 I2C 系统总线上的终止位时,情况机迁移到 STOP 情况。

在 XMIT_DATA 情况, I2C 系统总线操纵器处在推送情况(即服务器推送,或从机推送情况),情况机把数据信息寄放器 MBDR 的数据信息移位輸出到 SDA 网上,推送 8 比特后入入GET_ACK_DATA 情况,接到响应比特后,情况机返回 XMIT_DATA 情况,再次推送下一个字节数。假如沒有接到响应比特,表明推送完毕或错误,情况机转到 STOP 情况。

在 STOP 情况,假如处在 Master 方式,主情况机通告 SCL/START/STOP Generator 造成终止位。下一个数字时钟沿来临时,情况机全自动迁移到 IDLE 情况。

后边便是start stop检验控制模块,也有一些寄放器数据信号线的造成。

能看到这类设计方案构思是层次次控制模块的。uc那一端是依据数据信息互动的步骤,读写能力操纵寄放器,随后寄放器的数据信号輸出给最底层去完成各种各样操纵。而最底层也是系统分区块,两个情况机,一个完成scl数据信号的置高和置低,期内有诉讼检验,主从关系机的转换,完毕起止位的分辨这些,另外一个完成iic与外界机器设备通讯时的互动步骤,如先寻址方式,等待确定,重续写这类的。正中间有许多数据信号线去同歩操纵其他always块或是被其他数据信号线操纵。也有起止,完毕检验的always块,对于每个寄放器的取值的专业的always块这些。

2.3 OR1200的iic操纵器

它是一个带wishbone系统总线构造的iic插口,因此依照高层框图来画键入輸出数据信号,能够发觉键入一段都是wb插口的数据信号线,輸出便是2根scl和sda,可是留意的是这儿其实不是scl与sda:

 

 // I2C signals
 // i2c clock line
 input scl_pad_i; // SCL-line input //?并不是inout构造?
 output scl_pad_o; // SCL-line output (always 1 b0)
 output scl_padoen_o; // SCL-line output enable (active low)
 // i2c data line
 input sda_pad_i; // SDA-line input
 output sda_pad_o; // SDA-line output (always 1 b0)
 output sda_padoen_o; // SDA-line output enable (active low)
具体上大家必须在这里个三态门加上高些的设计方案层级:

 

 

 assign scl = scl_padoen_o ? 1 bz : scl_pad_o;
 assign sda = sda_padoen_o ? 1 bz : sda_pad_o;
 assign scl_pad_i = scl;
 assign sda_pad_i = sda;

 

界定了不一样的寄放器,包含数字时钟分频的寄放器,适用多线程复位。wb_adr_i数据信号决策实际对哪个寄放器实际操作。随后是寄放器的值的改动。这一top控制模块中沒有界定情况机,是因为wb插口的缘故,不愿2.2的完成方法是有那么一个步骤的。而这儿由于是有统一的wb插口的缘故,因此简易的多。此外wb插口的许多数据信号线能够依据自身的要求去改动其作用含意的。

可是这一只是是服务器,并沒有完成详细的iic插口,沒有诉讼等。

top中例化了i2c_master_byte_ctrl,i2c_master_byte_ctrl中例化了更低层级的i2c_master_bit_ctrl。i2c_master_byte_ctrl中也是一个主情况机保持着start、发、收、ack等互动步骤,i2c_master_bit_ctrl将start、stop、rd、wr都分为了好几个,保持着一个巨大的情况机 ,里边是对sda,scl数据信号线的高矮的操纵。也是控制模块化的较为清楚,也不细心讲了

说几个方面体会吧:

1、针对这类较为繁杂的设计方案,具体上控制模块的区划十分关键,理清晰每个控制模块间的互连,每根数据信号线的含意。例如这儿uc那一端的按段式情况机,与寄放器的设计方案等。

2、该例程较为繁杂,十分复杂,有许多的数据信号线。各数据信号线中间的联接较为复杂,非常是也有诉讼这一块,不太好了解。全部针对这类繁杂的设计方案,沒有详尽的注解难以了解。此外对于iic的协议书,大伙儿的了解和设计方案构思不一样,能够有许多种完成方法,包含一些本人的书写习惯性,如针对情况,对正中间数据信号的界定与解决等,都是有差别

3、许多的小窍门,针对数据信号的取名,打节拍的解决这些

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: ajaxfeedback.htm
栏目列表
推荐内容


扫描二维码分享到微信