语句morphvox

morphvoxpro教程  时间:2021-01-29  阅读:()

共41页资源类别:HDL语言内部公开1.
0密级版本文档编号文档中心VerilogHDL入门教程(仅供内部使用)yyyy/mm/dd日期:批准:日期:中研基础批准:2004.
8.
3日期:中研基础拟制:版权所有不得复制修订记录初稿完成1.
002004.
8.
3作者描述修订版本日期绝密请输入文档编号VerilogHDL入门教程2004-08-16第2页,共41页版权所有,侵权必究目录285结构建模274.
8case语句254.
7条件语句254.
6.
6连接运算符254.
6.
5条件运算符244.
6.
4按位逻辑运算符234.
6.
3逻辑运算符224.
6.
2关系运算符214.
6.
1算术运算符214.
6运算符和表达式204.
5.
2寄存器类型204.
5.
1线网类型204.
5数据类型184.
4.
2常量184.
4.
1值集合184.
4数字值集合184.
3格式174.
2注释174.
1.
3书写规范建议174.
1.
2关键词174.
1.
1定义174.
1标识符174VerilogHDL基本语法163.
3.
4混合设计描述153.
3.
3行为描述方式143.
3.
2数据流描述方式123.
3.
1结构化描述方式123.
3三种建模方式113.
2时延113.
1.
3模块语法103.
1.
2模块的结构93.
1.
1简单事例93.
1模块93VerilogHDL建模概述72.
4.
2能力72.
4.
1历史72.
4VerilogHDL简介62.
3设计方法学62.
2硬件描述语言52.
1数字电路设计方法52HDL设计方法学简介51前言绝密请输入文档编号VerilogHDL入门教程2004-08-16第3页,共41页版权所有,侵权必究4010附录AVerilog保留字399习题398其他方面377.
4行为建模具体实例367.
3过程赋值语句357.
2顺序语句块357.
1简介357行为建模346.
3数据流建模具体实例346.
2阻塞赋值语句346.
1连续赋值语句346数据流建模315.
4结构化建模具体实例295.
3实例化语句285.
2模块端口285.
1模块定义结构绝密请输入文档编号VerilogHDL入门教程2004-08-16第4页,共41页版权所有,侵权必究VerilogHDL入门教程关键词:摘要:本文主要介绍了VerilogHDL语言的一些基本知识,目的是使初学者能够迅速掌握HDL设计方法,初步了解并掌握VerilogHDL语言的基本要素,能够读懂简单的设计代码并能够进行一些简单设计的VerilogHDL建模.
缩略语清单:对本文所用缩略语进行说明,要求提供每个缩略语的英文全名和中文解释.

参考资料清单:请在表格中罗列本文档所引用的有关参考文献名称、作者、标题、编号、发布日期和出版单位等基本信息.
机械工业出版社图书馆2000.
7J.
Bhasker著徐振林等译VerilogHDL硬件描述语言苏文彪AMBITDesignSystemQuisckReferenceforVerilogHDL出版单位(若不为本公司发布的文献,请填写此列)查阅地点或渠道发布日期编号作者名称参考资料清单1前言当前业界的硬件描述语言中主要有VHDL和VerilogHDL.
公司根据本身ASIC设计现有的特点、现状,主推VerilogHDL语言,逐渐淡化VHDL语言,从而统一公司的ASIC/FPGA设计平台,简化流程.
为使新员工在上岗培训中能迅速掌握ASIC/FPGA设计的基本技能,中研基础部ASIC设计中心开发了一系列的培训教材.
该套HDL语言培训系列包括如下教程:《VerilogHDL入门教程》《VerilogHDL代码书写规范》《Verilog基本电路设计指导书》《TestBench编码技术》系列教材完成得较匆忙,本身尚有许多不完善的地方,同时,可能还需要其他知识方面的培训但没有形成培训教材,希望大家在培训过程中,多提宝贵意见,以便我们对它进行修改和完善.
2HDL设计方法学简介绝密请输入文档编号VerilogHDL入门教程2004-08-16第5页,共41页版权所有,侵权必究2.
1数字电路设计方法当前的数字电路设计从层次上分可分成以下几个层次:1.
算法级设计:利用高级语言如C语言及其他一些系统分析工具(如MATLAB)对设计从系统的算法级方式进行描述.
算法级不需要包含时序信息.
2.
RTL级设计:用数据流在寄存器间传输的模式来对设计进行描述.
3.
门级:用逻辑级的与、或、非门等门级之间的连接对设计进行描述.
4.
开关级:用晶体管和寄存器及他们之间的连线关系来对设计进行描述.
算法级是高级的建模,一般对特大型设计或有较复杂的算法时使用,特别是通讯方面的一些系统,通过算法级的建模来保证设计的系统性能.
在算法级通过后,再把算法级用RTL级进行描述.
门级一般对小型设计可适合.
开关级一般是在版图级进行.
2.
2硬件描述语言在传统的设计方法中,当设计工程师设计一个新的硬件、一个新的数字电路或一个数字逻辑系统时,他或许在CAE工作站上做设计,为了能在CAE工作站做设计,设计者必须为设计画一张线路图,通常地,线路图是由表示信号的线和表示基本设计单元的符号连在一起组成线路图,符号取自设计者用于构造线路图的零件库.
若设计者是用标准逻辑器件(如74系列等)做板极设计线路图,那么在线路图中,符号取自标准逻辑零件符号库;若设计是进行ASIC设计,则这些符号取自ASIC库的可用的专用宏单元.
这就是传统的原理图设计方法.
对线路图的逻辑优化,设计者或许利用一些EDA工具或者人工地进行逻辑的布尔函数逻辑优化.
为了能够对设计进行验证,设计者必须通过搭个硬件平台(如电路板),对设计进行验证.

