文档库 最新最全的文档下载
当前位置:文档库 › 利器:HLSL起步教程-完整篇

利器:HLSL起步教程-完整篇

HLSL起步

作者:XX

目录

目录 (1)

前言 (2)

1.HLSL入门 (14)

1.1什么是着色器 (14)

1.2什么是HLSL (15)

1.3怎么写HLSL着色器 (15)

1.3.1全局变量 (16)

1.3.2输入输出 (16)

1.3.3入口函数 (16)

1.3.4总结 (17)

1.4怎么用HLSL着色器 (17)

1.4.1声明全局变量 (17)

1.4.2编译着色器 (17)

1.4.3创建着色器 (18)

1.4.4把着色器设定到渲染管道中 (18)

1.4.5整个渲染过程如下 (18)

2.顶点着色器 (42)

2.1可编程数据流模型 (42)

2.2顶点声明 (43)

2.2.1 描述顶点声明 (43)

2.2.2创建顶点声明 (44)

2.2.3设置顶点声明 (44)

2.3用顶点着色器实现渐变动画 (44)

2.3.1渐变动画(Morphing) (44)

2.3.2渐变动画中的顶点声明 (45)

2.3.3渐变动画中的顶点着色器 (45)

2.3.4应用程序 (47)

2.3.5对应用程序的一点说明 (49)

3.像素着色器 (52)

3.1多纹理化 (52)

3.2多纹理效果的像素着色器 (52)

3.2.1HLSL采样器和纹理 (53)

3.3应用程序 (54)

4.HLSL Effect(效果框架) (58)

4.1Effect代码结构 (58)

4.2用Effect实现多纹理化效果 (58)

4.2.1着色器 (58)

4.2.2应用程序 (60)

结语 (64)

参考资料 (64)

前言

本教程针对HLSL(High Level Shading Language)初学者,从应用的角度对HLSL、顶点着色器、像素着色器和Effect效果框架进行了介绍,教程中去掉了对HLSL语法等一些细节内容的讨论,力求帮助读者尽可能快地理解HLSL编程的概念,掌握HLSL编程的方法。

教程中部分阐述直接引用了其他文档,这是因为这些文档表述之精要,已经达到了不能更改的地步,这里表示感谢。

本文档版权为作者所有,非商业用途可免费使用,转载请注明出处。

一点点历史….

从1995年,3Dfx发布第一块消费级的3D硬件加速图形卡开始,计算机图形技术和相关的硬件技术都取得了重大进展。虽然这类图形卡在渲染功能上有诸多限制,但为开发者打开了一片新的天地,终结了只能依靠软件解决方案进行渲染的时代。其结果是让实时3D图形和游戏都变得更加真实。

此后,接下来的几代硬件都在性能和功能方面有了重大突破。但是,由于受到硬件固定管线构架(fixed-pipeline arch itecture)的限制,仍然有很多约束,开发者被强制只能通过使用和改变渲染状态来控制渲染过程,获得最终的输出图形。

固定管线构架功能上的局限性,限制了开发者创建所需效果的能力。总的来说,它所产生的图形都不够真实。另一方面,用于电影CG渲染的高端软件渲染构架则发明了一些让渲染更加逼真的方法。Pixar Animation Studios开发了一门称为RenderMa n的着色语言。它的目的是让艺术家和开发者使用一门简单但强大的编程语言来完全控制渲染过程。RenderMan可以创建出高质量的图形,从照片级的真实效果,到卡通风格的非真实渲染效果都可以实现。被广泛用于当今的电影中,包括著名的动画Toy Story 和A Bug’s Life。

随着处理器芯片制造技术的革新,和处理能力的增强,RenderMan的思想逐渐影响并延伸到了消费级图形硬件。DirectX 8的发布引入了顶点(vertex)和像素着色器(pixel shader)1.0 以及1.1版本。虽然这两个版本的着色模型灵活性不高,同时缺乏流程控制等一些功能。但是,这第一步,给予了艺术家和开发者长久以来所梦想的,创造夺目的、真实的图形的能力。消费级图形卡所生产的图形终于能和好莱坞电影工作室所渲染出的图形相比了。

接下来的几年间,图像硬件和3D API无论在功能和性能上都取得了巨大飞跃,甚至打破了摩尔定律中的技术进步速率。随着DirectX 9.0 SDK以及最新的一代图形卡的发布,比如Nvidia的Geforce FX系列和ATI的Radeon 9800系列,顶点和像素着色器发展到了2.0和2.x版本。以及随后的3.x版本。

注意:

摩尔定律是1965年,由戈登摩尔(Gordon Moore)——intel的创建者之一,通过统计得出的结论:集成电路上可容纳的晶体管数目,约每隔一年便会增加一倍。他还预测在以后的几十年中仍然将是这样。至今为止,这条理论依然很正确。

另外,由于晶体管数量与集成电路的性能有关,因此,摩尔定律也是硬件性能增长的预测的依据。

这些新的着色模型为实时图像程序开发者带来了前所未有的灵活性。然而,大部分shader都通过一种低级的,类似于汇编的语言来编写的。这意味着作为一名开发人员,你必须像多年前使用汇编语言的时代那样,自己管理寄存器,分配变量以及优化。此外,shader model 2.0和3.0增加的复杂性让开发人员更加头疼,因为不同的图形卡寄存器数量不一样,甚至同样的指令执行结果也不一样。

为了简化shader开发,同时,给予硬件开发者更多的自由优化性能,微软在DirectX 9.0中引入了High-Level Shading La nguage(HLSL)。这门语言和其他高级语言,比如C或C++很类似,这样,开发者就能把注意力集中在shader所要实现的功能上,而不是把精力放在如何使用寄存器,或对某种硬件如何组合指令才能最优化之类的琐碎问题上。

在讲解HLSL能做什么,以及如何来使用它之前,先来看看不同的shader版本可以提供哪些功能。需要说明的是,在编写shader之前,需要知道硬件都有哪些功能(capable)。使用HLSL并不能消除特定硬件平台上的限制,但却可以把这些限制隐藏起来。

顶点和像素着色器管线以及Capabilities

与随DirectX 8.0发布的顶点和像素着色器1.0和1.1版本相比,shader model 2.0对语言进行了许多重要改进。由于最新的DirectX 9.0所使用的顶点和像素着色器版本为2.0,同时,已经有大量支持vertex和pixel 2.0的显卡,所以本书主要讨论基于这一技术的shader。

注意:

虽然在编写本书时,支持shader model 3.0的图形卡已经开始上市,但尚未普及。我们会讨论一些shader model 3.0的特性,但大部分例子都是基于2.0或更低版本的shader技术。

假设你已经有一定的3D和shader基础知识,我们来看看第二代着色语言和上一代技术相比有哪些比较重要的改变。

顶点着色器2.0和2.x相对于1.x的版本有如下改进:

●支持整数和布尔数据类型,并分别有相应的设置指令。

●增加了临时和常量寄存器的数量。

●对程序所能包含的最大指令数进行了增加,给开发者以更多灵活性(标准所要求的最小指令数从128增加到了256,

某些硬件还能支持更多指令)。

●添加了许多支持复杂运算的宏指令,比如sine/cosine,absolute,以及power等。

●支持流程控制语句,比如循环和条件测试。

下面列出的则是像素着色器 2.0和2.x相对于1.x版本的改进:

●支持扩展32-bit精度的浮点运算。

●支持对寄存器元素的任意重组(swizzling)和遮罩(masking)。

●增加了常量和临时寄存器的可用数量。

●标准所允许的最小指令卡有明显增加。算术指令从8条增加到64条,同时还允许使用32条纹理指令。像素着色器

2.x默认情况下甚至支持更多指令,允许硬件支持比标准最小要求多的指令数。

●支持整数和布尔常量,循环计数器以及断言寄存器(predicate register)。

●支持动态流程控制,包括循环和分支。

●Gradient instrctions allowing a shader to discover the dervate of any input register

通过这一系列强大的改进,如今,开发者可以自由发挥想象力,创造出令人吃惊的效果。到这里,我们应该学习一下两种着色器的构架,以便更好的了解数据是怎样在图形硬件上流动。

当渲染3D图形时,几何体信息通过Direct3D之类的渲染API传递给图形硬件。硬件一旦接收到这些信息,就为mesh 中的每一个顶点调用顶点程序。图1.1描绘了顶点和像素着色器2.0标准实现的原理图。

