当前位置: 首页 > news >正文

计算机网络网站建设的实训总结个人网站注册

计算机网络网站建设的实训总结,个人网站注册,卖灯杆的做网站好,广告游戏目录 Verilog HDL语言基础知识 6.1.2 Verilog HDL模块的结构 6.1.3 逻辑功能定义 6.2.1 常量 6.3 运算符及表达式 6.4.2 条件语句 Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例6.1 一个8位全加器的 Verilog HDL源代码 module adder8(cout,sum,ina,…目录 Verilog HDL语言基础知识  6.1.2  Verilog HDL模块的结构 6.1.3 逻辑功能定义 6.2.1  常量 6.3 运算符及表达式 6.4.2 条件语句 Verilog HDL语言基础知识  先来看两个Verilog HDL程序。 例6.1    一个8位全加器的 Verilog HDL源代码 module adder8(cout,sum,ina,inb,cin);output[7:0] sum;output cout;input[7:0] ina,inb;input cin;assign {cout,sum}inainbcin; //全加endmodule 【例6.2】一个8位计数器的Verilog HDL源代码 module counter8(out,cout,data,load,cin,clk);output[7:0] out;output cout;input[7:0] data;input load,cin,clk;reg[7:0] out;always (posedge clk)beginif(load)outdata;elseoutoutcin;endassign coutoutcin;endmodule 从上面的例子可以看出: ① Verilog HDL程序是由模块构成的。每个模块的内容都是嵌在module 和endmodule 两个语句之间每个模块实现特定的功能模块是可以进行层次嵌套的。 ②每个模块首先要进行端口定义并说明输入(input)和输出(output)然后对模块的功能进行逻辑描述。 ③Verilog HDL程序的书写格式自由一行可以写几个语句一个语句也可以分多行写。 ④ 除了endmodule语句外每个语句的最后必须有分号。 ⑤ 可以用/*……*/和//…… 对Verilog HDL程序的任何部分作注释。 6.1.2  Verilog HDL模块的结构 Verilog HDL的基本设计单元是模块(block)。一个模块是由两部分组成的一部分描述接口;另一部分描述逻辑功能即定义输入是如何影响输出的。下面举例说明图6.1示出了一个与-或-非门电路。 图6.1与-或-非电路 该电路表示的逻辑函数可以写为: F AB CD                                     用Verlog HDL语言对该电路进行描述如下 【例6.3】与-或-非门电路 module AOI(ABCDF);      // 模块名为AOI(端口列表ABCDF)input ABCD;             // 定义模块的输入端口ABCDoutput F;                       // 定义模块的输出端口Fassign F ~((AB)︱(CD));       // 模块内的逻辑描述endmodule 从上面的例子可知电路图符号的引脚也就是程序模块的端口在程序模块内描述了电路图符号所实现的逻辑功能。在上面的Verilog HDL设计中模块中的第2、第3行说明接口的信号流向第4行说明了模块的逻辑功能。 Verilog HDL结构完全嵌在module和endmodule声明语句之间每个Verilog程序包括4个主要部分: 端口定义I/0说明信号类型声明和功能描述。 1. 模块的端口定义 模块的端口声明了模块的输人和输出口。其格式如下 module 模块名(口1口2口3口4……) 2模块内容 模块内容包括 I/O说明信号类型声明和功能定义。 (1) I/O说明的格式如下: 输人口: input端口名1端口名2……端口名N; 输出口: output端口名l端口名2……端口名N; I/O说明也可以写在端口声明语句里。其格式如下: module module_name(input portlinput port2…output portloutput port2…); (2)信号类型声明: 它是说明逻辑描述中所用信号的数据类型及函数声明。如 reg[7:0] out;       //定义out的数据类型为reg(寄存器)型 对于端口信号的缺省定义类型为wire(连线)型。 6.1.3 逻辑功能定义 模块中最重要的部分是逻辑功能定义。有3种方法可在模块中描述逻辑。 用assign语句 如assign F ~((AB)|(CD)); 这种方法的句法很简单只须写一个“assign”后面再加一个方程式即可。 assign语句一般适合于对组合逻辑进行赋值称为连续赋值方式。 用元件例化instantiate 如: and myand3(f, abc); 这个语句利用Verilog HDL提供的与门库定义了一个三输人的与门。采用实例元件的方法同在电路图输入方式下调入库元件一样键入元件的名字和引脚的名字即可。要求每个实例元件的名字必须是唯一的。 用always块语句 在【例6.2】的计数器模块中 always (posedge clk) //每当时钟上升沿到来时执行一遍块内语句beginif(load)outdata;elseoutoutcin;end always块可用于产生各种逻辑常用于描述时序逻辑。这个例子用always块生成了一个带有同步置数的计数器。always块可用很多种描述手段来表达逻辑如此例中就用了if-else语句来表达逻辑关系。 综上所述可给出Verilog HDL模块的模板如下: Verilog HDL模块的模板(仅考虑用于逻辑综合的部分不考虑用于逻辑模拟的部分)。 module 顶层模块名(输入输出端口列表)output输出端口列表; //输出端口声明input输入端口列表; //输入端口声明/* 定义数据信号的类型函数声明用关键字wireregfuntion等定义 *///使用assign语句定义逻辑功能wire 结果信号名;assign 结果信号名 表达式;//使用 always块描述逻辑功能always (敏感信号表达式)begin// 过程赋值// if语句// case语句// whilefor,repeat循环语句// function调用end// 模块元件例化 module_name模块名instance_name例化元件名(port_list端口列表);// 门元件例化gate_type_keyword instance_name例化元件名  (port_list);endmodule 6.2 数据类型及常量、变量 Verilog HDL中共有19种数据类型。数据类型是用来表示数字电路中的数据存储和传送单元的。在此介绍4个最基本的数据类型:  integer型、parameter型、reg型和wire型。 Verilog HDL中也有常量和变量之分他们分属以上这些类型。 6.2.1  常量 在程序运行过程中其值不能被改变的量称为常量。 1. 数字 (1)整数 在Verilog HDL中整数型常量(即整常数)有以下4种进制表示形式: ◇二进制整数(b或B); ◇十进制整数(d或D); ◇十六进制整数(h或H); ◇八进制整数(o或O)。 完整的数字表达式为: 位宽进制 数字 位宽为对应二迸制数的宽度如: 8b11000101    //位宽为8位的二进制数11000101 8hc5          //位宽为8位的十六进制数c5; 十进制的数可以缺省位宽和进制说明如: 197            //代表十进制数197 (2)x和z值 x表示不定值z表示高阻值。每个字符代表的宽度取决于所用的进制例如: 8b1001xxxx;   等价于8h9x; 8b1010zzzz;   等价于8haz; 当常量不说明位数时默认值为32位。此外“?”是高阻态的z的另一种表示符号。 2常量 在Verilog HDL中用parameter来定义常量即用parameter来定义一个标志符代表一个常量称为符号常量。其定义格式如下: parameter 参数名1表达式参数名2表达式参数名3表达式……; 例如: parameter sel8code8ha3; //分别定义参数sel为常数8(十进制)参数code为常数a3(十六进制) 6.2.2 变量 变量是在程序运行过程中其值可以改变的量。变量分为两种:一种为网络型(nets type),另一种为寄存器型(register type)。 1. nets型变量 wire nets型变量指输出始终根据输入的变化而更新其值的变量它一般指的是硬件电路中的各种物理连接。Verilog HDL中提供了多种nets型变量具体见表6.1。 表6.1  常用的nets型变量及说明 类型 功能说明 wire,tri 连线类型wire和tri功能完全相同 wor,trior 具有线或特性的连线两者功能一致 wand,triand 具有线与特性的连线两者功能一致 tri1,tri0 分别为上拉电阻和下拉电阻 supply1,supply0 分别为电源逻辑1和地逻辑0 这里着重介绍wire型变量。wire是一种常用的nets型变量wire型数据常用来表示assign语句赋值的组合逻辑信号。Verilog HDL模块中的输入/输出信号类型缺省时自动定义为wire型。Wire型信号可以用作任何方程式的输入也可以用作assign语句和实例元件的输出,其取值为0,1,x,z。 wire型变量格式如下 ⑴定义宽度为1位的变量 wire 数据名1数据名2……数据名n 例如 wire a,b; //定义了两个宽度为1位wire型变量a,b ⑵定义宽度位n位的向量vectors wire[n-1:0] 数据名1数据名2……数据名n; 或 wire[n:1] 数据名1数据名2……数据名n; 例如 wire[7:0] databus; //定义一个8位wire型向量 或 wire[8:1] databus; wire型向量可按以下方式使用 wire[7:0] in,out; //定义两个8位wire型向量in,out assign outin; 若只使用其中某几位可直接指明注意宽度要一致。如 wire[7:0] out; wire[3:0] in; assign out[5:2]in; //out向量的第二位到第5位与in向量相等 2. register型变量 reg register型变量对应的是具有状态保持作用的电路元件如触发器、寄存器等。register型变量与nets变量的根本区别在于register需要被明确地赋值并在被重新赋值前一直保持原值。在设计中必须将寄存器型变量放在过程块语句(如initialalways)中通过过程赋值语句赋值。另外在always过程块内被赋值的每一个信号都必须定义成寄存器型。 Verilog HDL中有4种寄存器型变量见表6.2 表6.2常用的register型变量及说明 类型 功能说明 reg 常用的寄存器型变量 integer 32位带符号整数型变量 real 64位带符号整数型变量 time 无符号时间变量 Integer、real、time等3种寄存器型变量都是纯数学的抽象描述不对应任何具体的硬件电路。reg型变量是最常用的一种寄存器型变量下面介绍reg型变量。 reg型变量格式如下 reg 数据名1数据名2……数据名n; 例如: reg ab;       //定义了两个宽度为1位的reg型变量a,b 若定义一个向量则按以下格式 reg[n-l:0]数据名1数据名2……数据名n 或 reg[n:l]数据名1数据名2……数据名n 它们定义了数据的宽度为n位。如下面的语句定义了8位宽的数据 例如 reg[7:0] data;              //定义data为8位宽的reg型向量 或 reg[8:1] data; 3. 数组 若干个相同宽度的向量构成数组reg型数组变量即为memory型变量即可定义存储器型数据。如: reg[7:0] mymem[l023:0]; 上面的语句定义了一个1024个字节、每个字节宽度为8位的存储器。通常存储器采用如下方式定义 parameter wordwidth8memsize l024; reg[wordwidth-l:0] mymem[memsize-l:0]; 上面的语句定义了一个宽度为8位、1024个存储单元的存储器该存储器的名字是mymem若对该存储器中的某一单元赋值的话采用如下方式: mymem[8]1;      //mymem存储器中的第8个单元赋值为1 注意: Verilog HDL中的变量名、参数名等标记符是对大小写字母敏感的。 6.3 运算符及表达式 6.3.1 运算符 1. 算术运算符 加 - 减 * 乘 / 除 % 求模 算术运算符都是双目运算符。 2. 逻辑运算符 逻辑与 ||            逻辑或 !             逻辑非 3. 位运算符 位运算是将两个操作数按对应位进行逻辑运算。位运算符包括 -             按位取反 按位与 |             按位或 ^             按位异或 ^~~ ^       按位同或 当两个不同长度的数据进行位运算时会自动地将两个操作数按右端对齐位数少的操作数会在高位用0补齐。 4. 关系运算符 小于 小于或等于 大于 大于或等于 在进行关系运算时如果声明的关系是假则返问值是0;如果声明的关系是真则返回值是1;如果某个操作数的值不定则其结果是模糊的返回值是不定值。 5. 等式运算符 等于 不等于 全等 不全等 这4种运算符都是双目运算符得到的结果是1位的逻辑值。如果得到1说明声明的关系为真;如得到0说明声明的关系为假。 相等运算符( )和全等运算符( )的区别是参与比较的两个操作数必须逐位相等其相等比较的结果才为l如果某些位是不定态或高阻值其相等比较得到的结果就会是不定值。而全等比较( )是对这些不定态或高阻值的位也进行比较两个操作数必须完全一致其结果才为1。否则结果是0。 如:设寄存器变量a5b110x01,b511x01,则“a b”得到的结果为不定值x而“a b”得到的结果为l。 6. 缩减运算符(单目运算) 与 ~ 与非 | 或 ~ | 或非 ^ 异或 ^ ~ ,~ ^ 同或 缩减运算符与位运算符的逻辑运算法则一样但缩减运算是对单个操作数进行与、或、非递推运算的。如: reg[3:0] a ba; //等效于b((a[0]a[1])a[2])a[3];   例:若A5b11001,则 A0 //只有A的各位都为1时其与缩减运算的值才为l。 |Al; //只有A的各位都为0时其或缩减运算的值才为0。 7. 移位运算符 右移 左移 移位运算符用法 A n或 A n 表示把操作数A右移或左移n位并用0填补移出位。 8. 条件运算符三目运算符 格式 信号 条件 ? 表达式1表达式2; 当条件成立时信号取表达式1的值,反之取表达式2的值. 9.位拼接运算符 { }                  //将两个或多个信号的某些位拼接起来。 用法 {信号1的某几位信号2的某几位……,信号n的某几位} 例如,在进行加法运算时可将输出与和拼接在一起使用。 output[3:0] sum;                 //sum代表和 output cout;                     //cout为进位输出 input[3:0] ina,inb; input cin; assign {cout,sum}inainbcin;  //进位与和拼接在一起 位拼接可以嵌套使用还可以用重复法来减化书写如: {3{a,b}}等同于{{a,b},{a,b},{a,b}},也等同于{a,b,a,b,a,b}。 6.3.2. 运算符的优先级 以上运算符的优先级如下 ~ 高优先级 */% - , , , , , ! , , ! ,  ~ ^  ,  ^ ~ | , ~ | || ? :  低优先级 6.4 语句 Verilog HDL支持许多语句从而成为结构化和过程性的语言。Verilog HDL的语句包括:赋值语句、条件语句、循环语句、结构说明语句和编译预处理语句等。每一类又包括几种不同的语句具体如表6.3所示。 表6.3 Verilog HDL语句 赋值语句 连续赋值语句 过程赋值语句 条件语句 if-else语句 case语句 循环语句 forever语句 repeat语句 while语句 for语句 结构说明语句 initial语句 always语句 function语句 编译预处理语句 define语句 include 语句 timescale语句 6.4.1 赋 值 语 句 1. 连续赋值语句 assign assign为连续赋值语句它用来对wire型变量进行赋值。 格式 assign 变量 表达式 如:  assign c a b; 在上面的赋值中a和b信号的任何变化都将随时反映到c上来因此称为连续赋值方式。 2. 过程赋值语句 过程赋值语句用于对寄存器类型(reg)的变量进行赋值。过程赋值有以下两种方式。 (1)非阻塞(non_blocking)赋值方式 赋值号为 如 ba; 非阻塞赋值在块结束时才完成赋值操作即b的值并不是立刻就改变的。 (2)阻塞(blocking)赋值方式 赋值号为 如 ba; 阻塞赋值在该语句结束时就完成赋值操作即b的值在该赋值语句结束后立刻改变。如果在一个块语句中有多条阻塞赋值语句那么在前面的赋值语句没有完成之前后面的语句就不能执行就像被阻塞(blocking)一样因此称为阻塞赋值方式 (3)阻塞赋值方式和非阻塞赋值方式的区别 阻塞赋值方式和非阻塞赋值方式的区别常给设计人员带来问题。问题主要是对“always”模块内的reg型变量得赋值不易把握。为区分阻塞赋值与非阻塞赋值的不同可看下面两例。 【例6.4】非阻塞赋值               【例6.5】阻塞赋值 module non_block(c,b,a,clk);       module block(c,b,a,clk);output c,b;                        output c,b;input clk,a;                      input clk,a;reg c,b;                           reg c,b;always (posedge clk)             always (posedge clk)begin                              beginba;                              ba;cb;                              cb;end                                endendmodule                          endmodule 将上面两段代码用MAXPLUSⅡ进行综合并进行仿真可看到二者的区别 对于非阻塞赋值c的值落后b的值一个时钟周期这是因为该“always”块每一个时钟周期执行一次因此信号的值每一个时钟周期更新一次c的值是上一时钟周期的b值。 对于阻塞赋值c的值和b的值一样这是因为b的值是立即更新的。 为避免对这两种赋值语句的应用错误建议在初学时刻只是用一种比如采用阻塞赋值“”因为它类似C语言的赋值方式。为避免出错在同一块内不要将输出重新作为输入使用。而为实现上述非阻塞赋值功能可采用两个“always”块来实现代码如下 module non_block(c,b,a,clk);  output c,b;input clk,a;reg c,b;always (posedge clk)beginba;end  always (posedge clk)begincb;endendmodule   6.4.2 条件语句 条件语句是顺序语句应放在“always”块内。 1. if-else语句 使用方法有以下3种 ①  if(表达式) 语句 ②  if(表达式1) 语句1 else 语句2 ③  if(表达式1) 语句1 else if(表达式2) 语句2 else if(表达式3) 语句3 …… else if(表达式n) 语句n; else 语句n1; 这三种方式中“表达式”一般为逻辑表达式或关系表达式也可能是一位变量。若 表达式的值为0,x,z,视为“假”若为1视为“真”。语句可以是单句也可以是多句多句时用“begin-end”括起来。 2. case语句 多用于多条件译码电路如描述译码器、数据选择器、状态机及微处理器的指令译 码等。 ⑴. case语句 格式 case (敏感表达式) 值1语句1 值2语句2 …… 值n语句n; default: 语句n1; endcase ⑵. casez和casex语句 case 语句中,敏感表达式与值1值n之间的比较是一种全等比较必须保证两者的 对应位全等。 casez与 casex语 句是case语句的两种变体三者的表示形式中唯一的区别是3个关键词case,casez,casex的不同。在casez语句中,如果分支表达式某些位的值为高阻z那么对这些位的比较就不予考虑因此只需关注其他位的比较结果。而在casex语句中则把这种处理方式进一步扩展到对x的处理即如果比较的双方有一方的某些位的值是x或z那么这些位的比较就不予考虑。 此外还有另外一种标识x或z的方式即用表示无关值的“?”来表示。 6.4.3 循环语句 Verilog HDL中存在4种类型的循环语句用来控制语句的执行次数。这4种语句分别为: foreve 连续地执行语句多用在initial块中以生成周期性输入波形。repeat 连续执行一条语句n次。 while 执行一条语句直到循环条件不满足。for 语句 由于MAXPLUS 软件不支持repeat语句。forever语句一般用在initial语句块中而MAXPLUS 软件不支持initial语句块因此这里只介绍for和while两种语句。 1for语句 格式 for(表达式1;表达式2;表达式3)语句 即for (循环变量初值循环结束条件循环变量增值) 执行语句 2while语句 格式 while(循环执行条件表达式) 语句 while语句执行时首先判断循环执行表达式是否为真若为真执行循环体中语句 然后再判断循环执行条件表达式是否为真……直至条件表达式不为真为止。循环体中语句可以是单句也可以是多句多句时用“begin-end”括起来。 6.4.4 结构说明语句 Verilog HDL中的任何过程模块都从属于以下4种结构说明语句: ◇initial ◇always ◇task ◇function inital说明语句一般用于仿真中的初始化仅执行一次;always块内的语句则是不断重复执行的;task和function语句可以在程序模块中的一处或多处调用。 由于MAXPLUS 软件不支持task,initial语句, 因此这里只介绍always和function两种结构说明语句 1always块语句 always块语句模板如下: always(敏感信号表达式) begin //过程赋值 //if语句 //case语句 //while,repeat,for循环 //task,function调用 end 在一个模块(module)中使用always语句的次数是不受限制的。always块内的语句 是不断重复执行的。 说明 ⑴敏感信号表达式 敏感信号表达式又称事件表达式或敏感表当该表达式的值改变时就会执行一遍块内语句。因此在敏感信号表达式中应列出影响块内取值的所有信号(一般为所有输入信号)。若有两个或两个以上信号时它们之间用or连接。 例如下面用case语句描述的4选1数据选择器只要输入信号in0inlin2in3或选择信号sel[1:0]改变则输出改变所以敏感信号表达式写为: in0 or in1 or in2 or in3 or sel    【例6.6】用case语句描述的4选1数据选择器 module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input[1:0] sel;reg out;always (in0 or in1 or in2 or in3 or sel)case(sel)2’b00: outin0;2’b01: outin1;2’b10: outin2;2’b11: outin3;default: out2’bx;endcaseendmodule ⑵ posedge与 negedge关键字 对于时序电路事件是由时钟边沿触发的。为表达边沿这个概念Verilog HDL提供 了posedge和negedge两个关键字来描述。比如在例6.2的8位计数器中有块语句: always (posedge  clk)          //上升沿时刻计数 posedge clk表示时钟信号clk的上升沿negedge clk表示时钟信号clk的下降沿。 2. 函数 function 函数的目的是返回一个用于表达式的值。函数的定义格式为 function 返回值位宽或类型说明 函数名 端口声明 局部变量定义 其他语句 endfunction 【例6.7】函数举例 function[7:0] gefun;input[7:0] x;reg[7:0] count;integer i;begincount0;for(i0;i7;ii1)if(x[i]1’b0) countcount1;gefuncount;endendfunction 上面的gefun函数循环核对输人的每一位计算出0的个数并返回一个适当的值。 返回值位宽或类型说明是一个可选项如果缺省则返回值为一位关于寄存器类型的数据。 函数的定义中蕴含了一个与函数同名的、函数内部的寄存器。在函数定义时将函数返回值所使用的寄存器设为与函数同名的内部变量因此函数名被赋予的值就是函数的返回值。例如在上例中gefun最终赋予的值即为函数的返回值。 函数的调用是通过将函数作为表达式中的操作数来实现的。调用格式如下: 函数名(表达式 表达式) 比如使用连续赋值语句调用函数gefun时可以采用如下语句: assign outis_legal ? gefun(in) : 1b0; 注意,在函数中不能包含有任何的时间控制语句并且定义函数时至少要有一个输人 参量。 6.5 语句的顺序执行和并行执行 用Verilog HDL模块来设计电路首先应该清楚哪些操作是同时发生的哪些是顺序发生的。在“always”模块内逻辑是按照指定的顺序执行的always块内的语句称为顺序语句因为这些语句完全按照书写的顺序来执行。always模块之间是同时执行的或者说是并行执行的。两个或更多个always模块、“assign”语句、实例元件等都是同时执行的。通过下面的例子可以清楚地看到always模块内的语句是顺序执行的而always模块之间是并行执行的。 【例6.8】顺序执行模块1    【例6.9】顺序执行模块2 module serial(q,a,clk)                     module seria2(q,a,clk)output qa;                               output qa;input cIk;                                input cIk;reg qa;                                   reg qa;always (posedge clk);                     always (posedge clk);     begin                                       beginq ~ q;                                     a ~ q;  a ~ q;                                     q ~ q;end                                         endendmodule                                   endmodule 上面的两个例子其区别只是在always模块内把两个赋值语句的顺序相互颠倒。 分别对上面的两个模块用MAXPLUSII软件进行模拟仿真从得到的波形可以看到在模块1中q先取反然后再取反给aa和q的波形是相反的在模块2中q取反后赋值给q和aa和q的波形是相同的。如果将上述两句赋值语句分别放在两个always模块中如下面例6.8和例6.9两个程序所示经过仿真可以发现:这两个always 模块放置的顺序对结果并没有影响因为这两个模块是并行执行的。 【例6.10】并行模块1                      【例6.11】并行模块2 moduleparal(qaclk);                moduleparal2(qaclk);output qa;                          output qa;lnput cIk;                           lnput cIk;reg qa;                              reg qa;always (posedge clk)                 always (posedge clk)begin                                  beginq ~ q;                                a ~ q;  end                                    endalways (posedge clk)                 always (posedge clk)begin                                  begina ~ q;                                q ~ q;end                                    endendmodule                              endmodule 例6.10和例6.11的仿真波形与例6.9的仿真波形是完全相同的。 6.6  小结 本章介绍Verilog HDL的语法结构包括变量、语句、模块和不同抽象级别的电路的 设计和描述。 需要注意的是所有的Verilog HDL编译软件都只支恃该语言的某一个子集。所以在使用Verilog HDL 进行编译时必须弄清楚所用编译软件的功能用编译软件支持的语句来描述所设计的系统。 七参考资料 《数字系统设计与Verilog HDL》电子工业出版社 王金明等编著。 《CPLD逻辑电路设计与实习》 捷太出版社     萧如宣 著 以上就是本期的内容我们下一次见  分享一张壁纸
http://www.w-s-a.com/news/141095/

相关文章:

  • 设计英语宁波seo做排名
  • 奉贤网站建设上海站霸深圳几个区
  • c#做网站自已建网站
  • 成都地区网站建设网站设计类型
  • 如何做网站结构优化北京响应式网站
  • 出售源码的网站威海住房建设局网站
  • 网站建设补充报价单网站建设 技术指标
  • 做网站费用分摊入什么科目做网络网站需要三证么
  • 房屋备案查询系统官网杭州排名优化软件
  • 网站地图html网络营销的流程和方法
  • 注册好网站以后怎么做wordpress 获取插件目录下
  • 南京做网站dmooo地方网站需要什么手续
  • 网站开发合同有效期omeka wordpress对比
  • 杭州设计网站的公司广州网站改版领军企业
  • 网站备案系统苏州网站设计网站开发公司
  • 怎么样做微网站著名企业vi设计
  • 三分钟做网站网页设计心得体会100字
  • 网站建设支付宝seo建站是什么
  • 常州做网站的 武进学雷锋_做美德少年网站
  • 怎样建网站赚钱贵州seo和网络推广
  • 创建网站的工具站内seo优化
  • 网站特效 站长查询网网站
  • 百度移动端网站网站建设设计思想
  • 青岛建设官方网站南宁制作企业网站
  • 校园网站建设管理工作制度大网站开发费用
  • 做logo赚钱的网站分类网站 模板
  • 网站建设完成报告织梦网站怎么做备份
  • 邯郸市城乡建设管理局网站vimwiki wordpress
  • 如何修改wordpress站名如何制作公司网站
  • 宁波网站建设与推广方案网站有了备案号之后能做什么