随着电子设计技术的飞速发展,设计的集成度、复杂度越来越高,传统的设计方法已满足不了设计的要求,因此要求能够借助当今先进的EDA工具,使用一种描述语言,对数字电路和数字逻辑系统能够进行形式化的描述,这就是硬件描述语言.
硬件描述语言HDL(HardwareDescriptionLanguage)是一种用形式化方法来描述数字电路和数字逻辑系统的语言.
数字逻辑电路设计者可利用这种语言来描述自己的设计思想,然后利用EDA工具进行仿真,再自动综合到门级电路,最后用ASIC或FPGA实现其功能.
举个例子,在传统的设计方法中,对2输入的与门,我们可能需到标准器件库中调个74系列的器件出来,但在硬件描述语言中,"&"就是一个与门的形式描述,"C=A&B"就是一个2输入与门的描述.
而"and"就是一个与门器件.
硬件描述语言发展至今已有二十多年历史,当今业界的标准中(IEEE标准)主要有VHDL和VerilogHDL这两种硬件描述语言.
2.
3设计方法学当前的ASIC设计有多种设计方法,但一般地采用自顶向下的设计方法.
随着技术的发展,一个芯片上往往集成了几十万到几百万个器件,传统的自底向上的设计方法已不太现实.
因此,一个设计往往从系统级设计开始,把系统划分成几个大的基本的功能模块,每个功能模块再按一定的规则分成下一个层次的基本单元,如此一直划分下去.
自顶向下的设计方法可用下面的树状结构表示:绝密请输入文档编号VerilogHDL入门教程2004-08-16第6页,共41页版权所有,侵权必究系统级的顶层模块模块A模块B模块C模块B1模块B2模块C1图1TOP-DOWN设计思想通过自顶向下的设计方法,可实现设计的结构化,使一个复杂的系统设计可由多个设计者分工合作;还可以实现层次化的管理.
2.
4VerilogHDL简介VerilogHDL是一种硬件描述语言,用于从算法级、RTL级、门级到开关级的多种抽象设计层次的数字系统建模.
被建模的数字系统对象的复杂性可介于简单的门级和完整的电子数字系统之间.
数字系统可按层次描述.
2.
4.
1历史VerilogHDL语言最初是于1983年由GatewayDesignAutomation公司为其模拟器产品开发的硬件建模语言.
那时它只是一种专用语言.
由于他们的模拟、仿真器产品的广泛使用,VerilogHDL作为一种便于使用且实用的语言逐渐为众多设计者所接受.
在一次努力增加语言普及性的活动中,VerilogHDL语言于1990年被推向公众领域.
OpenVerilogInternational(OVI)是促进Verilog发展的国际性组织.
1992年,OVI决定致力于推广VerilogOVI标准成为IEEE标准.
这一努力最后获得成功,Verilog语言于1995年成为IEEE标准,称为IEEEStd1364-1995.
完整的标准在Verilog硬件描述语言参考手册中有详细描述.
2.
4.
2能力对初学者,可先大致了解一下VerilogHDL所提供的能力,掌握VerilogHDL语言的核心子集就可以了.
1.
概述VerilogHDL语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制.
所有这些都使用同一种建模语言.
此外,VerilogHDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行.
VerilogHDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义.
因此,用这种语言编写的模型能够使用Verilog仿真器进行验证.
语言从C编程语言中继承了多种操作符和结构.
VerilogHDL提供了扩展的建模能力,其中许多扩展最初很难理解.
但是,Verilog绝密请输入文档编号VerilogHDL入门教程2004-08-16第7页,共41页版权所有,侵权必究HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够.
当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述.
2.
主要功能listy基本逻辑门,例如and、or和nand等都内置在语言中.
y开关级基本结构模型,例如pmos和nmos等也被内置在语言中.
y可采用三种不同方式或混合方式对设计建模.
这些方式包括:行为描述方式—使用过程化结构建模;数据流方式—使用连续赋值语句方式建模;结构化方式—使用门和模块实例语句描述建模.
yVerilogHDL中有两类数据类型:线网数据类型和寄存器数据类型.
线网类型表示构件间的物理连线,而寄存器类型表示抽象的数据存储元件.
y能够描述层次设计,可使用模块实例结构描述任何层次.
y设计的规模可以是任意的;语言不对设计的规模(大小)施加任何限制.
yVerilogHDL不再是某些公司的专有语言而是IEEE标准.
y人和机器都可阅读Verilog语言,因此它可作为EDA的工具和设计者之间的交互语言.
y设计能够在多个层次上加以描述,从开关级、门级、寄存器传送级(RTL)到算法级.
y能够使用内置开关级原语在开关级对设计完整建模.
y同一语言可用于生成模拟激励和指定测试的验证约束条件,例如输入值的指定.

yVerilogHDL能够监控模拟验证的执行,即模拟验证执行过程中设计的值能够被监控和显示.
这些值也能够用于与期望值比较,在不匹配的情况下,打印报告消息.

y在行为级描述中,VerilogHDL不仅能够在RTL级上进行设计描述,而且能够在体系结构级描述及其算法级行为上进行设计描述.
y能够使用门和模块实例化语句在结构级进行结构描述.
y对高级编程语言结构,例如条件语句、情况语句和循环语句,语言中都可以使用.
下图显示了VerilogHDL的混合方式建模能力,即在一个设计中每个模块均可以在不同设计层次上建模.
开关算法RTL门门开关图2混合设计层次建模示意图绝密请输入文档编号VerilogHDL入门教程2004-08-16第8页,共41页版权所有,侵权必究3VerilogHDL建模概述在数字电路设计中,数字电路可简单归纳为两种要素:线和器件.
线是器件管脚之间的物理连线;器件也可简单归纳为组合逻辑器件(如与或非门等)和时序逻辑器件(如寄存器、锁存器、RAM等).
一个数字系统(硬件)就是多个器件通过一定的连线关系组合在一块的.
因此,VerilogHDL的建模实际上就是如何使用HDL语言对数字电路的两种基本要素的特性及相互之间的关系进行描述的过程.
下面通过一些实例,以便对VerilogHDL的设计建模有个大概的印象.
3.
1模块模块(module)是Verilog的基本描述单位,用于描述某个设计的功能或结构及与其他模块通信的外部端口.
模块在概念上可等同一个器件就如我们调用通用器件(与门、三态门等)或通用宏单元(计数器、ALU、CPU)等,因此,一个模块可在另一个模块中调用.
一个电路设计可由多个模块组合而成,因此一个模块的设计只是一个系统设计中的某个层次设计,模块设计可采用多种建模方式.
3.
1.
1简单事例下面先介绍几个简单的VerilogHDL程序.
例[1]加法器moduleaddr(a,b,cin,count,sum);input[2:0]a;input[2:0]b;inputcin;outputcount;output[2:0]sum;assign{count,sum}=a+b+cin;endmodule该例描述一个3位加法器,从例子可看出整个模块是以module开始,endmodule结束.
例[2]比较器modulecompare(equal,a,b);input[1:0]a,b;//declaretheinputsignal;outputequare;//declaretheoutputsignal;assignequare=(a==b)1:0;/*ifa=b,output1,otherwise0;*/endmodule绝密请输入文档编号VerilogHDL入门教程2004-08-16第9页,共41页版权所有,侵权必究该例描述一个比较器,从上可看到,和//.
.
.
表示注释部分.
注释只是为了方便设计者读懂代码,对编译并不起作用.
例[3]三态驱动器modulemytri(din,d_en,d_out);inputdin;inputd_en;outputd_out;//--Enteryourstatementshere--//assignd_out=d_endin:'bz;endmodulemoduletrist(din,d_en,d_out);inputdin;inputd_en;outputd_out;//--statementshere--//mytriu_mytri(din,d_en,d_out);endmodule该例描述了一个三态驱动器.
其中三态驱动门在模块mytri中描述,而在模块trist中调用了模块mytri.
模块mytri对trist而言相当于一个已存在的器件,在trist模块中对该器件进行实例化,实例化名u_mytri.
3.
1.
2模块的结构通过上面的实例可看出,一个设计是由一个个模块(module)构成的.
一个模块的设计如下:1、模块内容是嵌在module和endmodule两个语句之间.
每个模块实现特定的功能,模块可进行层次的嵌套,因此可以将大型的数字电路设计分割成大小不一的小模块来实现特定的功能,最后通过由顶层模块调用子模块来实现整体功能,这就是Top-Down的设计思想,如3.
3.
1的例[3].