从图1.1中可以看到,开发者通过3D渲染API,以数据流的形式,为顶点着色器提供顶点数据。数据流中包含了正确渲染几何体所需的所有信息,包括顶点位置,颜色和纹理坐标等等。当这些信息传递进来时,将分别放到合适的输入寄存器v0到v15中,以便顶点着色程序使用。顶点程序还需要访问许多其他的寄存器,才能完成自己的工作。常量寄存器都是只读的,通常用来为shader储存静态数据,因此,必须预先设置好它们的值。顶点着色器2.0标准下,常量寄存器储存的都是矢量,可以保存浮点数,整数,以及布尔类型的值。需要注意,顶点着色器中所有的寄存器都把数据储存为包含4个分量的矢量,可以并行访问所有分量,也可以使用重组或遮罩分别访问某个分量。

在图1.1的右边部分,是临时寄存器,用来储存顶点着色器计算出的中间结果。显然,由于它们是临时性的,因此,可以对这些寄存器进行写入和读取操作。注意名称为a0到aL的寄存器,它们是循环时用来索引地址和追踪循环所用的计数寄存器(counter register)。记住,由于HLSL是一门高级的着色语言,你不需要关心寄存器是如何分配的。对开发者来说这个过程应该是透明的,并且只有在shader 被最终编译为机器代码时才发生。

在访问了输入寄存器,临时寄存器和常量寄存器之后,顶点着色器程序才开始以开发者所希望的方式来处理和控制输入的顶点。处理过程结束之后,结果立即被输送到最终的输出寄存器中。其中

true 这个关键字表示布尔类型中的true常量。详见第二章中关于数据类型的部分。

typedef 这个关键字用来定义一个新的数据类型。详见第二章中关于数据类型的部分。

uniform 这个变量用来把变量定义为uniform的,这表示在所有着色器运行时,这个变量的初始值都不会改变。

详见第二章中关于数据类型的部分。

vector 这个关键字用来表示一个矢量类型的数据。详见第二章中关于数据类型的部分。

vertexfragment 这个关键字用来定义一个顶点片断(或着色器)。

void 这个关键字表示一个void(或empty)数据类型。详见第二章中关于数据类型的部分。

volatile 这个关键字用来提示编译器一个变量将会频繁改变。详见第二章中关于数据类型的部分。

while 这个关键字用来定义条件do-while循环

上面这个表可能看起来太枯燥了,特别是对于HLSL的初学者,甚至会感到有些迷惑。不要担心。这本书既是学习指南也是参考书。表1-1中的信息主要作为参考信息来使用。当我们学习HLSL语法和示例程序时,你就知道如何来使用它了。这一章里,我将会指出HLSL中所有主要的语法和文法(grammar)元素。在以后章节中再逐渐深入。

除了表1-1中的关键字外,还有一系列HLSL目前没有使用的保留关键字。这些关键字是为今后语言扩充所预留的,表1-2列出了这些保留关键字:

表1-2 HLSL保留关键字

auto break case catch

default delete dynamic_case enum

explicit end goto long

mutable namespace new operator

private protected public reinterpret_case

short signed sizeof static_cast

switch template this throw

try typename union unsigned

using virtual

词汇约定

虽然语法定义了如何把所有语言元素组合到一起,比如,如何定义函数和代码片段,但它只定义了如何把表达式和操作符以及标识符一起使用。这意味着语言的语法并没有定义文法(例如:什么是标识符)。接下来的几段详细解释了HLSL编译器中的词汇约定。

空白字符

HLSL语言中,下面这些字符都被认为是空白字符:

●空格

●Tab字符

●换行符

●C风格的注解(/* */)。

●C++风格的注解(// )。

●asm代码块中,汇编风格的注解(;)。

数字

HLSL中的数字可以为浮点类型,也可以为整型。浮点数通常有以下呈现形式:

Float:( fractional-constant [ exponent-part ] [ float-suffix ] )|

(digit-sequence exponent-part [ float-suffix ] )

Fractnal-const: ( [digit –sequence] . digit –sequence ) | (digit –squence . )

Sign: + | -

Dight –sequence:digit | (digit –sequence digit )

floating –suffix: h | H | f | F

整型的语法与此类似:

Integer:integer –constant [ interger –suffix ]

Integer –constant:digit –sequence | ( 0 digit –sequence ) | ( 0 ×digit –sequence )

Digit –sequence:digit | ( digit –sequence digit )

Integer –suffix:u | U | l | L

字符

HLSL允许定义字符和字符串。字符串都是由字符组成。下面是字符的定义:

●‘ c ‘ (字符)

●‘ \t ‘ , ‘ \n ‘,…..( 转义字符)

●‘ \### ‘ (八进制换码顺序)

●‘ \x## ‘ (十六进制换码顺序)

注意

预处理指令中不能包含转义字符。

字符串包含在一对引号中,可以包含前面所述的任意有效字符组合。

标识符

标识符用来表示函数名或变量名之类的语言元素。除了前面所列的关键字以外,标识符可以是字母和数字的任意组合,但必须保证第一个字符为字母。

操作符

HLSL定义了一组操作符,以便在表达式中使用。表1-5 列出了所有标准操作符,以及他们的含义。如果你熟悉

C或C++,那么这些操作符对你来说应该是一目了然的。

表1-5 HLSL 操作符

操作符描述

++ 一元加法。

-- 一元减法。

&& 逻辑与。

|| 逻辑或。

== 等号。

:: 成员标识符(用于结构和类)。

<< 二进制左移。

<<= 自赋值(self assigning)二进制左移,a<<= b等于a = a<

>> 二进制右移。

>>= 自赋值二进制右移,a>>=b等于a = a>>b。

…省略符(用于可变参数函数)。

<= 小于等于。

>= 大于等于。

!= 不等于。

*= 自赋值乘法,a *= b 等于a = a * b。

/= 自赋值除法,a /= b 等于a = a / b。

+= 自赋值加法,a += b 等于a = a + b。

-= 自赋值减法,a -= b 等于a = a –b。

%= 自赋值求余,a %= b 等于a = a % b。

&= 自赋值逻辑与,a &= b 等于a = a & b。

|= 自赋值逻辑或,a |= b 等于a = a | b。

^= 自赋值求幂,a ^= b 等于a = a ^ b。

-> 重定向操作符,用来访问结构成员。

语言语法

HLSL语言的语法相当简单。初看可能有些复杂,但只要使用它写几个程序,你马上就能掌握要领。目前为止,你不应该对语法太过担心,后面的章节我们将逐步了解语言的每个部分。由于实际的语法表相当长,我决定单独把他放到附录D中。另外你也可以参考DirectX SDK获取更多信息。

(译注:请参考DirectX SDK中DirectX Graphics--Reference--HLSL Shader Reference--Appendix中的Language Syntax部分)

观察表的第一行,可以看到HLSL程序被定义为一个program。每个program要么为空,要么包含一系列decl(声明)。最初的两行表示每个decls可以由多条其它decl组成。你可能已经注意到,声明可以用来定义空白语句,类型声明,变量声明,结构声明,函数声明或technique声明。语义定义了不同声明类型等等。

小结以及接下来的内容

在这一章里,我们简要概括了DirectX和shader技术在过去几年间的发展和历史。随着shader model 2.0和3.0复杂度的增加,开发者不但需要利用语言的所有新能力,同时,还需要高效的完成任务。由于新着色管道的指令和通用处理器上的指令越来越类似,因此,开发一门高级语言,让开发者把注意力集中在shader所要实现的功能上,而不是把精力放在如何使用寄存器,或对某种硬件如何组合指令才能最优化之类的琐碎问题上是很有意义的。

在需求的驱动下,微软开发并通过DirectX SDK发布了HLSL着色语言,帮助开发者使用最新的图形技术,创建更加真实

的图形。本章,我们学习了很多语法背后的基础知识。虽然这章看起来有些枯燥,不要担心,随后的几个章节我们就会讨论一些比较有趣的内容。

1.HLSL入门

1.1什么是着色器

DirectX使用管道技术(pipeline)进行图形渲染,其构架如下:

图1.1 Direct3D Graphics Pipeline

之前我们使用管道的步骤如下:

1. 设定顶点、图元、纹理等数据信息;

2. 设定管道状态信息;

渲染状态

通过SetRenderState方法设定渲染状态;

另外,使用以下方法设置变换、材质和光照:

SetTransform

SetMaterial

SetLight

LightEnable

取样器状态

通过SetSamplerState方法设定取样器状态;

纹理层状态

通过SetTextureStageState设定纹理层状态;

3. 渲染;

这部分交由D3D管道按照之前的设定自行完成,这部分操作是D3D预先固定的,所以这种管道技术被称为固定功能管道(fixed function pipeline);

固定功能管道给我们编程提供了一定的灵活性,但是仍有很多效果难以通过这种方式实现,比如:

1. 在渲染过程中,我们要求y坐标值大于10的顶点要被绘制到坐标值(0,0,0)的地方,在之前的固定功能管

道中,顶点被绘制的位置是在第1步即被设定好的,不可能在渲染过程中进行改变,所以是不可行的;

2. 某顶点在纹理贴图1上映射为点A,在纹理贴图2上映射为点B,我们要求该顶点颜色由A、B共同决定,即:

定点颜色= A点色彩值*0.7 + B点色彩值*0.3

这在固定管道编程中也是不可行的。

以上两个问题都可以由可编程管道(pragrammable pipeline)来解决。

可编程管线允许用户自定义一段可以在GPU上执行的程序,代替固定管道技术中的Vertex Processing和Pixel Processing阶段(参照图1.1),从而在使我们在编程中达到更大的灵活性。其中替换Vertex Processing的部分叫做Vertex Shader(顶点着色器),替换Pixel Proccessing的部分叫做Pixel Shader(像素着色器),这就是我们所说的着色器Shader。

1.2什么是HLSL

Direct8.x中,着色器是通过低级着色汇编语言来编写的,这样的程序更像是汇编式的指令集合,由于其效率低、可读性差、版本限制等缺点,迫切要求出现一门更高级的着色语言。到了Direct3D9,HLSL(High Level Shading Language,高级渲染语言)应运而生了。

HLSL的语法非常类似于C和C++,学习起来是很方便的。

1.3怎么写HLSL着色器

我们可以直接把HLSL着色器代码作为一长串字符串编写进我们的应用程序源文件中,但是,更加方便和模块化的方法是把着色器的代码从应用程序代码中分离出来。因此,我们将着色器代码单独保存为文本格式,然后在应用程序中使用特定函数将其加载进来。

下面是一个完整的HLSL着色器程序代码,我们把它保存在BasicHLSL.txt中。该着色器完成顶点的世界变换、观察变换和投影变幻,并将顶点颜色设定为指定的颜色。

//

// BasicHLSL.txt

//

//

// Global variable

//

matrix WVPMatrix;

vector color;

//

// Structures

//

struct VS_INPUT

{

vector position : POSITION;

};

struct VS_OUTPUT

{

vector position : POSITION;

vector color : COLOR;

};

//

// Functions

//

VS_OUTPUT SetColor(VS_INPUT input)

{

VS_OUTPUT output = (VS_OUTPUT)0;

output.position = mul(input.position, WVPMatrix);

output.color = color;

return output;

}

下面就针对上述代码讲解一下HLSL着色器程序的编写:

1.3.1全局变量

代码中声明了两个全局变量:

matrix WVPMatrix;

vector color;

变量WVPMatrix是一个矩阵类型,它包含了世界、观察、投影的合矩阵,用于对顶点进行坐标变换;

变量color是一个向量类型,它用于设定顶点颜色;

代码中并没有对全局变量进行初始化,这是因为我们对全局变量的初始化过程将在应用程序中进行,全局变量在应用程序中赋值而在着色器程序中使用,这是应用程序和着色器通信的关键所在。具体赋值过程将在后续部分讲述。

1.3.2输入输出

输入输出结构

程序中定义了两个输入输出结构VS_INPUT和VS_OUTPUT

struct VS_INPUT

{

vector position : POSITION;

};

struct VS_OUTPUT

{

vector position : POSITION;

vector color : COLOR;

};

自定义的结构可以采用任意名称,结构不过是一种组织数据的方式,并不是强制的,你也可以不使用,而将本程序的输入改为:

vector position : POSITION;

标志符

用于输入输出的变量采用用一种特殊的声明方式:

Type VariableName : Semantic

这个特殊的冒号语法表示一个语义,冒号后面的标志符用来指定变量的用途,如

vector position : POSITION;

其中,POSITION标志符表明该变量表示顶点位置,另外还有诸如COLOR、NORMAL等很多表示其他意义的标志符。

本节所说的输入输出其实是指着色器代码和编译器、GPU之间的通信,和应用程序是无关的,所以这些变量不需要在应用程序中进行赋值,标志符告诉编译器各个输入输出变量的用途(顶点位置、法线、颜色等),这是着色器代码和编译器、GPU之间通信的关键。

1.3.3入口函数

程序中还定义了一个函数SetColor:

OUTPUT SetColor(INPUT input)

{

VS_OUTPUT output = (VS_OUTPUT)0;

output.position = mul(input.position, WVPMatrix);

output.color = color;

return output;

}

1. 该函数以input和output类型作为输入输出;

2. 使全局变量WVPMatrix和input.position相乘,以完成顶点的世界、观察、投影变换,并把结果赋值到

output.position;

output.position = mul(input.position, WVPMatrix);

3. 将全局变量color的值赋给output.color;

output.color = color;

4. 在同一个着色器代码文件中,可以有多个用户自定义函数,因此在应用程序中需要指定一个入口函数,相当于

windows程序的WinMain函数,本程序只包含SetColor一个函数而且它将被做为入口函数使用。

1.3.4总结

至此,一个HLSL着色器编写完毕,渲染过程中,当一个顶点被送到着色器时:

1. 全局变量WVPMatrix、color将在应用程序中被赋值;

2. 入口函数SetColor被调用编译器根据标志符将顶点信息填充到VS_INPUT中的各个字段;

3. SetColor函数中,首先定义一个VS_OUTPUT信息,之后根据WVPMatrix和color变量完成顶点的坐标

变换和颜色设定操作,最后函数返回VS_OUTPUT结构;

4. 编译器将会再次根据标志符把返回的VS_OUTPUT结构中的各字段映射为顶点相应的信息。

5. 顶点被送往下一个流程接受进一步处理。

上述过程中,全局变量在应用程序中赋值而在着色器程序中使用,这是应用程序和着色器通信的关键所在;标志符告诉编译器各个输入输出变量的用途(顶点位置、法线、颜色等),这是着色器代码和编译器、GPU之间通信的关键。个人认为这是着色器中最为精义的地方:)

1.4怎么用HLSL着色器

应用程序中对HLSL着色器的使用分为以下步骤:

1. 加载(称为编译更为妥当)着色器代码;

2. 创建(顶点/像素)着色器;

3. 对着色器中的变量进行赋值,完成应用程序和着色器之间的通信。

4. 把着色器设定到渲染管道中;

本例使用的着色器是一个顶点着色器,因此我们将通过顶点着色器的使用来讲解着色器的使用过程,像素着色器的使用过程与此大同小异,二者之间仅有些微差别。

1.4.1声明全局变量

IDirect3DVertexShader9* BasicShader = 0; //顶点着色器指针

ID3DXConstantTable* BasicConstTable = 0; //常量表指针

D3DXHANDLE WVPMatrixHandle = 0;

D3DXHANDLE ColorHandle = 0;

ID3DXMesh* Teapot = 0; //指向程序中D3D茶壶模型的指针

1.4.2编译着色器

通过D3DXCompileShaderFromFile函数从应用程序外部的文本文件BasicHLSL.txt中编译一个着色器:

//编译后的着色器代码将被放在一个buffer中,可以通过ID3DXBuffer接口对其进行访问,之后的着色器将从这里创建

ID3DXBuffer* shaderBuffer = 0;

//用于接受错误信息

ID3DXBuffer* errorBuffer = 0;

//编译着色器代码

D3DXCompileShaderFromFile("BasicHLSL.txt", //着色器代码文件名

0,

0,

"SetColor", //入口函数名称

"vs_2_0", //顶点着色器版本号

D3DXSHADER_DEBUG,// Debug模式编译

&shaderBuffer, //指向编译后的着色器代码的指针

&errorBuffer,

&BasicConstTable); //常量表指针

1.4.3创建着色器

应用程序通过CreateVertexShader创建一个顶点着色器,注意使用了上一步得到的shaderBuffer:

g_pd3dDevice->CreateVertexShader((DWORD*)shaderBuffer->GetBufferPointer(), &BasicShader); 1.4.3对着色器中的变量进行赋值

1.3.4节说到着色器的全局变量在应用程序中赋值而在着色器程序中使用,这是应用程序和着色器通信的关键所在,这里就具体说明赋值过程。

着色器中的全局变量在编译后都被放在一个叫常量表的结构中,我们可以使用ID3DXConstantTable接口对其进行访问,参照1.4.1中编译着色器函数D3DXCompileShaderFromFile的最后一个参数,该参数即返回了指向常量表的指针。

对一个着色器中变量进行赋值的步骤如下:

1. 通过变量名称得到指向着色器变量的句柄;

还记得在BasicHLSL.x着色器文件中我们声明的两个全局变量吗:

matrix WVPMatrix;

vector color;

我们在应用程序中相应的声明两个句柄:

D3DXHANDLE WVPMatrixHandle = 0;

D3DXHANDLE ColorHandle = 0;

然后通过变量名得到分别得到对应的两个句柄:

WVPMatrixHandle = BasicConstT able->GetConstantByName(0, "WVPMatrix");

ColorHandle = BasicConstTable->GetConstantByName(0, "color");

2. 通过句柄对着色器变量进行赋值;

我们可以先设置各变量为默认值:

BasicConstTable->SetDefaults(g_pd3dDevice);

之后,可以使用ID3DXConstantT able::SetXXX函数对各个变量进行赋值:

HRESULT SetXXX(

LPDIRECT3DDEVICE9 pDevice,

D3DXHANDLE hConstant,

XXX value

);

其中XXX代表变量类型,例如Matrix类型的变量就要使用SetMatrix函数赋值,而Vector类型的则要使用SetVector来赋值。

1.4.4把着色器设定到渲染管道中

这里我们使用SetVertexShader方法把顶点着色器设定到渲染管道中:

g_pd3dDevice->SetVertexShader(BasicShader);

1.4.5整个渲染过程如下

在渲染过程中,我们设定顶点的变换坐标和颜色值,渲染代码如下:

g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,

D3DCOLOR_XRGB(153,153,153), 1.0f, 0 );

//开始渲染

g_pd3dDevice->BeginScene();

//得到世界矩阵、观察矩阵和投影矩阵

D3DXMATRIX matWorld, matView, matProj;

g_pd3dDevice->GetTransform(D3DTS_WORLD, &matWorld);

g_pd3dDevice->GetTransform(D3DTS_VIEW, &matView);

g_pd3dDevice->GetTransform(D3DTS_PROJECTION, &matProj);

D3DXMATRIX matWVP = matWorld * matView * matProj;

//通过句柄对着色器中的WVPMatrix变量进行赋值

BasicConstTable->SetMatrix(g_pd3dDevice, WVPMatrixHandle, &matWVP);

D3DXVECTOR4 color(1.0f, 1.0f, 0.0f, 1.0f);

//通过句柄对着色器中的color变量进行赋值,这里我们赋值为黄色

BasicConstTable->SetVector(g_pd3dDevice, ColorHandle, &color);

//把顶点着色器设定到渲染管道中

g_pd3dDevice->SetVertexShader(BasicShader);

//绘制模型子集

Teapot->DrawSubset(0);

//渲染完毕

g_pd3dDevice->EndScene();

g_pd3dDevice->Present(NULL, NULL, NULL, NULL);

编译运行程序,运行效果如图1.2所示,这里我们将顶点颜色设置为黄色,如果读者在渲染过程中不断变换对着色器变量color的赋值,你将会得到一个色彩不断变幻的D3D茶壶。

D3DXVECTOR4 color(1.0f, 1.0f, 0.0f, 1.0f); //读者可以尝试改变颜色值

BasicConstTable->SetVector(g_pd3dDevice, ColorHandle, &color);

图1.2 着色器效果

第二章HLSL着色语言

这一章我们将学习HLSL的大部分基本内容,包括丰富的变量类型,如何定义变量,和如何编写shader代码。你可能还想知道如何在shader中使用函数。虽然它们是使用HLSL编写shader的必须元素,但我还是决定把所有关于函数的内容作为单独一章来讲解。在第三章中,我们将详细讲解如何定义函数,以及HLSL为开发者所编写的内置函数。

在继续学习之前,需要进行一点点说明,读者在前一章学习HLSL语法时可能注意到了诸如techniques,渲染状态,pas s之类的概念。虽然它们也是HLSL语言的一部分,但事实上它们只在effect文件中使用,而effect 文件则是HLSL的一个超集。

好了,闲谈到此为止,让我们直接进入本章主题,讨论在任何语言中都是最重要的元素,数据类型。

数据类型

数据类型是任何一门编程语言的核心。没有它们你将无法定义变量或者在函数之间传递数据。如果连呈现数据的方法都没有,又怎么能储存数据呢?和其他高级语言一样,HLSL有一系列内置定义类型,可以把它们分为以下几类:

●标量类型

●矢量类型

●矩阵类型

●对象类型

除了上面的内置类型外,HLSL同样允许自定义的复合类型,比如数组和结构。在介绍HLSL特定数据类型前,先来仔细看看大部分3D硬件上呈现数据的方式。当处理数据时,基本的选项是浮点值,根据硬件构架的不同,这些值可能为16或32位。记住,虽然可以让硬件同一时间只处理一个值,但这并不是最高效的方法。相反,如果硬件每次处理一个包含四个分量值的单元(或矢量),那么则可以同时对四个分量进行处理。当然,这就需要考虑硬件如何来保存非矢量的值。我稍后会讲解这一点。

除了浮点值以外,较新的硬件也内置支持整型和布尔值,但它们主要用于分支,循环,和条件测试语句。接下来的几页中,我将浏览每一种数据类型,并解释如何来使用它们。

标量类型

标量类型是由HLSL标准定义的,他们是最基本的类型。所有复杂类型,比如矢量,矩阵,和结构都由标量组成。表2-1列出了所有可用的标量类型以及它们所表示的值。

表 2 -1 HLSL标量类型

标量类型值

bool true或false

int 32位有符号的整型

half 16位浮点数

float 32位浮点数

double 64位浮点数

需要注意并不是所有shader目标都天生支持整型,half和double值。如果要将shader编译为不支持指定类型数据的目标,那么将模拟处理float值的方式来处理它们。与使用原生(native)类型相比,结果可能不正确。在确定目标平台支持某个特定类型之前,为了保证一致性和可移植性,最好坚持使用标准浮点数。

注意

我们在上一章已经简要讨论过profile,它用来告诉HLSL编译器为哪种构架的shader产生代码。通常Profile的值直接对应于可用的顶点和像素着色器版本,但对于指令集没有改变的情况可能会有例外。

ModelSim使用的一点心得体会

ModelSim使用的一点心得- - 1、至今还没有弄明白为什么要用ModelSim,因为看波形Quartus II自带的工具就可以了啊。 2、我刚刚接触modelsim,我想大多数菜鸟跟我一样,看过如何使用ModelSim的介绍,说句实话,那些介绍写的都太过简单,仿佛大家都不屑写上一些比较“弱智”的步骤,恰恰就是这些看似累赘的步走,难为我好久。 教程上都写道,modelsim的简单使用方法如下:建立库- 影射库到物理目录- 编译代码- 启动仿真。首先建立库就叫我头晕。库的概念用在这儿实在不合适,把我吓坏了,也就没心思看下一步了。在我看来,教程应该这么写: <1> 建立一个目录modelsimStudy。用任何文本编辑器编辑一个简单的例子程序,比如计数器counter.vhd。有clk、ena、reset输入,cnt作为输出。 <2> 打开Modelsim,首先create project,工程名随意取了,比如命名为test,目录设在modelsimStudy下,默认的库work不变(这样就不用管什么建立库之类的东西了)。然后add existing file,把counter.vhd加入当前工程。 <3> 编译这个文件,通过之后,work下面会出现counter这个实体。然后选中它,右键,simulate(左键双击也可)。 <4> ModelSim有很多窗口(新手就怕这个),一开始只要选择view下面的objects 和wave窗口就行了。旧版的signal窗口在6.0的版本改名为Objects(这个我是摸索了好久才发现的,是不是太笨了?)。wave窗口刚打开时是空的,需要在objects窗口的add -> wave -> signals in region。这时,wave上就有clk\ ena \ reset等信号了。 <5> 我们给clk来个输入激励,在object窗口中选中clk,右键选clock,给它定义个时钟。

modelsim完美教程

准备事项 1.ModelSim试用版下载 2.范例程序下载(史丹佛大学一门课的期末专题Implememtation of Viterbi Decoder:constrain length K=3, code rate R=1/2, register-exchange) 整个project共含7个Verilog程序:system.v (top-level) |-- clkgen.v |-- chip_core.v |-- controller.v |-- spu.v |-- acs4.v |-- acs1.v (或是另外一个Verilog的简单例子,可以从C:\ SynaptiCAD\ Examples\ TutorialFiles\ VeriLoggerBasicVerilo gSimulation\ add4.v and add4test.v) (或是另外一个VHDL的简单例子,可以从C:\ Modeltech_5.7e\ examples\ adder.vhd and testadder.vhd) ModelSim PE /LE /SE 差别在哪? 本篇文章内容主要在教导软件使用,以Verilog程序为范例。假设各位读者已经熟悉Verilog,废话不多说,让我们马上来见识一下ModelSim ... 快速上手四部曲:建立Project、引进HDL Files、Compile、模拟(Simulate/Loading and Run) 1.建立一个新的Project 1-1 第一次执行程序时,可以从[开始] \ [程序集] \ ModelSim SE \ ModelSim;或是执行ModelSim在桌面的快捷方式