2、模块包括接口描述部分和逻辑功能描述部分.
这可以把模块与器件相类比.

模块的端口定义部分:如上例:moduleaddr(a,b,cin,count,sum);其中module是模块的保留字,addr是模块的名字,相当于器件名.
()内是该模块的端口声明,定义了该模块的管脚名,是该模块与其他模块通讯的外部接口,相当于器件的pin.
模块的内容,包括I/O说明,内部信号、调用模块等的声明语句和功能定义语句.

I/O说明语句如:input[2:0]a;input[2:0]b;inputcin;outputcount;其中的input、output、inout是保留字,定义了管脚信号的流向,[n:0]表示该信号的位宽(总线或单根信号线).

绝密请输入文档编号VerilogHDL入门教程2004-08-16第10页,共41页版权所有,侵权必究逻辑功能描述部分如:assignd_out=d_endin:'bz;mytriu_mytri(din,d_en,d_out);功能描述用来产生各种逻辑(主要是组合逻辑和时序逻辑,可用多种方法进行描述,具体的用法下面章节有介绍),还可用来实例化一个器件,该器件可以是厂家的器件库也可以是我们自己用HDL设计的模块(相当于在原理图输入时调用一个库元件).
在逻辑功能描述中,主要用到assign和always两个语句.
3、对每个模块都要进行端口定义,并说明输入、输出口,然后对模块的功能进行逻辑描述,当然,对测试模块,可以没有输入输出口.
4、VerilogHDL的书写格式自由,一行可以写几个语句,也可以一个语句分几行写.
具体由代码书写规范约束.
5、除endmodule语句外,每个语句后面需有分号表示该语句结束.
3.
1.
3模块语法1.
一个模块的基本语法如下:一个模块的基本语法如下:modulemodule_name(port1,port2,//Declarations:input,output,inout,reg,wire,parameter,function,task,.
.
.
//Statements:InitialstatementAlwaysstatementModuleinstantiationGateinstantiationContinuousassignmentendmodule模块的结构需按上面的顺序进行,声明区用来对信号方向、信号数据类型、函数、任务、参数等进行描述.
语句区用来对功能进行描述如:器件调用(Moduleinstantiation)等.
2.
书写语法建议一个模块用一个文件;模块名与文件名要同名;一行一句语句.
信号方向按输入、输出、双向顺序描述.
设计模块时可尽量考虑采用参数化,提高设计的重用.
以上是初学者的建议,具体的或深入的方面可看相关的文档.
下面的有关语法建议类似.

3.
2时延绝密请输入文档编号VerilogHDL入门教程2004-08-16第11页,共41页版权所有,侵权必究信号在电路中传输会有传播延时等,如线延时、器件延时.
时延就是对延时特性的HDL描述.
举例如下:assign#2B=A;表示B信号在2个时间单位后得到A信号的值.
如下图:A:2B:图3在VerilogHDL中,所有时延都必须根据时间单位进行定义,定义方式为在文件头添加如下语句:`timescale1ns/100ps其中'timescale是VerilogHDL提供的预编译处理命令,1ns表示时间单位是1ns,100ps表示时间精度是100ps.
根据该命令,编译工具才可以认知#2为2ns.
在VerilogHDL的IEEE标准中没有规定时间单位的缺省值,由各模拟工具确定.
因此,在写代码时必须确定.
3.
3三种建模方式在HDL的建模中,主要有结构化描述方式、数据流描述方式和行为描述方式,下面分别举例说明三者之间的区别.
3.
3.
1结构化描述方式结构化的建模方式就是通过对电路结构的描述来建模,即通过对器件的调用(HDL概念称为例化),并使用线网来连接各器件的描述方式.
这里的器件包括VerilogHDL的内置门如与门and,异或门xor等,也可以是用户的一个设计.
结构化的描述方式反映了一个设计的层次结构.

例[1]:一位全加器图4一位全加器的结构图代码:moduleFA_struct(A,B,Cin,Sum,Count);inputA;inputB;inputCin;绝密请输入文档编号VerilogHDL入门教程2004-08-16第12页,共41页版权所有,侵权必究outputSum;outputCount;wireS1,T1,T2,T3;//--statements--//xorx1(S1,A,B);xorx2(Sum,S1,Cin);andA1(T3,A,B);andA2(T2,B,Cin);andA3(T1,A,Cin);orO1(Cout,T1,T2,T3);endmodule该实例显示了一个全加器由两个异或门、三个与门、一个或门构成.
S1、T1、T2、T3则是门与门之间的连线.
代码显示了用纯结构的建模方式,其中xor、and、or是VerilogHDL内置的门器件.
以xorx1(S1,A,B)该例化语句为例:xor表明调用一个内置的异或门,器件名称xor,代码实例化名x1(类似原理图输入方式).
括号内的S1,A,B表明该器件管脚的实际连接线(信号)的名称,其中A、B是输入,S1是输出.
其他同.
例[2]:两位的全加器两位的全加器可通过调用两个一位的全加器来实现.
该设计的设计层次示意图和结构图如下:Four_bit_FAFA_structFA_structABCinSumCountFAABCinSumCountFAFour_bit_FAFA_struct_structFCinFBFSumFCount图5两位全加器的结构示意图代码:moduleFour_bit_FA(FA,FB,FCin,FSum,FCout);parameterSIZE=2;input[SIZE:1]FA;绝密请输入文档编号VerilogHDL入门教程2004-08-16第13页,共41页版权所有,侵权必究input[SIZE:1]FB;inputFCin;output[SIZE:1]FSum;outputFCout;wireFTemp;FA_structFA1(.
A(FA[1]),.
B(FB[1]),.
Cin(FCin),.
Sum(FSum[1]),.
Cout(Ftemp));FA_structFA2(.
A(FA[2]),.
B(FB[2]),.
Cin(FTemp),.
Sum(FSum[2]),.
Cout(FCount));endmodule该实例用结构化建模方式进行一个两位的全加器的设计,顶层模块Four_bit_FA调用了两个一位的全加器FA_struct.
在这里,以前的设计模块FA_struct对顶层而言是一个现成的器件,顶层模块只要进行例化就可以了.
注意这里的例化中,端口映射(管脚的连线)采用名字关联,如.
A(FA[2]),其中.
A表示调用器件的管脚A,括号中的信号表示接到该管脚A的电路中的具体信号.

wire保留字表明信号Ftemp是属线网类型(下面有具体描述).
另外,在设计中,尽量考虑参数化的问题.
器件的端口映射必须采用名字关联.
3.
3.
2数据流描述方式数据流的建模方式就是通过对数据流在设计中的具体行为的描述的来建模.
最基本的机制就是用连续赋值语句.
在连续赋值语句中,某个值被赋给某个线网变量(信号),语法如下:assign[delay]net_name=expression;如:assign#2A=B;绝密请输入文档编号VerilogHDL入门教程2004-08-16第14页,共41页版权所有,侵权必究在数据流描述方式中,还必须借助于HDL提供的一些运算符,如按位逻辑运算符:逻辑与(&),逻辑或(|)等.
以上面的全加器为例,可用如下的建模方式:图6一位全加器的结构图`timescale1ns/100psmoduleFA_flow(A,B,Cin,Sum,Count)inputA,B,Cin;outputSum,Count;wireS1,T1,T2,T3;assign#2S1=A^B;assign#2Sum=S1^Cin;assign#2T3=A&B;assign#2T1=A&Cin;assign#2T2=B&Cin;endmodule注意在各assign语句之间,是并行执行的,即各语句的执行与语句之间的顺序无关.
如上,当A有个变化时,S1、T3、T1将同时变化,S1的变化又会造成Sum的变化.
3.
3.
3行为描述方式行为方式的建模是指采用对信号行为级的描述(不是结构级的描述)的方法来建模.
在表示方面,类似数据流的建模方式,但一般是把用initial块语句或always块语句描述的归为行为建模方式.
行为建模方式通常需要借助一些行为级的运算符如加法运算符(+),减法运算符(-)等.

以下举个例子,对initial和always语句的具体应用可看相关章节的介绍,这里,先对行为建模方式有个概念.
例[1]一位全加器的行为建模moduleFA_behav1(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;绝密请输入文档编号VerilogHDL入门教程2004-08-16第15页,共41页版权所有,侵权必究regSum,Cout;regT1,T2,T3;always@(AorBorCin)beginSum=(A^B)^Cin;T1=A&Cin;T2=B&Cin;T3=A&B;Cout=(T1|T2)|T3;endendmodule需要先建立以下概念:1、只有寄存器类型的信号才可以在always和initial语句中进行赋值,类型定义通过reg语句实现.
2、always语句是一直重复执行,由敏感表(always语句括号内的变量)中的变量触发.
3、always语句从0时刻开始.
4、在begin和end之间的语句是顺序执行,属于串行语句.
例[2]:一位全加器的行为建模moduleFA_behav2(A,B,Cin,Sum,Cout);inputA,B,Cin;outputSum,Cout;regSum,Cout;always@(AorBorCin)begin{Count,Sum}=A+B+Cin;endendmodule在例2中,采用更加高级(更趋于行为级)描述方式,即直接采用"+"来描述加法.
{Count,Sum}表示对位数的扩展,因为两个1bit相加,和有两位,低位放在Sum变量中,进位放在Count中.
3.
3.
4混合设计描述绝密请输入文档编号VerilogHDL入门教程2004-08-16第16页,共41页版权所有,侵权必究在实际的设计中,往往是多种设计模型的混合.
一般地,对顶层设计,采用结构描述方式,对低层模块,可采用数据流、行为级或两者的结合.
如上面的两bit全加器,对顶层模块(Four_bit_FA)采用结构描述方式对低层进行例化,对低层模块(FA)可采用结构描述、数据流描述或行为级描述.
4VerilogHDL基本语法本节介绍VerilogHDL语言的一些基本要素,包括标识符、注释、格式、数字值集合、两种数据类型、运算符和表达式和一些基本的语句如IF语句等.
4.
1标识符4.
1.
1定义标识符(identifier)用于定义模块名、端口名、信号名等.
VerilogHDL中的标识符(identifier)可以是任意一组字母、数字、$符号和_(下划线)符号的组合,但标识符的第一个字符必须是字母或者下划线.
另外,标识符是区分大小写的.
以下是标识符的几个例子:CountCOUNT//与Count不同.
R56_68FIVE$4.
1.
2关键词VerilogHDL定义了一系列保留字,叫做关键词,附录A列出了语言中的所有保留字.
注意只有小写的关键词才是保留字.
例如,标识符always(这是个关键词)与标识符ALWAYS(非关键词)是不同的.
4.
1.
3书写规范建议以下是一些书写规范的要求,可参考公司的《Verilog代码书写规范》.
1、用有意义的有效的名字如Sum、CPU_addr等.
2、用下划线区分词.
3、采用一些前缀或后缀,如时钟采用Clk前缀:Clk_50,Clk_CPU;低电平采用_n后缀:Enable_n;4、统一一定的缩写如全局复位信号Rst.
5、同一信号在不同层次保持一致性,如同一时钟信号必须在各模块保持一致.

6、自定义的标识符不能与保留字同名.
7、参数采用大写,如SIZE.
4.
2注释VerilogHDL中有两种注释的方式,一种是以"/*"符号开始,"*/"结束,在两个符号之间的语句都是注释语句,因此可扩展到多行.
如:绝密请输入文档编号VerilogHDL入门教程2004-08-16第17页,共41页版权所有,侵权必究/*statement1,statement2,.
.
.
.
.
statementn*/以上n个语句都是注释语句.
另一种是以//开头的语句,它表示以//开始到本行结束都属于注释语句.
4.
3格式VerilogHDL是区分大小写的,即大小写不同的标识符是不同的.
另外VerilogHDL的书写格式是自由的,即一条语句可多行书写;一行可写多个语句.
白空(新行、制表符、空格)没有特殊意义.
如inputA;inputB;与inputA;inputB;是一样的.
书写规范建议:一个语句一行.
采用空四格的table键进行缩进.
4.
4数字值集合本小节介绍VerilogHDL的值的集合和常量(整型、实型、字符型)和变量等.
4.
4.
1值集合VerilogHDL中规定了四种基本的值类型:0:逻辑0或"假";1:逻辑1或"真";X:未知值;Z:高阻.
注意这四种值的解释都内置于语言中.
如一个为z的值总是意味着高阻抗,一个为0的值通常是指逻辑0.
在门的输入或一个表达式中的为"z"的值通常解释成"x".
此外,x值和z值都是不分大小写的,也就是说,值0x1z与值0X1Z相同.
VerilogHDL中的常量是由以上这四类基本值组成的.
4.
4.
2常量VerilogHDL中有三种常量:整型、实型、字符串型.
绝密请输入文档编号VerilogHDL入门教程2004-08-16第18页,共41页版权所有,侵权必究下划线符号(_)可以随意用在整数或实数中,它们就数量本身没有意义.
它们能用来提高易读性;唯一的限制是下划线符号不能用作为首字符.
下面主要介绍整型和字符串型.
1.
整型整型数可以按如下两种方式书写:1)简单的十进制数格式2)基数格式A.
简单的十进制格式这种形式的整数定义为带有一个可选的"+"(一元)或"-"(一元)操作符的数字序列.