ModelSim-Altera_6.5仿真入门教程

平台 软件:ModelSim-Altera 6.5e (Quartus II 10.0) Starter Edition 内容 1 设计流程 使用ModelSim仿真的基本流程为: 图1.1 使用ModelSim仿真的基本流程 2 开始 2.1 新建工程 打开ModelSim后,其画面如图2.1所示。

图2.1 ModelSim画面 1. 选择File>New>Preject创建一个新工程。打开的Create Project对话框窗口,可以指定工程的名称、路径和缺省库名称。一般情况下,设定Default Library Name为work。指定的名称用于创建一个位于工程文件夹内的工作库子文件夹。该对话框如图 2.2所示,此外还允许通过选择.ini文件来映射库设置,或者将其直接拷贝至工程中。

图2.2 创建工程的对话框 2. 按照图2.3所示,设置Project Name为LED_FLOW,Project Location为D:/led_flow。 图2.3 输入工程信息 当单击OK按钮后,在主体窗口的下方将出现Project标签,如图2.4所示。 图2.4 Project标签

3. 之后,将出现Add Items to the Project的对话框,如图2.5所示。 图2.5 在工程中,添加新项目 2.2 在工程中,添加新项目 在Add Items to the Project对话框中,包括以下选项: ?Create New File——使用源文件编辑器创建一个新的Verilog、VHDL、TCL或文本文件?Add Existing File——添加一个已存在的文件 ?Create Simulation——创建指定源文件和仿真选项的仿真配置 ?Create New Folder——创建一个新的组织文件夹 1. 单击Create New File。打开图 2.6所示窗口。 图2.6 创建工程文件夹 2. 输入文件名称:LED_FLOW,然后选择文件类型为Verilog。

ModelSim软件仿真步骤教程

使用ModelSim模擬驗證HDL code 1.在模擬前先準備好我們要模擬的電路檔案(Verilog HDL,TestBench,…) 2. 打開ModelSim,新建一個Project,鍵入Project name 按OK。此處我們的library name 為default library name “work”不必更改。 3.然後再加入我們所要模擬的電路檔案(若尚未準備,可開啟新檔案再將code 鍵入)選Add Existing File,將我們已編輯好的檔案加入。 將我們所需要的檔案加入,按Browse選擇我們所需檔案count.v,

count_test.vt),按下OK。 再將先前所開啟的增加檔案的視窗關閉,按close。 4.按下compile all。

Compile成功沒有顯示出錯誤訊息, 則開始模擬波形 5.按下Simulation, 選擇檔案所在的Library (work), 點選TestBench的Module Name t_Gap_finder 按OK 6.承接上步驟將會跳出以下視窗,若要將所有訊號加入波型中觀察則選擇在 testbench的module name: count_tst按滑鼠右鍵選擇→ Add → Add to Wave。

7.在波型畫面按下Run All開始模擬 跑完後會跳出下面視窗選擇否則可觀察模擬波形,若按下是則會將ModelSim關閉。

8.觀察波形圖是否與功能符合,若與設計不符則修改設計並重複執行Step 4到 Step 8 Testbench語法 `timescale 1 ps/ 1 ps 前面的1ps代表程式中最小的時間單位 後面的1ps代表運算的精準度

QUARTUSⅡ10波形仿真(ModelSim)入门教程

QUARTUSⅡ10仿真(ModelSim)入门教程平台 软件:ModelSim-Altera 6.5e (Quartus II 10.0) Starter Edition 内容 1 设计流程 使用ModelSim仿真的基本流程为: 图1.1 使用ModelSim仿真的基本流程 2 开始 2.1 新建工程 打开ModelSim后,其画面如图2.1所示。 图2.1 ModelSim画面

1. 选择File>New>Preject创建一个新工程。打开的Create Project对话框窗口,可以指定工程的名称、路径和缺省库名称。一般情况下,设定Default Library Name为work。指定的名称用于创建一个位于工程文件夹内的工作库子文件夹。该对话框如图 2. 2所示,此外还允许通过选择.ini文件来映射库设置,或者将其直接拷贝至工程中。 图2.2 创建工程的对话框 2. 按照图2.3所示,设置Project Name为LED_FLOW,Project Location为D:/led_flow。 图2.3 输入工程信息 当单击OK按钮后,在主体窗口的下方将出现Create Project标签,如图2.4所示。 图2.4 Project标签 3. 之后,将出现Add Items to the Project的对话框,如图2.5所示。 图2.5 在工程中,添加新项目 2.2 在工程中,添加新项目 在Add Items to the Project对话框中,包括以下选项:

?Create New File——使用源文件编辑器创建一个新的Verilog、VHDL、TCL或文本文件 ?Add Existing File——添加一个已存在的文件 ?Create Simulation——创建指定源文件和仿真选项的仿真配置 ?Create New Folder——创建一个新的组织文件夹 1. 单击Create New File。打开图 2.6所示窗口。 图2.6 创建工程文件夹 2. 输入文件名称:LED_FLOW,然后选择文件类型为Verilog。 图2.7 输入工程文件信息 3. 单击OK,关闭本对话框。新的工程文件将会在工程窗口显示。单击Close,以关闭Add Items to the Project。 图2.8 新的设计文件LED_FLOW.v 4. 双击打开LED_FLOW.v文件(注意:若是Verilog文件已经关联了其他的文本编辑器,则双击后在关联的文本编辑器中打开)。 图2.9 LED_FLOW代码输入窗口 在LED_FLOW.v输入下面的测试平台代码:

中文版word基础教程

W o r d 2003基础教程 编 撰 花 椒 文 刀 版权归属:中国盲文出版社信息无障碍中心盲人挚友聊天室 前 言 结合阳光读屏软件强大的Word 朗读功能, 由信息无障碍中心开办的于2008年11月至 2009年3 月,推出在线《Word2003基础讲座》。同期,我们将讲座内容编纂成册,免费提供给 阳光软件的广大用户,以便查阅。 本教程用Word2003编写, 您可以通过单击目录快速跳转到需要查阅的文本,具体操作方法是:用上下光标逐行朗读目录,听到您想查阅的条目后,按下 Ctrl+小键盘的斜杠键,这样,光标会自动跳转到目录对应的文本,以方便您的查阅,同时,在阅读过程中,教程所提及的所有操作,您均可在当前窗口尝试,当然,为了保持教程的完整,建议您在关闭本 教程时选择不保存修改。 本教程由阳光软件免费提供,版权归属中国盲文出版社信息无障碍中心盲人挚友聊天室, 请勿用于商业用途,违者必究。

目录 第一章 初识中文版Word2003 中文版word2003是微软公司推出的中文版office2003软件套装中的重要组成部分,它具有 强大的文本编辑和文件处理功能,是实现无纸化办公和网络办公不可或缺的应用软件之一。 第一节安装、启动和退出程序 一、安装程序 安装word2003和安装其它软件并无二致,需要说明一下的是光盘版的安装。当您将中文版 office2003光盘放入光驱后,请不要自动播放,因为自动播放会弹出图形化的安装界面,读 屏软件无法操作。您可以在插入光盘后,打开“我的电脑”找到CD驱动器,application键 弹出快捷菜单,通过“打开(O)菜单”来打开光盘,然后在列表中选中office文件夹,打开 以后,列表中出现几个文件夹,由于版本不同,文件夹数量和名称可能会略有区别,不过没 关系,在这些文件夹中寻找setup.exe并回车执行,您就能顺利地用键盘完成安装操作了。 二、启动程序 按下Windows键弹出“「开始」菜单”,展开“所有程序(P)菜单”后。上下光标到 “MicrosoftOffice子菜单”,右光标展开该子菜单后,上下光标找到 “MicrosoftOfficeWord2003菜单”回车即可启动Word程序。另外,当您在资源管理器中选 择任意一个后缀名为.doc的文档回车时,计算机也会为您启动word程序,同时打开您选中 的文档。 三、退出程序 在程序窗口按下快捷键:“Alt+F4”是退出程序最简便的方法。当然您还可以在程序窗口按下 Alt键激活菜单栏,下光标展开“文件(F)子菜单”并找到到“退出(X)菜单”回车,或在程 序窗口按下“Alt+空格”弹出控件菜单,上下光标找到“关闭(c)菜单”回车即可退出程序。

微信公众平台快速上手教程

微信公众平台快速上手教程Part1 注册账户与认证 刘子骏微信微博营销微信, 微信公众平台17Comments发表评论 这段时间越来越多朋友和客户开始关注微信,我收到大量咨询微信公众平台在哪里注册等相关问题,所以不如写篇教程出来,以后大家看教程就可以了,本教程会根据微信最新变动而不断修改和完善的。 注册前最好做好以下准备: 1、想一个容易给客户识别和方便记忆的中文名称,毕竟用户通过中文名称搜索的频率是最高的,而且最好是品牌名,或者是企业名称的缩写,例如广州火鹰信息科技有限公司,注册名就可以改成火鹰科技,这样方便记忆也方便查询。如果你想加大被搜索几率,可以在名称后面加入主营业务信息,例如卡斯玛男装或卡斯玛正装,这样用户搜男装或正装都有机会找到你。这里还有一点要特别注意的是微信公众平台的名称注册后是不能修改的,所以填写时一定要先谨慎考虑。 2、准备好身份证正背面的扫描件 3、设计好微信头像图片,一般300×300像素就可以了 然后就可以直接登录https://www.wendangku.net/doc/1111797502.html,/就可以开始注册。 点击注册按钮后进入注册界面

以前微信是强制要求使用QQ账户登陆注册的,现在改成了随便使用一个可以收发邮件的邮箱就可以注册了。完成这一步会提示需要到注册邮箱激活账户!

点击邮件的激活链接后,会出现以下页面,这也是微信公众账户注册的第三步,这就需要之前提到的身份证扫描件(特别提示一下,一个身份证可以注册5个帐号。),还需要用手机进行短信验证。该页面除了个人住址和单位地址是可以不填之外,其他都必须填写,而且资料一定要真实,否则微信日后检查发现资料有问题会随时有封号的危险,当你填写完成后,系统也会提醒说明的。

Scratch2.0入门中文使用教程

儿童编程 SCRATCH2.0入门中文使用教程 目录: 1. Scratch的简介 第1课下载与安装 第2课初识Scratch 2.Scratch基础课程 第3课让角色动一动 第4课键盘控制 第5课迷宫程序 第6课会飞的巫婆 第7课三角形的面积 第8课造型切换---人物走动 第9课移动人物教师进阶使用 第10课判断人物位置 3. Scratch进阶课程--打蝙蝠 3-1 第一节课 3-2 第二节课 3-3 第三节课

4. scratch进阶课程2-打地鼠 4-1 设计背景、铁锤及地鼠 4-2 撰写地鼠的程序 4-3 撰写铁锤程序 4-4 分数的计算 5. 接球游戏 5-1 设计球部份的程序 5-2 人物部份的程序 5-3 程序计分 5-4 扣分的构想 6.如何分享SCRATCH作品 7.如何把sb2文件转化成swf格式的flash文件

SCRATCH2.0入门中文使用教程 1. Scratch的简介 Scratch是 MIT (麻省理工学院) 发展的一套新的程序语言,可以用来创造交互式故事、动画、游戏、音乐和艺术。很适合8岁以上儿童使用,目前1.4版已经完全支持中文界面,更方便使用,完全不用背指令,使用积木组合式的程序语言,让学习变得更轻松,并充满乐趣。 官方网站:https://www.wendangku.net/doc/1111797502.html,/ 目前已经推出2.0版本,支持在线和离线模式。 由于国外网站速度较慢,gateface门面,已经集成了scratch的程序,所以只要安装了伽卡他卡电子教室(15.5以上版本)或这个gateface5.5以上版本,都有scratch,不用另外安装。(伽卡他卡电子教室集成了gateface,scratch在gateface的门面编辑器里,点击相应按钮,就可以启动scratch) Gateface门面中,集成的是离线程序,可以不用登录scratch网站,在本机使用。搜索伽卡他卡电子教室或者gateface都可以到官网或者华军下载。 分享SCRATCH作品的方法: 方法1:放到网站共享。SCRATCH网站,可以上传sb2格式的文件,这样,别人通过访问SCRATCH网站来访问你的作品,需要在SCRATCH

modelsim新手入门仿真教程

Modelsim新手入门仿真教程 1.打开modelsim软件,新建一个library。 2.library命名 3.新建一个工程。

3.出现下面界面,点击close。 4.新建一个verilog文件 键入主程序。下面以二分之一分频器为例。

文件代码: module half_clk(reset,clk_in,clk_out); input clk_in,reset; output clk_out; reg clk_out; always@(negedge clk_in) begin if(!reset) clk_out=0; else clk_out=~clk_out; end endmodule 编辑完成后,点击保存。

文件名要与module后面的名称相同。 5.再新建一个测试文件,步骤同上面新建的主程序文件,文件名后缀改为.vt 程序代码如下: `timescale 1ns/100ps `define clk_cycle 50 module top; reg clk,reset; wire clk_out; always #`clk_cycle clk=~clk; initial

begin clk=0; reset=1; #10 reset=0; #110 reset=1; #100000 $stop; end half_clk m0( .reset(reset), .clk_in(clk), .clk_out(clk_out)); Endmodule 6.添加文件,编译文件 先右键点击左边空白处,选择add to project→existing File 选择刚刚新建的两个文件。按ctrl键可以同时选择两个,选择打开,下一步点击ok

ModelSim新手使用手册

ModelSim最基本的操作,初次使用ModelSim的同学,可以看看,相互学习。 无论学哪种语言,我都希望有个IDE来帮助我创建一个工程,管理工程里的文件,能够检查我编写代码的语法错误,能够编译运行出现结果,看看和预期的结果有没有出入,对于Verilog语言,我用过Altera的Quartus II,Xilinx的ISE,还有ModelSim(我用的是Altera 官网的ModelSim_Altera),甚至MAXPlus II,不过感觉这软件太老了,建议还是前三者吧。 学Verilog,找一本好书很重要,参考网友的建议,我也买了一本夏宇闻老师的《Verilog 数字系统设计教程》,用Quartus II来编写代码,个人觉得它的界面比ISE和ModelSim友好,我一般用它编写代码综合后自动生成testbench,然后可以直接调用ModelSim仿真,真的很方便,但学着学着,发现夏老师书里的例子很多都是不可综合的,比如那些系统命令,导致很多现象都发现不了,偶然间我直接打开了ModelSim,打开了软件自带的英文文档,步骤是:Help ->PDF Documentation->Tutorial如下所示: 打开文档的一部分目录: 往下读发现其实ModelSim可以直接创建工程,并仿真的。下面以奇偶校验为例叙述其使用过程(当然前提是你在Altera官网下载了ModelSim并正确安装了)。 1.打开软件,新建一个工程,并保存到自定义的目录中(最好别含中文路径) 2.点击Project,弹出窗口问是否关闭当前工程,点击Yes,接着又弹出如下窗口

我个人的习惯是把Project Name和Default Library Name写成一样,自己定义Project Location。又弹出如下窗口: 3.点击Close(我的版本不能Create New File,其实新建好了工程一样可以新建.v文件),然后点击屏幕下方的Project标签: 如果一开始不是如上图所示的界面,那么可以点击如下图所示红色标记的按键变成上图界面:

modelsim详细使用教程(一看就会)

Modelsim详细使用方法 很多的modelsim教程中都讲得很丰富,但忽视了对整个仿真过程的清晰解读,而且都是拿counter范例举例子,有些小白就不会迁移了。这里我们着眼于能顺利的跑通一个自己写的程序,一步一步的讲解,如果你是一个初学者,这再适合你不过了,虽然貌似字写得比较多,那是因为写得相当的详细,一看就会啦O(∩_∩)O~ 一、建立工程 1、在建立工程(project)前,先建立一个工作库(library),一般将这个library命名为 work。尤其是第一次运行modelsim时,是没有这个“work”的。但我们的project 一般都是在这个work下面工作的,所以有必要先建立这个work。 File→new→library 点击library后会弹出一个对话框,问是否要创建work,点击OK。就能看见work.

2、如果在library中有work,就不必执行上一步骤了,直接新建工程。 File→new→project 会弹出 在Project Name中写入工程的名字,这里我们写一个二分频器,所以命名half_clk,然后点击OK。 会出现