下面是这种简易十进制形式整数的例子.
32十进制数32-15十进制数-15B.
基数表示法这种形式的整数格式为:[size]'basevaluesize定义以位计的常量的位长;base为o或O(表示八进制),b或B(表示二进制),d或D(表示十进制),h或H(表示十六进制)之一;value是基于base的值的数字序列.
值x和z以及十六进制中的a到f不区分大小写.
下面是一些具体实例:5'O375位八进制数(二进制11111)4'D24位十进制数(二进制0011)4'B1x_014位二进制数7'Hx7位x(扩展的x),即xxxxxxx4'hZ4位z(扩展的z),即zzzz4'd-4非法:数值不能为负8'h2A在位长和字符之间,以及基数和数值之间允许出现空格3'b001非法:`和基数b之间不允许出现空格(2+3)'b10非法:位长不能够为表达式注意,x(或z)在十六进制值中代表4位x(或z),在八进制中代表3位x(或z),在二进制中代表1位x(或z).
基数格式计数形式的数通常为无符号数.
这种形式的整型数的长度定义是可选的.
如果没有定义一个整数型的长度,数的长度为相应值中定义的位数.
下面是两个例子:'o7219位八进制数'hAF8位十六进制数绝密请输入文档编号VerilogHDL入门教程2004-08-16第19页,共41页版权所有,侵权必究如果定义的长度比为常量指定的长度长,通常在左边填0补位.
但是如果数最左边一位为x或z,就相应地用x或z在左边补位.
例如:10'b10左边添0占位,000000001010'bx0x1左边添x占位,xxxxxxx0x1如果长度定义得更小,那么最左边的位相应地被截断.
例如:3'b1001_0011与3'b011相等5'H0FFF与5'H1F相等2.
字符串型字符串是双引号内的字符序列.
字符串不能分成多行书写.
例如:"INTERNALERROR""REACHED->HERE"用8位ASCII值表示的字符可看作是无符号整数.
因此字符串是8位ASCII值的序列.
为存储字符串"INTERNALERROR",变量需要8*14位.
reg[1:8*14]Message;.
.
.
Message="INTERNALERROR"4.
5数据类型VerilogHDL主要包括两种数据类型线网类型(nettype)和寄存器类型(regtype).
4.
5.
1线网类型1.
wire和tri定义线网类型主要有wire和tri两种.
线网类型用于对结构化器件之间的物理连线的建模.
如器件的管脚,内部器件如与门的输出等.
以上面的加法器为例,输入信号A,B是由外部器件所驱动,异或门X1的输出S1是与异或门X2输入脚相连的物理连接线,它由异或门X1所驱动.

由于线网类型代表的是物理连接线,因此它不存贮逻辑值.
必须由器件所驱动.
通常由assign进行赋值.
如assignA=B^C;当一个wire类型的信号没有被驱动时,缺省值为Z(高阻).
信号没有定义数据类型时,缺省为wire类型.
如上面一位全加器的端口信号A,B,SUM等,没有定义类型,故缺省为wire线网类型.
2.
两者区别tri主要用于定义三态的线网.
4.
5.
2寄存器类型绝密请输入文档编号VerilogHDL入门教程2004-08-16第20页,共41页版权所有,侵权必究1.
定义reg是最常用的寄存器类型,寄存器类型通常用于对存储单元的描述,如D型触发器、ROM等.
存储器类型的信号当在某种触发机制下分配了一个值,在分配下一个值之时保留原值.
但必须注意的是,reg类型的变量,不一定是存储单元,如在always语句中进行描述的必须用reg类型的变量.
reg类型定义语法如下:reg[msb:lsb]reg1,reg2,.
.
.
regN;msb和lsb定义了范围,并且均为常数值表达式.
范围定义是可选的;如果没有定义范围,缺省值为1位寄存器.
例如:reg[3:0]Sat;//Sat为4位寄存器.
regCnt;//1位寄存器.
reg[1:32]Kisp,Pisp,Lisp;寄存器类型的值可取负数,但若该变量用于表达式的运算中,则按无符号类型处理,如:regA;.
.
.
.
.
A=-1;.
.
.
.
则A的二进制为1111,在运算中,A总按无符号数15来看待.
2.
寄存器类型的存储单元建模举例用寄存器类型来构建两位的D触发器如下:reg[1:0]Dout;.
.
.
.
.
always@(posedgeClk)Dout(大于)绝密请输入文档编号VerilogHDL入门教程2004-08-16第22页,共41页版权所有,侵权必究=(不小于)45结果为假(0),而:52='b01110等价于:'b01000>='b01110结果为假(0).
在逻辑相等与不等的比较中,只要一个操作数含有x或z,比较结果为未知(x),如:假定:Data='b11x0;Addr='b11x0;那么:Data==Addr比较结果不定,也就是说值为x.
4.
6.
3逻辑运算符逻辑运算符有:&&(逻辑与)||(逻辑或)!
(逻辑非)用法为:(表达式1)逻辑运算符(表达式2).
.
.
.
这些运算符在逻辑值0(假)或1(真)上操作.
逻辑运算的结果为0或1.
例如,假定:Crd='b0;//0为假Dgs='b1;//1为真那么:Crd&&Dgs结果为0(假)Crd||Dgs结果为1(真)!
Dgs结果为0(假)逻辑与(&&)的真值表如下:表1逻辑与真值表绝密请输入文档编号VerilogHDL入门教程2004-08-16第23页,共41页版权所有,侵权必究xxxX/Z(不定)x101(真)x000(假)X/Z(不定)1(真)0(假)&&逻辑或的真值表如下:表2逻辑或真值表x1xx/z(不定)1111x100x/z(不定)1(真)0(假)||4.
6.
4按位逻辑运算符按位运算符有:~(一元非):(相当于非门运算)&(二元与):(相当于与门运算)|(二元或):(相当于或门运算)^(二元异或):(相当于异或门运算)二元异或非即同或):(相当于同或门运算)这些操作符在输入操作数的对应位上按位操作,并产生向量结果.
下表显示对于不同按位逻辑运算符按位操作的结果:图7按位逻辑运算符真值表例如,假定,绝密请输入文档编号VerilogHDL入门教程2004-08-16第24页,共41页版权所有,侵权必究A='b0110;B='b0100;那么:A|B结果为0110A&B结果为0100如果操作数长度不相等,长度较小的操作数在最左侧添0补位.
例如,'b0110^'b10000与如下式的操作相同:'b00110^'b10000结果为'b10110.
4.
6.
5条件运算符条件操作符根据条件表达式的值选择表达式,形式如下:cond_exprexpr1:expr2如果cond_expr为真(即值为1),选择expr1;如果cond_expr为假(值为0),选择expr2.
如果cond_expr为x或z,结果将是按以下逻辑expr1和expr2按位操作的值:0与0得0,1与1得1,其余情况为x.
如下所示:wire[2:0]Student=Marks>18Grade_A:Grade_C;计算表达式Marks>18;如果真,Grade_A赋值为Student;如果Marks<=18,Grade_C赋值为Student.
4.
6.
6连接运算符连接操作是将小表达式合并形成大表达式的操作.
形式如下:{expr1,expr2,.
.
.
,exprN}实例如下所示:wire[7:0]Dbus;assignDbus[7:4]={Dbus[0],Dbus[1],Dbus[2],Dbus[3]};//以反转的顺序将低端4位赋给高端4位.
assignDbus={Dbus[3:0],Dbus[7:4]};//高4位与低4位交换.
由于非定长常数的长度未知,不允许连接非定长常数.
例如,下列式子非法:{Dbus,5}//不允许连接操作非定长常数.
4.
7条件语句if语句的语法如下:if(condition_1)procedural_statement_1绝密请输入文档编号VerilogHDL入门教程2004-08-16第25页,共41页版权所有,侵权必究{elseif(condition_2)procedural_statement_2}{elseprocedural_statement_3}如果对condition_1求值的结果为个非零值,那么procedural_statement_1被执,如果condition_1的值为0、x或z,那么procedural_statement_1不执行.
如果存在一个else分支,那么这个分支被执行.
以下是一个例子.
if(Sum<60)beginGrade=C;Total_C=Total_c+1;endelseif(Sum<75)beginGrade=B;Total_B=Total_B+1;endelsebeginGrade=A;Total_A=Total_A+1;end注意条件表达式必须总是被括起来,如果使用if-if-else格式,那么可能会有二义性,如下例所示:if(Clk)if(Reset)Q=0;elseQ=D;问题是最后一个else属于哪一个if它是属于第一个if的条件(Clk)还是属于第二个if的条件(Reset)这在VerilogHDL中已通过将else与最近的没有else的if相关联来解决.
在这个例子中,else与内层if语句相关联.
以下是另一些if语句的例子.
if(Sum<100)Sum=Sum+10;if(Nickel_In)Deposit=5;绝密请输入文档编号VerilogHDL入门教程2004-08-16第26页,共41页版权所有,侵权必究elseif(Dime_In)Deposit=10;elseif(Quarter_In)Deposit=25;elseDeposit=ERROR;书写建议:1、条件表达式需用括号括起来.
2、若为if-if语句,请使用块语句begin---end:if(Clk)beginif(Reset)Q=0;elseQ=D;end以上两点建议是为了使代码更加清晰,防止出错.
3、对if语句,除非在时序逻辑中,if语句需要有else语句.
若没有缺省语句,设计将产生一个锁存器,锁存器在ASIC设计中有诸多的弊端(可看同步设计技术所介绍).
如下一例:if(T)Q=D;没有else语句,当T为1(真)时,D被赋值给Q,当T为0(假)时,因为没有else语句,电路保持Q以前的值,这就形成一个锁存器.
4.
8case语句case语句是一个多路条件分支形式,其语法如下:case(case_expr)case_item_expr{,case_item_expr}:procedural_statement.
.
.
.
.
.
[default:procedural_statement]endcasecase语句首先对条件表达式case_expr求值,然后依次对各分支项求值并进行比较,第一个与条件表达式值相匹配的分支中的语句被执行.
可以在1个分支中定义多个分支项;这些值不需要互斥.
缺省分支覆盖所有没有被分支表达式覆盖的其他分支.
例:case(HEX)4'b0001:LED=7'b1111001;//1绝密请输入文档编号VerilogHDL入门教程2004-08-16第27页,共41页版权所有,侵权必究4'b0010:LED=7'b0100100;//24'b0011:LED=7'b0110000;//34'b0100:LED=7'b0011001;//44'b0101:LED=7'b0010010;//54'b0110:LED=7'b0000010;//64'b0111:LED=7'b1111000;//74'b1000:LED=7'b0000000;//84'b1001:LED=7'b0010000;//94'b1010:LED=7'b0001000;//A4'b1011:LED=7'b0000011;//B4'b1100:LED=7'b1000110;//C4'b1101:LED=7'b0100001;//D4'b1110:LED=7'b0000110;//E4'b1111:LED=7'b0001110;//Fdefault:LED=7'b1000000;//0endcase书写建议:case的缺省项必须写,防止产生锁存器.
5结构建模在3.
3.
1中,我们已简单介绍了结构化的描述方式,本章节再总结一下.
5.
1模块定义结构我们已经了解到,一个设计实际上是由一个个module组成的.
一个模块module的结构如下:modulemodule_name(port_list);Declarations_and_Statementsendmodule在结构建模中,描述语句主要是实例化语句,包括对VerilogHDL内置门如与门(and)异或门(xor)等的例化,如3.
3.
1节中全加器的xor门的调用;及对其他器件的调用,这里的器件包括FPGA厂家提供的一些宏单元以及设计者已经有的设计.
在实际应用中,实例化语句主用指后者,对内置门建议不采纳,而用数据流或行为级方式对基本门电路的描述.
端口队列port_list列出了该模块通过哪些端口与外部模块通信.
5.
2模块端口绝密请输入文档编号VerilogHDL入门教程2004-08-16第28页,共41页版权所有,侵权必究模块的端口可以是输入端口、输出端口或双向端口.
缺省的端口类型为线网类型(即wire类型).
输出或输入输出端口能够被重新声明为reg型.
无论是在线网说明还是寄存器说明中,线网或寄存器必须与端口说明中指定的长度相同.
下面是一些端口说明实例.

moduleMicro(PC,Instr,NextAddr);//端口说明input[3:1]PC;output[1:8]Instr;inout[16:1]NextAddr;//重新说明端口类型:wire[16:1]NextAddr;//该说明是可选的,因为缺省的就是wire类型,但如果指定了,就必须与它的端口说明保持相同长度,这里定义线的位宽16,是总线.
reg[1:8]Instr;//Instr已被重新说明为reg类型,因此它能在always语句或在initial语句中赋值.
.
.
.
endmodule5.
3实例化语句1.
例化语法一个模块能够在另外一个模块中被引用,这样就建立了描述的层次.
模块实例化语句形式如下:module_nameinstance_name(port_associations);信号端口可以通过位置或名称关联;但是关联方式不能够混合使用.
端口关联形式如下:port_expr//通过位置.
.
PortName(port_expr)//通过名称.
例[1]:.
.
.
.
moduleand(C,A,B);inputA,B;outputC;.
.
.
andA1(T3,A,B);//实例化时采用位置关联,T3对应输出端口C,A对应A,B对应B.
andA2(//实例化时采用名字关联,.
C是and器件的端口,其与信号T3相连.
C(T3),.
A(A),.
B(B));绝密请输入文档编号VerilogHDL入门教程2004-08-16第29页,共41页版权所有,侵权必究.
.
.
.
port_expr可以是以下的任何类型:1)标识符(reg或net)如.
C(T3),T3为wire型标识符.
2)位选择,如.
C(D[0]),C端口接到D信号的第0bit位.
3)部分选择,如.
Bus(Din[5:4]).
4)上述类型的合并,如.
Addr({A1,A2[1:0]}.
5)表达式(只适用于输入端口),如.
A(wireZire=0).
建议:在例化的端口映射中请采用名字关联,这样,当被调用的模块管脚改变时不易出错.

2.
悬空端口的处理在我们的实例化中,可能有些管脚没用到,可在映射中采用空白处理,如:DFFd1(.
Q(QS),.
Qbar(),.
Data(D),.
Preset(),//该管脚悬空.
Clock(CK));//名称对应方式.
对输入管脚悬空的,则该管脚输入为高阻Z,输出管脚被悬空的,该输出管脚废弃不用.
3.
不同端口长度的处理当端口和局部端口表达式的长度不同时,端口通过无符号数的右对齐或截断方式进行匹配.

例如:moduleChild(Pba,Ppy);input[5:0]Pba;output[2:0]Ppy;.
.
.
endmodulemoduleTop;wire[1:2]Bdl;wire[2:6]Mpr;ChildC1(Bdl,Mpr);endmodule绝密请输入文档编号VerilogHDL入门教程2004-08-16第30页,共41页版权所有,侵权必究在对Child模块的实例中,Bdl[2]连接到Pba[0],Bdl[1]连接到Pba[1],余下的输入端口Pba[5]、Pba[4]和Pba[3]悬空,因此为高阻态z.
与之相似,Mpr[6]连接到Ppy[0],Mpr[5]连接到Ppy[1],Mpr[4]连接到Ppy[2].
参见下图:图8端口匹配5.
4结构化建模具体实例对一个数字系统的设计,我们采用的是自顶向下的设计方式.
可把系统划分成几个功能模块,每个功能模块再划分成下一层的子模块.
每个模块的设计对应一个module,一个module设计成一个verilogHDL程序文件.
因此,对一个系统的顶层模块,我们采用结构化的设计,即顶层模块分别调用了各个功能模块.
下面以一个实例(一个频率计数器系统)说明如何用HDL进行系统设计.
在该系统中,我们划分成如下三个部分:2输入与门模块,LED显示模块,4位计数器模块.
系统的层次描述如下:CNT_BCD(CNT_BCD.
v)AND2(AND2.
v)CNT_4b(CNT_4b.
v)HEX2LED(HEX2LED.
v)TOPSub图9系统层次描述顶层模块CNT_BCD,文件名CNT_BCD.
v,该模块调用了低层模块AND2、CNT_4b和HEX2LED.
系统的电路结构图如下:图10系统电路框图绝密请输入文档编号VerilogHDL入门教程2004-08-16第31页,共41页版权所有,侵权必究顶层模块CNT_BCD对应的设计文件CNT_BCD.
v内容为:moduleCNT_BCD(BCD_A,BCD_B,BCD_C,BCD_D,CLK,GATE,RESET);PortdeclarationsinputCLK;inputGATE;inputRESET;output[3:0]BCD_A;output[3:0]BCD_B;output[3:0]BCD_C;output[3:0]BCD_D;wireCLK;wireGATE;wireRESET;wire[3:0]BCD_A;wire[3:0]BCD_B;wire[3:0]BCD_C;wire[3:0]BCD_D;SignaldeclarationswireNET104;wireNET116;wireNET124;wireNET132;wireNET80;wireNET92;ComponentinstantiationsCNT_4bU0(.
CLK(CLK),.
ENABLE(GATE),.
FULL(NET80),.
Q(BCD_A),.
RESET(RESET));CNT_4bU1(.
CLK(CLK),.
ENABLE(NET116),绝密请输入文档编号VerilogHDL入门教程2004-08-16第32页,共41页版权所有,侵权必究.
FULL(NET92),.
Q(BCD_B),.
RESET(RESET));CNT_4bU2(.
CLK(CLK),.
ENABLE(NET124),.
FULL(NET104),.
Q(BCD_C),.
RESET(RESET));CNT_4bU3(.
CLK(CLK),.
ENABLE(NET132),.
Q(BCD_D),.
RESET(RESET));AND2U4(.
A0(NET80),.
A1(GATE),.
Y(NET116));AND2U5(.
A0(NET92),.
A1(NET116),.
Y(NET124));AND2U6(.
A0(NET104),.
A1(NET124),.
Y(NET132));endmodule绝密请输入文档编号VerilogHDL入门教程2004-08-16第33页,共41页版权所有,侵权必究注意:这里的AND2是为了举例说明,在实际设计中,对门级不要重新设计成一个模块,同时对涉及保留字的(不管大小写)相类似的标识符最好不用.
6数据流建模在3.
3.
2节中,我们已经初步了解到数据流描述方式,本节对数据流的建模方式进一步讨论,主要讲述连续赋值语句、阻塞赋值语句、非阻塞赋值语句,并针对一个系统设计频率计数器的实例进行讲解.
6.
1连续赋值语句数据流的描述是采用连续赋值语句(assign)语句来实现的.
语法如下:assignnet_type=表达式;连续赋值语句用于组合逻辑的建模.
等式左边是wire类型的变量.
等式右边可以是常量、由运算符如逻辑运算符、算术运算符参与的表达.
如下几个实例:wire[3:0]Z,Preset,Clear;//线网说明assignZ=Preset&Clear;//连续赋值语句wireCout,Cin;wire[3:0]Sum,A,B;.
.
.
assign{Cout,Sum}=A+B+Cin;assignMux=(S==3)D:'bz;注意如下几个方面:1、连续赋值语句的执行是:只要右边表达式任一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号.
2、连续赋值语句之间是并行语句,因此与位置顺序无关.
6.
2阻塞赋值语句"="用于阻塞的赋值,凡是在组合逻辑(如在assign语句中)赋值的请用阻塞赋值.
更深的知识以后再讲.
6.
3数据流建模具体实例以上面的频率计数器为例,其中的AND2模块我们用数据流来建模.
AND2模块对应文件AND2.
v的内容如下:moduleAND2(A0,A1,Y);inputA0;inputA1;outputY;绝密请输入文档编号VerilogHDL入门教程2004-08-16第34页,共41页版权所有,侵权必究wireA0;wireA1;wireY;//addyourcodehereassignY=A0&A1;endmodule7行为建模在3.
3.
3节中,我们已经对行为描述方式有个概念,这里对行为建模进一步的描述,并通过一个系统设计频率计数器加以巩固.
7.
1简介行为建模方式是通过对设计的行为的描述来实现对设计建模,一般是指用过程赋值语句(initial语句和always语句)来设计的称为行为建模.
7.
2顺序语句块语句块块提供将两条或更多条语句组合成语法结构上相当于一条语句的机制.
这里主要讲VerilogHDL的顺序语句块(begin.
.
.
end):语句块中的语句按给定次序顺序执行.
顺序语句块中的语句按顺序方式执行.
每条语句中的时延值与其前面的语句执行的模拟时间相关.
一旦顺序语句块执行结束,跟随顺序语句块过程的下一条语句继续执行.
顺序语句块的语法如下:begin[:block_id{declarations}]procedural_statement(s)end例如://产生波形:begin#2Stream=1;#5Stream=0;#3Stream=1;#4Stream=0;#2Stream=1;#5Stream=0;end绝密请输入文档编号VerilogHDL入门教程2004-08-16第35页,共41页版权所有,侵权必究假定顺序语句块在第10个时间单位开始执行.
两个时间单位后第1条语句执行,即第12个时间单位.
此执行完成后,下1条语句在第17个时间单位执行(延迟5个时间单位).
然后下1条语句在第20个时间单位执行,以此类推.
该顺序语句块执行过程中产生的波形如图:图11顺序语句块中积累延时7.
3过程赋值语句VerilogHDL中提供两种过程赋值语句initial和always语句,用这两种语句来实现行为的建模.
这两种语句之间的执行是并行的,即语句的执行与位置顺序无关.
这两种语句通常与语句块(begin.
.
.
.
end)相结合,则语句块中的执行是按顺序执行的.
1.
initial语句initial语句只执行一次,即在设计被开始模拟执行时开始(0时刻).
通常只用在对设计进行仿真的测试文件中,用于对一些信号进行初始化和产生特定的信号波形.

BuyVM迈阿密KVM上线,AMD Ryzen 3900X+NVMe硬盘$2/月起

BuyVM在昨天宣布上线了第四个数据中心产品:迈阿密,基于KVM架构的VPS主机,采用AMD Ryzen 3900X CPU,DDR4内存,NVMe硬盘,1Gbps带宽,不限制流量方式,最低$2/月起,支持Linux或者Windows操作系统。这是一家成立于2010年的国外主机商,提供基于KVM架构的VPS产品,数据中心除了新上的迈阿密外还包括美国拉斯维加斯、新泽西和卢森堡等,主机均为1Gbps带...

Linode十八周年及未来展望

这两天Linode发布了十八周年的博文和邮件,回顾了过去取得的成绩和对未来的展望。作为一家运营18年的VPS主机商,Linode无疑是有一些可取之处的,商家提供基于KVM架构的VPS主机,支持随时删除(按小时计费),可选包括美国、英国、新加坡、日本、印度、加拿大、德国等全球十多个数据中心,所有机器提供高出入网带宽,最低仅$5/月($0.0075/小时)。This month marks Linod...

iON Cloud:七月活动,洛杉矶CN2 GIA线路85折优惠中,价格偏高/机器稳定/更新优惠码

iON Cloud怎么样?iON Cloud是Krypt旗下的云服务器品牌,成立于2019年,是美国老牌机房(1998~)krypt旗下的VPS云服务器品牌,主打国外VPS云服务器业务,均采用KVM架构,整体性能配置较高,云服务器产品质量靠谱,在线率高,国内直连线路,适合建站等用途,支付宝、微信付款购买。支持Windows server 2012、2016、2019中英文版本以及主流Linux发行...

morphvoxpro教程为你推荐
青岛市建设工程电子交易系统桂林飞宇科技股份有限公司V1.2支持ipad支持ipad支持ipad司机苹果5netbios端口怎么关闭8909端口!其他端口就不用了netbios端口如何组织netbios端口的外部通信win10关闭445端口在win10 如何关闭445端口的最新相关信息ipad上网新买的ipad怎么用。什么装程序 怎么上网
中国万网域名注册 bluehost 博客主机 128m内存 卡巴斯基官方免费版 免费申请个人网站 卡巴斯基免费试用 免费phpmysql空间 网游服务器 中国电信宽带测速器 个人免费主页 根服务器 web服务器是什么 游戏服务器出租 广州虚拟主机 华为k3 免费网络空间 国内空间 美国主机侦探 accountsuspended 更多