由于我们是要仿一个自己写的程序,所以这里我们选择Create New File。 在File Name中写入文件名(这里的file name和刚刚建立的project name可以一致也可以不一致)。注意Add file as type 要选择成Verilog(默认的是VHDL),然后OK。 发现屏幕中间的那个对话框没有自己消失,我们需要手动关闭它,点close。 并且在project中出现了一个half_clk.V的文件,这个就是我们刚刚新建的那个file。 这样工程就建立完毕了。 二、写代码: 1、写主程序:双击half_clk.v文件会出现程序编辑区,在这个区间里写好自己 的程序,这里我们写一个简单的二分频的代码: module half_clk_dai( clk_in, rst, clk_out ); input clk_in; input rst;

modelsim使用教程6.0

Modelsim 6.0 使用教程 1. Modelsim简介 Modelsim仿真工具是Model公司开发的。它支持Verilog、VHDL以及他们的混合仿真,它可以将整个程序分步执行,使设计者直接看到他的程序下一步要执行的语句,而且在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,可以在Dataflow窗口查看某一单元或模块的输入输出的连续变化等,比quartus自带的仿真器功能强大的多,是目前业界最通用的仿真器之一。 对于初学者,modelsim自带的教程是一个很好的选择,在Help->SE PDF Documentation->Tutorial里面.它从简单到复杂、从低级到高级详细地讲述了modelsim的各项功能的使用,简单易懂。但是它也有缺点,就是它里面所有事例的初期准备工作都已经放在example文件夹里,直接将它们添加到modelsim就可以用,它假设使用者对当前操作的前期准备工作都已经很熟悉,所以初学者往往不知道如何做当前操作的前期准备。 2.安装 同许多其他软件一样,Modelsim SE同样需要合法的License,通常我们用Kengen产生license.dat。 ⑴.解压安装工具包开始安装,安装时选择Full product安装。当出现Install Hardware Security Key Driver时选择否。当出现Add Modelsim To Path选 择是。出现Modelsim License Wizard时选择Close。 ⑵.在C盘根目录新建一个文件夹flexlm,用Keygen产生一个License.dat,然后 复制到该文件夹下。 ⑶.修改系统的环境变量。右键点击桌面我的电脑图标,属性->高级->环境变量-> (系统变量)新建。按下图所示内容填写,变量值内如果已经有别的路径了, 请用“;”将其与要填的路径分开。LM_LICENSE_FILE = c:\flexlm\license.dat

微信公众平台入门到精通Vol精编版

微信公众平台入门到精 通V o l GE GROUP system office room 【GEIHUA16H-GEIHUA GEIHUA8Q8-

紧接着14期的内容,在基本规划做好以后咱们先把数据库建好。昨天有人建议我按照QQ 企业邮箱的来做,这个可能太复杂了,怕大家更加迷茫,我做案例更多是希望朋友们通过案例举一反三,从简单的产品推导出复杂的应用。 第十四章公司通讯录开发 二、公司通讯录数据库建立 第13期里有SAE数据库的介绍,如果没有开通的请先移步把SAE的数据库服务开启,点击“管理MySQL”进入到数据库的图形管理界面,如下图: 数据库里目前没有任何数据表,所以我们先来建立第一张数据表“员工表”,取名为“roster”,员工表我调整了下结构增加了几项,最后的项目为:序号、姓名、工号、照片、性别、生日、手机、电话、部门、邮箱、微信号、微信OPENID、员工状态、入职日期、添加时间、更新时间、记录状态。 在建表之前其实还要设定每个字段项的属性,我这里简单写一下,后面在解释建表的时候大家可以参照看: 字段名类型长度其他 序号数字 5 自增、主键 姓名字符 10 工号字符 10

照片字符 50 性别数字 1 0为女,1为男 生日日期 手机字符 15 电话字符 15 部门数字 4 邮箱字符 50 微信字符 30 openid 字符 50 员工状态数字 1 1为在岗,-1为离职 2为休假 入职日期 添加时间 更新时间 记录状态数字 1 1为正常0为删除

字段数根据上面的规划应该是15个字段,所以应该填写15,但我这里填写3是为了后面切图片和讲解的方便,大家如果填写15看到的样式会不同,没有关系,另外建立过程中还可以增加字段数的。 点击执行按钮,就切换到表设计界面,如下图: 在上图中每一列就是一个字段,如果大家前面填写字段数超过5的则视图中每一行就是一个字段,但不管如何显示,每个字段都有下面这些属性: 1.字段名称,用来描述字段的名称,它可以用中文、英文字母、数字等字符来描述。 但是建议不用中文或者纯数字,命名最好使用表名+下划线+该字段的英文名或者拼音缩写。 2.字段类型,用来限定数据格式,同一字段的数据类型都是一样的。点击类型的选项 菜单会出来一大堆,不用怕很多我们是不太会用的,常用到的类型如下: TINYINT:一个很小的整数。有符号的范围是-128到127,无符号的范围是0到 255。 SMALLINT:一个小整数。有符号的范围是-32768到32767,无符号的范围是0到 65535。 MEDIUMINT:一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。

Modelsim的仿真教程

ModelSim的仿真 1.仿真的分类 仿真过程是正确实现设计的关键环节,用来验证设计者的设计思想是否正确,及在设计实现过程中各种分布参数引入后,其设计的功能是否依然正确无误。仿真主要分为功能仿真和时序仿真。功能仿真是在设计输入后进行;时序仿真是在逻辑综合后或布局布线后进行。1). 功能仿真( 前仿真) 功能仿真是指在一个设计中,在设计实现前对所创建的逻辑进行的验证其功能是否正确的过程。布局布线以前的仿真都称作功能仿真,它包括综合前仿真(Pre-Synthesis Simulation )和综合后仿真(Post-Synthesis Simulation )。综合前仿真主要针对基于原理框图的设计; 综合后仿真既适合原理图设计, 也适合基于HDL 语言的设计。 2). 时序仿真(后仿真) 时序仿真使用布局布线后器件给出的模块和连线的延时信息,在最坏的情况下对电路的行为作出实际地估价。时序仿真使用的仿真器和功能仿真使用的仿真器是相同的,所需的流程和激励也是相同的;惟一的差别是为时序仿真加载到仿真器的设计包括基于实际布局布线设计的最坏情况的布局布线延时,并且在仿真结果波形图中,时序仿真后的信号加载了时延,而功能仿真没有。 后仿真也称为时序仿真或者布局布线后仿真,是指电路已经映射到特定的工艺环境以后,综合考虑电路的路径延迟与门延迟的影响,验证电路能否在一定时序条件下满足设计构想的过程,是否存在时序违规。其输入文件为从布局布线结果中抽象出来的门级网表、Testbench 和扩展名为SDO 或SDF 的标准时延文件。SDO 或SDF 的标准时延文件不仅包含门延迟,还包括实际布线延迟,能较好地反映芯片的实际工作情况。一般来说后仿真是必选的,检查设计时序与实际的FPGA 运行情况是否一致,确保设计的可靠性和稳定性。2.仿真的作用 1).设计出能工作的电路:因此功能仿真不是一个孤立的过程,其和综合、时序分析等形成一个反馈工作过程,只有这个过程收敛,各个环节才有意义。而孤立的功能仿真通过是没有意义的,如果在时序分析过程中发现时序不满足需要更改代码,则功能仿真必须从新进行。因此正确的工作流程是:

modelsim使用入门(VHDL_

modelsim使用实例(VHDL) 标签: modelsim仿真testbench FPGA 看了几天的modelsim以及如何在quartusII中调用,浏览了N个网页,尝试了N次,......终于初步完成。下面是入门部分介绍。 modelsim是专业的仿真软件,仿真运行速度比同类的其他仿真软件都要快很多。Quartus 自己都不再做仿真器了,普遍使用modelsim,自有其缘由。 这里用的是modelsim-altera(6.6d)版本,与quartus II 11.0搭配。据说Altera公司推出的Quartus软件不同版本对应不同的modelsim,相互之间不兼容。某些功能齐全的modelsim版本可以进行两种语言的混合编程, modelsim-altera只能支持一种语言进行编程(VHDL或者Verilog选其一)。 1、新建工程 打开modelsim-->file-->new-->project 新建工程,输入工程名,文件存放路径后(不可直接放在某盘下,必须放入文件夹中),进入下一步。 在主体窗口下方出现project标签。见下图。

2、新建文件 --create new file:输入名称div10,选择语言VHDL --关闭对话框 新的工程文件将会在工程窗口出现。 3、写入源程序(VHDL) 双击div10.vhd,打开文本编辑器。 实例代码如下(一个十分频的VHDL源代码):library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity div10 is --实体要与工程名相同 port(clk :in std_logic;

微信公众平台开发教程

微信公众平台视频教程 一、注册并登录接口(这里里以微小信平台https://www.wendangku.net/doc/1111797502.html,/WxUser/login 为 例) 二、添加公众号 如何获取微信初始ID? 企鹅:328258258获取微信开发教程激活码:https://www.wendangku.net/doc/1111797502.html,/course/79

页面上的gh_xxxxxxxxxxxx就是初始id,不过我想,这么难记的id,大家肯定都修改了。 但偏偏我们还需要使用它,比如我们要加入微信导航网站,比如我们要制作艺术二维码,比如我们要做微信互推等等,都是需要使用微信初识id的。 你修改时没保存吧,没关系的,我告诉大家如何查找微信初始id。 ?首先,登陆微信公众平台。 ?设置/个人设置。 ?下载二维码。 这里请不要使用右键另存为,一定要直接点击下载。 ?弹出对话框。

注意,图示中这个二维码的文件名是:qrcode_for_gh_d019da958e55_430.jpg 去头去尾,gh_d019da958e55就是该微信公众号的原始id。 或者找到你刚下载保存的文件。 也可以看到gh_xxxxxxxxxxxx的字样,复制该字段即可。 三、点配置接口

记下接口地址和Token,然后勾选下面列出的功能(在第七个部分会用到) 四、登录微信公众平台(https://www.wendangku.net/doc/1111797502.html,/),进行身份认证,填写信息,提交身份证。 五、认证后,点击高级功能→进入开发模式

六、点击"成为开发者"按钮 七、填写接口配置信息 url和Token写刚才记下的(在第4个步骤上记得)

八、确认开启 九、在手机上用微信给你的公众号输入"功能",测试你的接口是否配置正常!

ModelSim 简明操作指南

第一章介绍 本指南是为ModelSim5.5f版本编写的,该版本运行于UNIX和Microsoft Windows 95/98/Me/NT/2000的操作系统环境中。本指南覆盖了VHDL和Verilog 模拟仿真,但是你在学习过程中会发现对于单纯的HDL设计工作而言,它是一个很有用的参考。ModelSim具备强大的模拟仿真功能,在设计、编译、仿真、测试、调试开发过程中,有一整套工具供你使用,而且操作起来极其灵活,可以通过菜单、快捷键和命令行的方式进行工作。ModelSim的窗口管理界面让用户使用起来很方面,它能很好的与操作系统环境协调工作。ModelSim的一个很显著的特点就是它具备命令行的操作方式,类似于一个shell有很多操作指令供你使用,给人的感觉就像是工作在Unix环境下,这种命令行操作方式是基于Tcl/Tk 的,其功能相当强大,这需要在以后的实际应用中慢慢体会。 ModelSim的功能侧重于编译、仿真,不能指定编译的器件,不具有编程下载能力。不象Synplify和MAX+PLUS II可以在编译前选择器件。而且ModelSim 在时序仿真时无法编辑输入波形,不象MAX+PLUS II可以自行设置输入波形,仿真后自动产生输出波形,而是需要在源文件中就确定输入,如编写测试台程序来完成初始化、模块输入的工作,或者通过外部宏文件提供激励。这样才可以看到仿真模块的时序波形图。另外对于Synplify来说,也只具有编译能力,但是比MAX+PLUS II可编译的verilog的内容要多,所以常常可以现在Synplify下编译,生成编译文件再送到MAX+PLUS II中使用。 ModelSim还具有分析代码的能力,可以看出不同的代码段消耗资源的情况,从而可以对代码进行改善,以提高其效率。 第二章ModelSim的主要结构ModelSim的主窗口(Main window)包括菜单栏、工具栏、工作区和命令行操作区。 在工作区可以显示Project Tab、Library Tab、Sim Tab(显示Load Design、Hierarchical Structure);在命令行操作区,可以用命令提示符的方式进行编译、仿真设计,同时打开其他窗口。 在菜单栏View下可以打开,source window、list window、wave window、

微信公众平台开发定稿版

微信公众平台开发 HUA system office room 【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】

微信公众平台开发 这段时间越来越多朋友和客户开始关注微信,微信平台开发也越来越火,自己也觉得这个比较有意思也就去了解了一下。现在和大家分享一下微信平台开发的模式。 一、接入微信公众平台 (1)申请消息接口。申请消息接口需要填写两个选项,一个是URL和T oken。 (2)验证URL有效性。开发者提交信息后,微信服务器将发送GET请求到填写的URL 上,GET请求携带四个参数:

通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效,否则接入失败。 加密/校验流程如下: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 示例代码如下: function checkSignature(){ $signature = $_GET["signature"]; $timestamp = $_GET["timestamp"]; $nonce = $_GET["nonce"]; $token = TOKEN;//这个是自己定义的,也是配置的时候填写的token $tmpArr = array($token, $timestamp, $nonce); sort($tmpArr, SORT_STRING); $tmpStr = implode( $tmpArr ); $tmpStr = sha1( $tmpStr );

modelsim仿真教程

本教程使用软件的下载链接如下: https://www.wendangku.net/doc/1111797502.html,/download/quartus_modelsim_setup.zip Molelsim仿真使用教程 ——利用quartus生成网表文件Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业界唯一的单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件,接下来以一个简单的例子介绍modelsim的基本使用方法。 第一步:建立工程,该过程与quartus使用的教程大部分是一样的,区别如下: 在simluation选项中选择MoselSim-Altera作为仿真工具,fomat中的选项根据编程语言进行选择,本教程以VHDL为例。 第三方的仿真工具 所以在此选择

第二步:新建文件: 新建一个源文件,保存为led.vhd library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity led is port(led_out : out std_logic_vector(7 downto 0); clk : in std_logic; rst_n : in std_logic ); end led; architecture behavior of led is signal light : std_logic_vector (7 downto 0); begin process(clk,rst_n) begin if(rst_n = '0')then light <= "00000010"; elsif(clk'event and clk ='1' )then if(light = "10000000") then light <= "00000001"; else light <= light(6 downto 0)& '0'; end if; end if; end process; led_out <= light; end behavior; 新建一个testbench 文件,保存为testbench.vhd(testbench是电路的激励文件,在后面章节会详细介绍,这里仅仅作为软件的演示不具体介绍testbench的设计过程): library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.numeric_std.all; entity testbench is end testbench; architecture behavior of testbench is

ModelsimSE仿真步骤(优选.)

WILDSC ModelsimSE仿真教程 Verilog & VHDL 孙玉阳 2014/6/3 对于ModelsimSE仿真设置网上很难找到详细教程,在此写一篇基于Verilog 和VHDL的ModelsimSE的仿真设置教程,以期缩短大家ModelsimSE学习时间,由于时间仓促,不足之处还请见谅。

目录 1 ModelsimSE仿真——Verilog HDL (2) 1.1 建立资源库 (2) 1.1.1 建立资源库的目的 (2) 1.1.2 建立资源库前准备 (2) 1.1.3 建立资源库的步骤 (3) 1.2 功能仿真 (11) 1.2.1 建立ModelsimSE工程 (11) 1.2.2 添加Quartus工程文件 (12) 1.2.3 编译 (14) 1.2.4 仿真 (18) 1.3 时序仿真 (21) 2 ModelsimSE仿真——VHDL (25) 2.1 建立资源库 (25) 2.1.1 建立资源库的目的 (25) 2.1.2 建立资源库前准备 (25) 2.1.3 建立资源库的步骤 (26) 2.2 功能仿真 (33) 2.2.1 建立ModelsimSE工程 (33) 2.2.2 添加Quartus工程文件 (34) 2.2.3 编译 (37) 2.2.4 仿真 (40) 2.3 时序仿真 (44)

1ModelsimSE仿真——Verilog HDL 1.1建立资源库 1.1.1建立资源库的目的 Quartus Verilog工程文件里面在使用Primitives、Megafunction、LPM等Quartus自带模块时,会调用Quartus本身自带的一些库文件,但是ModelsimSE在仿真Quartus Verilog工程文件时不会自动去调用Quartus的库文件,同时ModelsimSE也不自带与Primitives、Megafunction、LPM相关的库文件。所以在仿真Primitives、Megafunction、LPM等模块时,必须在ModelsimSE里建立与其对应的资源库,否则无法仿真。 1.1.2建立资源库前准备 (备注:若需要后仿真(时序仿真)则进行这一步骤,若只进行前仿真(功能仿真)则跳过此步骤): 打开待仿真的quartus工程,点击菜单Assignments->Settings,打开如下窗口 将以下红色部分设置好,先点击apply,然后点击OK即可

相关文档