Microsoft Intermediate Language (MSIL)
https://www.wendangku.net/doc/da1378178.html,
一、一个Hello Word!程序
Microsoft .NET Framework 和C# Programming Language 自诞生日起,就一直快速进化着。越来越底大的类库,越来越多的封装,还有那越来越简单的语法糖,所有这些让我们离"本质" 越来越远。尽管用这些优雅的语法并不妨碍我们开发出好而实用的产品,但作为一个资深的程序员,我们还是应该了解编译器背后的秘密。C# 并不代表.NET CLR 的全部,就好比学习LINQ,如果我们不试图去分析背后的执行流程,就很难理解所谓延迟执行机制。
MSIL 是一把锋利的手术刀,只有它能剖开层层"伪装",带我们深入到.NET 的底层世界,去了解和结识许许多多被刻意隐藏起来的精灵。尽管它不是真正意义上的底层汇编语言,不能分析JIT Complier 编译后的Native Code,但总算能一窥托管编译器的奥秘。学习MSIL 的目的,并不是真的要用它去编码,而是为了更好地"交流"。
暂时离开那无比强大的Visual https://www.wendangku.net/doc/da1378178.html,,让我们用记事本开始MSIL 的探索之旅。MyApp.il
.assembly extern mscorlib {auto}
.assembly MyApp {}
.module MyApp.exe
.namespace MyApp
{
.class public Program extends [mscorlib]System.Object
{
.method static private void Main(string[] args)
{
.entrypoint
ldstr "Hello, World!"
call void [mscorlib]System.Console::WriteLine(string)
nop
call string [mscorlib]System.Console::ReadLine()
pop
ret
}
}
}
打开Visual Studio Command Prompt,使用ILASM 开始编译。
E:\Develop\MSIL>ilasm MyApp.il
Microsoft (R) .NET Framework IL Assembler. Version 2.0.50727.1378
Copyright (c) Microsoft Corporation. All rights reserved.
Assembling 'MyApp.il' to EXE --> 'MyApp.exe'
Source file is UTF-8
Assembled method MyApp.Program::Main
Creating PE file
Emitting classes:
Class 1: MyApp.Program
Emitting fields and methods:
Global
Class 1 Methods: 1;
Emitting events and properties:
Global
Class 1
Writing PE file
Operation completed successfully
执行MyApp.exe,就可看到熟悉的"Hello, World!" 也就意味着我们完成了第一个.NET "汇编" 程序。
二、Code Structure
先了解一下MSIL 程序代码最简单的结构组成,以便于我们开始后面的细节研究。还是以上节的"Hello, World!" 为例。
1、H eader
.assembly extern mscorlib { auto }
定义一个程序集引用信息。mscorlib.dll 包含了 .NET 的基本类型定义,几乎所有的托管引用程序都会用到它。当然我们还可以写得更具体一点。例如:
.assembly extern mscorlib
{
.ver 2:0:0:0
.publickeytoken = (B7 7A 5C 56 19 34 E0 89)
}
.assembly MyApp {}
定义程序集。当然还可以包含更完整的版本信息。
.assembly Learn.CUI
{
.ver 1:0:0:0
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) =
{ string('MyApp') }
.custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = { string('') }
}
.module MyApp.exe
定义托管模块。
KingNa注:
这个就相当于C#中的Using或VB中的Imports了,只是IL还要指定程序集名称以及Module名,但我在实验中发现,Module可以不予指定,也就是说除了Module不是必须的以外,其它两个都是必须要指定的。
2、Code
.namespace MyApp
定义命名空间。
.class public Program extends [mscorlib]System.Object
定义一个继承自System.Object 的类,注意语法。我们还可以为其添加更多的关键词,比如:
.class public auto ansi extends [mscorlib]System.Object
.method static private void Main(string[] args)
定义一个私有静态方法。这个方法是程序的入口点,在C# 中我们必须将其命名为Main,但CLR 并没有这个要求,真正起作用的是".entrypoint"。所以我们可以将其改成任何有效名称。
.method static private void Test(string[] args)
(不要着急研究关键词和指令的具体意义~~~~~ )
三、Module
在C# 中,除非我们用Reflection,否则我们不能直接操作
(1) 为
(2) 定义不依附于任何Class 的全局字段或方法(不建议在实际工程中使用)。
我们在第一节中的Hello Word的结尾加入如下代码:
.method private hidebysig specialname rtspecialname static void .cctor()
{
ldstr "
call void [mscorlib]System.Console::WriteLine(string)
ret
}
编译该代码,执行后输出。
Hello, World!
Global Items
我们可以在Module 中定义全局的静态字段和方法。看下面的演示。
(1) 定义全局静态字段x。
(2) 在
(3) 定义全局静态方法Test() 用来显示x。
(4) 在Program.Main() 中使用call 指令进行调用Test()。
.assembly extern mscorlib {auto}
.assembly MyApp {}
.module MyApp.exe
.namespace MyApp
{
.class public Program extends [mscorlib]System.Object
{
.method static private void Main(string[] args)
{
.entrypoint
call void Test()
nop
call string [mscorlib]System.Console::ReadLine()
pop
ret
}
}
}
.field assembly static int32 x
.method private hidebysig specialname rtspecialname static void .cctor()
{
ldc.i4 1234
stsfld int32 x
ret
}
.method public static void Test()
{
ldsfld int32 x
call void [mscorlib]System.Console::WriteLine(int32)
ret
}
四、Namespace
MSIL 的Namespace 定义要远比C# 灵活得多,让我们看看MyApp.CMS.Program 的不
同写法。
(1) .namespace MyApp.CMS {}
.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.namespace MyApp.CMS
{
.class public Program extends [mscorlib]System.Object
{
.method static private void Main(string[] args)
{
.entrypoint
ret
}
}
}
(2) .namespace MyApp { .namespace CMS {} }
.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.namespace MyApp
{
.namespace CMS
{
.class public Program extends [mscorlib]System.Object
{
.method static private void Main(string[] args)
{
.entrypoint
R et
}
}
}
}
这种嵌套方式更便于组织代码。
.namespace MyApp
{
.class A... {}
.namespace CMS
{.class B...{} }
}
(3) .class public MyApp.CMS.Program... {}
.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.class public MyApp.CMS.Program extends [mscorlib]System.Object
{
.method static private void Main(string[] args)
{
.entrypoint
R et
}
}
此方式直接将namespace 作为Class Full Name 的一部分。但在MSIL 编码时,输入类型的完整名称,长长的Full Name (namespace + class name) 让人感觉太繁琐…… 此时可以考虑用.typedef 定义别名减少输入。
.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.typedef [mscorlib]System.Object as Object
.typedef method void [mscorlib]System.Console::WriteLine(string) as Print
.namespace MyApp
{
// .class public Program extends [mscorlib]System.Object
.class public Program extends Object
{
.method static private void Main(string[] args)
{
.entrypoint
l dstr "Hello, World!"
// call void [mscorlib]System.Console::WriteLine(string)
c all Print
r et
}
}
}
我们还可以直接在 .typedef 中使用已定义的别名。
.typedef [mscorlib]System.Console as CW
.typedef method void CW::WriteLine(string) as Print
五、Class-Flag
无所不在的Class 终于出来了~~~~~
.class
Flags
1. Visiblity : 访问修饰符。
private: 相当于C# 的internal class,仅程序集内部可见。(默认)
public: 可以被程序集外部访问。
nested public: 嵌套类型可以被外部访问。
nested private: 嵌套类型仅可以被enclosing class 访问。(默认)
nested family: 相当于protected,嵌套类型可以被enclosing class 及其继承类型访问。nested assembly: 相当于internal,嵌套类型仅可以被程序集内部成员访问。
nested famandassem: 相当于internal & protected,嵌套类型只能被同一程序集的enclosing class (含继承类型) 访问。
nested famorassem: 相当于internal protected,嵌套类型可以被程序集内部成员及enclosing class (含外部继承类型) 访问。
2. Layout : 控制导出到非托管代码时对象内存布局。
auto: 由CLR 自动选择排列方式。(默认)
explicit: 显式控制成员位置(FieldOffsetAttribute)。
sequential: 对象成员按导出次序排列布局。
3. Semantics
interface: 定义接口类型。
abstract: 定义抽象类型。
sealed: 定义密封类型。
specialname: 表明类型名称有特殊含义。
4. Implementaion
import: 该类型由COM 导入。
serializable: 该类型可以被序列化。
beforefieldinit: 由JIT 决定类型初始化时机,这可能在首次调用其静态成员或实例化之前的某个任意时刻。
5. String Formatting
ansi: 将字符串转换成ansi 格式,以便和native methods 交互。(默认)
unicode: 托管代码缺省格式,UTF-16。
autochar: 由底层平台定义字符串格式。
6. Reserved
rtspecialname: 表明该名称由CLR 保留,具有特殊含义,且必须和specialname 一起使用。
7. Other
value: 值类型,缺省基类是System.ValueType。
enum: 枚举类型,缺省基类是System.Enum。
Demo
.assembly extern mscorlib { auto }
.module MyApp.exe
.namespace MyApp
{
// interface
.class interface ITest {}
// enum
.class enum Sex {}
// struct
.class value MyData {}
.class public auto ansi Program extends [mscorlib]System.Object
{
.method private static void Main(string[] args)
{
.entrypoint
R et
}
.class nested famorassem Class1 extends [mscorlib]System.Object
{}
}
}
编译后代码
.namespace MyApp
{
.class private interface abstract auto ansi ITest {}
.class private auto ansi Sex
e xtends [mscorlib]System.Enum {}
.class private auto ansi sealed MyData
e xtends [mscorlib]System.ValueType {}
.class public auto ansi Program e xtends [mscorlib]System.Object
{
.method private static void Main(string[] args) cil managed
{
.entrypoint
}
.class auto ansi nested famorassm Class1
e xtends [mscorlib]System.Object {}
}
}
转换成C#
{
internal interface ITest {}
i nternal enum Sex {}
i nternal struct MyData {}
p ublic class Program
{
p rivate static void Main(string[] args);
i nternal protected class Class1 {}
}
}
关于beforefieldinit,我们通过下面的例子看看其具体作用。.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.namespace MyApp
{
.class /*beforefieldinit*/ MyClass
{
.method public specialname static void .cctor()
{
l dstr "MyClass .cctor ..."
c all voi
d [mscorlib]System.Console::WriteLine(string)
r et
}
.method public specialname void .ctor()
{
l darg.0
c all instance voi
d .base::.ctor()
r et
}
.method public void Test()
{
l dstr "test..."
c all voi
d [mscorlib]System.Console::WriteLine(string)
r et
}
}
.class public auto ansi Program extends [mscorlib]System.Object {
.method private static void Main(string[] args)
{
.entrypoint
.locals init(class [mscorlib]System.Object o)
l dstr "--------------------------------"
c all voi
d [mscorlib]System.Console::WriteLine(string)
n op
n ewobj instance void MyApp.MyClass::.ctor()
s tloc.s o
l dloc.s o
c all instance voi
d MyApp.MyClass::Test()
r et
}
}
}
不添加beforefieldinit 的输出结果
--------------------------------
MyClass .cctor ...
test...
添加beforefieldinit 的输出结果
MyClass .cctor ...
--------------------------------
test...
第一种输出结果和我们在C# 中所了解的一样,静态构造在第一次调用类型静态成员或实例化前被调用。而一旦添加了beforefieldinit 关键字,我们发现在做出任何调用之前,静态构造就被调用。
beforefieldinit 的真实含义是告诉CLR 能够在任何时候执行静态构造方法(.cctor),只要该方法在第一次访问该类型静态成员或进行实例化之前被执行即可。换句话说,beforefieldinit 为CLR 提供了一个执行主动优化的许可。如果没有beforefieldinit,运行库就必须在某个"精确时间" 运行类型构造方法,即恰好在第一次访问该类型的静态成员或实例化之前。很少有类会真正需要类型构造方法在一个精确的时间执行。因此在大多数情况下,添加beforefieldinit 标志就非常有意义。缺省情况下C# 编译器会为大多数类型添加该标记。
六、Class-Inheritance
1. 基类是其他程序集中的类型
.class MyClass extends [AssemblyName]Namespace.BaseClassName
Example
.class MainPage extends [System.Web]System.Web.UI.Page {}
2. 基类是其他模块中的类型
.class MyClass extends [.moudle ModuleName]Namespace.BaseClassName
Example
.class MyClass extends [.moudle MyApp.dll]MyApp.BaseClass {}
3. 基类是当前模块中的类型
.class MyClass extends Namespace.BaseClassName
Example
.class MyClass extends MyApp.BaseClass {}
不指定extends 时,表示缺省继承自[mscorlib]System.Object;值类型结构体(value)继承自[mscorlib]System.ValueType;枚举类型(enum)继承自[mscorlib]System.Enum。如果为结构类型和枚举指定基类,那么可以省略value、enum 关键词。
.class enum Sex1 {}
.class Sex2 extends [System.Web]System.Enum {}
.class value Struct1 {}
.class Struct2 extends [mscorlib]System.ValueType {}
七、Interface
在IL 中,我们必须使用implements 关键词定义类型对接口的实现。这一点跟https://www.wendangku.net/doc/da1378178.html,是一样的
.class interface ITest
{
.method public void Test() {}
}
.class MyClass implements MyApp.ITest
{
.method public virtual void Test() // virtual! {}
}
接口没有基类,接口使用implements "实现" 另外一个接口,而不是extends。
.class interface ITest
{
.method public void Test() {}
}
.class interface ITest2 implements MyApp.ITest
{
.method public void DoCommand() {}
}
我们看看包含显式接口方法实现的完整例子。
.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.namespace MyApp
{
.class interface ITest
{
.method public void Test() {}
}
.class MyClass implements MyApp.ITest
{
.method public specialname rtspecialname void .ctor()
{
l darg.0
c all instance voi
d [mscorlib]System.Object::.ctor()
r et
}
.method public virtual void Test() // virtual
{
l dstr "Test..."
c all voi
d [mscorlib]System.Console::WriteLine(string)
r et
}
.method private virtual void MyApp.ITest.Test() // virtual + full method name
{
.override MyApp.ITest::Test
l dstr "ITest..."
c all voi
d [mscorlib]System.Console::WriteLine(string)
r et
}
}
.class public auto ansi Program extends [mscorlib]System.Object
{
.method private static void Main(string[] args)
{
.entrypoint
.locals init (class MyApp.MyClass o)
n op
n ewobj instance void MyApp.MyClass::.ctor()
s tloc.0
l dloc.0
c allvirt instance voi
d MyApp.MyClass::Test()
n op
l dloc.0
c allvirt instance voi
d MyApp.ITest::Test()
n op
r et
}
}
}
显式接口方法的实现,有几个关键词的应用,包括private、virtual,以及.override,当然还有方法名称的不同。该演示代码C# 格式
namespace MyApp
{
i nternal interface ITest
{
v oid Test();
}
i nternal class MyClass : ITest
{
p ublic MyClass();
p ublic override void Test();
v oid ITest.Test();
}
p ublic class Program
{
private static void Main(string[] args)
{
M yClass class2 = new MyClass();
c lass2.Test();
((ITest) class2).Test();
}
}
}
除了上述这些,我们还可以在接口中直接定义静态类型构造(.cctor)和静态方法。( 这回明
白CLR 和C# 范围的区别了吧~~~~ )
.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.namespace MyApp
{
.class interface ITest
{
.method public void Test() {}
.method static private specialname rtspecialname void .cctor() {
l dstr "https://www.wendangku.net/doc/da1378178.html,tor"
c all voi
d [mscorlib]System.Console::WriteLine(string)
r et
}
.method public static void Do()
{
l dstr "ITest.Do"
c all voi
d [mscorlib]System.Console::WriteLine(string)
r et
}
}
.class MyClass implements MyApp.ITest
{
.method public specialname rtspecialname void .ctor()
{
l darg.0
c all instance voi
d [mscorlib]System.Object::.ctor()
r et
}
.method public virtual void Test()
{
l dstr "Test..."
c all voi
d [mscorlib]System.Console::WriteLine(string)
r et
}
}
.class public auto ansi Program extends [mscorlib]System.Object {
.method private static void Main(string[] args)
{
.entrypoint
.locals init (class MyApp.ITest o)
n op
n ewobj instance void MyApp.MyClass::.ctor()
s tloc.0
l dloc.0
c allvirt instance voi
d MyApp.ITest::Test()
n op
c all voi
d MyApp.ITest::Do()
n op
r et
}
}
}
输出
Test...
https://www.wendangku.net/doc/da1378178.html,tor
ITest.Do
八、Enum
要定义一个枚举类型,我们必须声明一个拥有特定名称(value__)的实例字段来存储其底层类型,以及不少于一个的静态字段成员。枚举类型不能有方法、属性、事件。
.namespace MyApp
{
.class enum Sex
{
.field public specialname int32 value__
.field public static literal valuetype MyApp.Sex Femal = int32(1)
.field public static literal valuetype MyApp.Sex Male = int32(0)
}
}
注意静态字段声明中的的几个关键词。上面这个枚举类型相当于C# 中的
internal enum Sex
{
M ale,
F emal
}
当然,我们也可以为枚举指定其他底层类型,诸如其他整数类型、布尔类型以及字符类型。.class enum Sex
{
.field public specialname int8 value__
.field public static literal valuetype MyApp.Sex Female = int8(1)
.field public static literal valuetype MyApp.Sex Male = int8(0)
}
相当于
internal enum Sex : sbyte
{
F emale = 1,
M ale = 0
}
可当你试图在IL 中使用这个Enum 时,会发现一个让人哭笑不得的异常被抛出。
.class public Program extends [mscorlib]System.Object
{
.method static private void Main(string[] args)
{
.entrypoint
l dsflda int32 MyApp.Sex::Female
c all voi
d [mscorlib]System.Console::WriteLine(int32)
r et
}
}
输出
Unhandled Exception: System.MissingFieldException: Field not found: 'MyApp.Sex.Female'.
a t MyApp.Program.Main(String[] args)
原因是literal field 并不是一种"真正" 意义上的字段,它们是一种编译期常量(compile-time constant),以常量值方式存储到元数据表中,JIT 并不会为它们分类内存空间(csc 等编译器会使用实际常量来替换代码中的枚举字段)。也就是说我们在IL 定义一个枚举类型的作用是:
(1) 做成类库,供C# / https://www.wendangku.net/doc/da1378178.html, 等语言调用。
(2) 用于反射元数据。
当我们试图用ldsfld 载入枚举字段时,JIT Compiler 会抛出MissingFieldException 异常,并终止任务执行。
九、Nested Type
在IL 中我们可以在classes、interface、value types 中创建嵌套类型,不过Nested Type 的表达式语法有点古怪。
如:
.class MyClass
{
.class nested public MyClassSub
{}
.field valuetype MyClass/MyClassSub o
}
相关规则:
(1) Nested type 对象不会拥有Enclosing type 的实例引用(指针)。
(2) 创建Enclosing type 实例时不会自动创建Nested type 实例。
(3) Nested type 受Enclosing type 访问权限限制。
使用演示:
.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.namespace MyApp
{
.class interface ITest
{
.class interface nested public ITestSub {}
}
.class MyClass implements MyApp.ITest/ITestSub
{
.method public specialname void .ctor() {}
}
.class value MyStruct
{
.class value nested public MyStructSub {}
}
.class public Program extends [mscorlib]System.Object
{
.method static private void Main(string[] args)
{
.entrypoint
.locals init (
c lass MyApp.MyClass o,
c lass MyApp.ITest/ITestSub i,
v aluetype MyApp.MyStruct/MyStructSub v)
// o = new MyClass()
n ewobj instance void MyApp.MyClass::.ctor()
s tloc o
// Console.WriteLine(o)
l dloc o
c all voi
d [mscorlib]System.Console::WriteLine(object)
// i = o
l dloc o
s tloc i
// Console.WriteLine(i)
l dloc i
c all voi
d [mscorlib]System.Console::WriteLine(object)
// v = new MyStruct.MyStructSub()
l dloca.s v
i nitobj MyApp.MyStruct/MyStructSub
// Console.WriteLine(v)
l dloc v
b ox MyApp.MyStruct/MyStructSub
c all voi
d [mscorlib]System.Console::WriteLine(object)
r et
}
}
}
十、Field
.field
Flags
1. Accessibility
privatescope: 该字段不能被引用。(默认)
private: 只能被当前类型及其所包含嵌套类型访问。
famandassem: 只能被当前程序集内的继承类型访问。(family and assembly 的缩写) assembly: 只能被当前程序集内的成员访问。
famorassem: 只能被当前程序集成员或外部继承类型访问。(family or assembly 的缩写) public: 公共访问权限。
2. Contract
static: 静态字段。
initonly: 相当于C# readonly 关键字,初始化后不能被改变。
literal: 该字段是编译期常量。(参考enum 中的相关说明)
notserialized: 扩展类型时不必序列化该字段。
specialname: 该字段名有特殊含义,比如enum value__。
Reference
在引用一个字段时,我们必须包含其完整签名。如:
ldfld int32 [.moude MyApp.dll]MyApp.Program::X
Defining default value
.field
如:
.field public static int32 i = int32(1234)
.field private object o = nullref
如果我们在
.assembly extern mscorlib { auto }
.assembly MyApp {}
.module MyApp.exe
.field static int32 x
.namespace MyApp
{
.class public Program extends [mscorlib]System.Object
{
.method static private void Main(string[] args)
{
.entrypoint
l dc.i4 123456
s tsfld int32 x
l dsfld int32 x
c all voi
d [mscorlib]System.Console::WriteLine(int32)
r et
}
}
}
十一、Method
我们可以在Method Table 中找到程序集中所有方法记录,这些记录包含RV A、ImplFlags、Flags、Name、Signature、ParamList 的方法信息。RV A(Relative Virtual Address)记录方法体(method body) IL 代码在程序集文件中的相对虚地址。
方法的定义语法:
.method
{
}
Flags
1. Accessibility
privatescope: 该方法不能被引用。
private: 该方法只能被自身及其嵌套类型调用。
famandassem: 该方法只能被当前程序集内部的继承类型调用。(internal and protected) assembly: 该方法只能被程序集内部成员调用。
family: 该方法只能被继承类型调用。
famorassem: 该方法可以被程序集内部成员或外部继承类型调用。(internal or protected) public: 公共方法。
2. Contract
static: 静态方法。
final: 不能被override 的方法。
virtual: 虚方法,不能和static 同时使用。
hidebysig: 该方法对继承类型隐藏。该标记仅提供给编译器使用,但会被CLR 忽略。
3. Vitual method table (v-table) control flags
newslot: 必须和virtual 一起使用,添加该关键字的虚方法不会override 基类中同名(含签名)虚方法,而是在v-table 中创建一个新槽(new slot)。
4. Implementation
abstract: 抽象方法,不提供实现代码。其RVA = 0,任何拥有抽象方法的类型必须添加abstract 成为抽象类型。
specialname: 该方法名有特殊含义,如 .cctor、.ctor 等。
pinvokeimpl: 该方法是非托管方法,通过P/Invoke 封装调用。
5. Reserved
rtspecialname: 该方法拥有CLR 内部使用的特殊名称,必须和specialname 一起使用。Implementation Flags
1. Code type
cil: 该方法由CIL (common intermediate language) 实现。(默认)
native: 该方法由native code 实现。
runtime: 该方法由CLR 自动生成。只有mscorlib.dll 中的某些方法带有此标记。
2. Code management
managed: 托管代码。(默认)
unmanaged: 非托管代码,必须和native 一起使用。
3. Implementation and interoperability
internalcall: 内部使用标记。
synchronized: 指示JIT 自动为其插入同步代码,以保证多线程调用安全。在C# 中我们为方法添加[MethodImpl(MethodImplOptions.Synchronized)] 特性时,编译器就会为该方法添加该标记。对于实例方法而言,自动插入代码会锁定实例对象引用;而静态方法,会锁定其所在类型的静态类型对象(System.Type)。
noinlining: 禁止内联(inline)调用。
十二、Method-Parameter
我们看看在C# 中所熟悉的方法参数传递方式在IL 中如何实现。
1. ref
C#
public class Program
{
p rivate static void Main(string[] args)
{
int x = 1;
Test(ref x);
Console.WriteLine(x);
●C语言入门手册 ●这里不是教你什么知识,而是给你澄清一些资料,只给对编程一窍不通的或 者刚入门的人看。如果你尚未学习或者才学习不够一天,一定要看这手册,这份手册已经讲述的知识,我们不会在版面给予回答,此手册我会尽量保持准确,但如有不正确,请指正,我也会不断更新此手册 ●Q:什么是C? ●A:一门面向过程的计算机语言,发明至今已经差不多有三十年历史,由于 它相对其他高级语言高效,运行效率又比较接近低级语言,所以至今仍得到广泛的引用,无论你用windows还是linux,你现在看到东西的底层都是用C 写的,而大部分的网络协议都是用C实现的,画面最漂亮的游戏用C实现的,工业控制程序也是用C实现的。C不是万能,也不是垃圾,只是一门某些方面适用,某些方面不适用的语言 ●Q:什么是C++? ●A:一门面向对象的计算机语言,发明至今已经有二十多年了。由于面向对 象编程对程序架构有较好的帮助,因为比较适合构建大型的系统(当然,学术界对此存在争论),但无论如何,C++由于和C一样接近底层,而且又面向对象,所以也得到广泛的使用。C++不是万能,也不是垃圾,只是一门某些方面适用,某些方面不适用的语言,不要向某一个笨蛋一样认为c + 类== c++ ●Q:TC,VC,BC,BCB是什么?有什么区别?谁好? ●A:它们都是开发C/C++的开发环境,是软件。它们是不同时期由不同公司 发行的软件Turbo C ,Borland公司在八十年代末期发行的C语言的开发环境Turbo C++,Borland公司在八十年代末九十年代初发行的C++语言的开发环境Visual C++,Microsoft公司在九十年代至今发行的C/C++开发环境Borland C++,Borland公司在九十年代中发行的C/C++开发环境Borlan C++ Builder,Borland公司在九十年代后期至今开发的C/C++开发环境,与其他开发环境不用的是它属于快速应用程序开发(RAD),可以让你不写代码就能建立程序,当然它的运行效率见仁见智没有什么是万能的,不同场合用不同的东西而且C/C++还有很多开发环境,譬如gcc,watcom C++,Dev C/C++ ●Q:什么语言/开发环境最好? ●A:没有最好,只有最适用某方面 ●Q:需要什么基础才能学C/C++ ●A:至少学过幼儿园语文,小学英语,小学数学才能学,所以先确定你拥有 小学学历,然后就能学了至于学习C++前是否需要学C,C++的发明者认为不用,但见仁见智 ●Q:如何更有效的学习C/C++? ●A:不断的看书+实践,先把书上的练习题做完再说,务必记住不要钻牛角尖, 很多初学者经常犯这样的错误,不要盲目的提出问题,现在看来是问题其实在以后的实践和学习中都会慢慢理解的,任何东西都需要一个过程。万万不可浮躁。 ●Q:TC能开发windows软件吗? ●A:不能,因为不同系统,生成的程序格式不同 ●Q:要多久才能成为高手? ●A:当你不再问这个问题的时候,总是会有比你技术高的人,也许你在你生 活的环境中没有,的确可以说你在这个小范围是高手,但是再在别的地方一定会有比你厉害的人只是你没有接触到而已 ●Q:学C/C++有什么用? ●A:先想想你为了什么而学,想不到就不要学 ●Q:学完C/C++又能怎样 ●A:没怎样,学是为了使用服务的,只证明你会一门语言,但不等于你会开 发软件。就像学外语,为的是跟外国人交际,但如果你不懂交际,即使精通英语,法语,日语,朝鲜语,阿拉伯语,西班牙语……还是不会跟人交际。 你应该继续学习软件开发的知识,包括数据结构,算法,软件工程等等,还有要提高数学水平,譬如微积分,离散数学,矩阵,概率,统计,数值分析。 ●Q:我有很多不懂,怎么办? ●A:查帮助,搜索引擎。最著名的帮助文档叫MSDN,我们主要使用其光盘发 行版,D版可以从电脑城买,正版可以去微软订购,如果没有光盘可以去https://www.wendangku.net/doc/da1378178.html,查询。 ●二、开始学习了 ●Q:我在TC看到缺少cos.obj的提示,为什么?
共41页 资源类别: HDL 语言 内部公开 1.0 密级 版本文档编号 文档中心 Verilog HDL 入门教程 (仅供内部使用) yyyy/mm/dd 日期: 批准: 日期:中研基础 批准:2004.8.3 日期:中研基础拟制:版权所有 不得复制
修订记录 初稿完成 1.00 2004.8.3作者 描述 修订版本 日期 绝密请输入文档编号 Verilog HDL 入门教程 2004-08-16第2页,共41页 版权所有,侵权必究
目 录 28 5 结构建模..............................................................274.8 case 语句..........................................................254.7 条件语句..........................................................254.6.6 连接运算符....................................................254.6.5 条件运算符....................................................244.6.4 按位逻辑运算符................................................234.6.3 逻辑运算符....................................................224.6.2 关系运算符....................................................214.6.1 算术运算符. (21) 4.6 运算符和表达式.....................................................204.5.2 寄存器类型 ...................................................204.5.1 线网类型 (20) 4.5 数据类型..........................................................184.4.2 常量.........................................................184.4.1 值集合. (18) 4.4 数字值集合........................................................184.3 格式.............................................................174.2 注释.............................................................174.1.3 书写规范建议..................................................174.1.2 关键词.......................................................174.1.1 定义 (17) 4.1 标识符 (17) 4 Verilog HDL 基本语法 (16) 3.3.4 混合设计描述..................................................153.3.3 行为描述方式..................................................143.3.2 数据流描述方式................................................123.3.1 结构化描述方式 (12) 3.3 三种建模方式......................................................113.2 时延.............................................................113.1.3 模块语法......................................................103.1.2 模块的结构....................................................93.1.1 简单事例. (9) 3.1 模块 (9) 3 Verilog HDL 建模概述 (7) 2.4.2 能力..........................................................72.4.1 历史. (7) 2.4 Verilog HDL 简介.....................................................62.3 设计方法学.........................................................62.2 硬件描述语言.......................................................52.1 数字电路设计方法. (5) 2 HDL 设计方法学简介......................................................51 前言...................................................................绝密 请输入文档编号 Verilog HDL 入门教程 2004-08-16 第3页,共41页 版权所有,侵权必究
C#.NET是微软公司推出的一种类型安全、现代、简单、由C和C++衍生出来的面向对象的编程语言。掌握C#.NET的特点、程序结构、集成开发环境、C#语言的基本知识等,是利用好C#的前提。 本章内容 ?C#概述 ?C#语言基础 ?控制结构 ?数组 ?异常处理 1.1 C# 概述 C#是微软公司在2000年7月发布的一种全新的简单、安全、面向对象的程序设计语言。它是专门为.NET的应用而开发的语言。 https://www.wendangku.net/doc/da1378178.html,简介 1..NET定义 .NET技术是微软公司推出的一个全新概念,它代表了一个集合、一个环境和一个可以作为平台支持下一代Internet的可编程结构。.NET的目的就是将互联网作为新一代操作系统的基础,对互联网的设计思想进行扩展,使用户在任何地方、任何时间、利用任何设备都能访问所需要的信息、文件和程序。.NET平台包括.NET框架和.NET开发工具等部分。.NET框架(Framework)是整个开发平台的基础,包括公共语言运行库和.NET类库。.NET开发工具包括Visual https://www.wendangku.net/doc/da1378178.html,集成开发环境和.NET编程语言。.NET编程语言包括Visual Basic、Visual C++和新的Visual C#等用来创建运行在公共语言运行库(Common Language Run,CLR)上的应用程序。.NET框架结构如图1-1所示。
C#程序设计与案例教程 2 图1-1 .NET框架结构 2.公共语言运行库 公共语言运行库是.NET Framework 的基础。可以将运行库看成一个在执行时管理代码的代理,它提供核心服务(如内存管理、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。这些功能是在公共语言运行库上运行的托管代码所固有的。 3..NET框架类库 .NET Framework 类库是一个与公共语言运行库紧密集成的可重用的类型集合,是对Windows API封装的全新设计,它为开发人员提供了一个统一的、面向对象的、分层的和可扩展的庞大类库。该类库是面向对象的,使.NET Framework 类型易于使用,而且还减少了学习.NET Framework 的新功能所需要的时间。此外,第三方组件可与.NET Framework 中的类无缝集成。 例如,用.NET Framework 集合类实现一组可用于开发您自己的集合类的接口。您的集合类将与.NET Framework 中的类无缝地混合。 .NET Framework 类型使您能够完成一系列常见编程任务(包括字符串管理、数据收集、数据库连接以及文件访问等任务)。除这些常见任务之外,类库还包括支持多种专用开发方案的类型。例如,可使用.NET Framework 开发下列类型的应用程序和服务:?控制台应用程序。 ?Windows GUI应用程序(Windows 窗体)。 ?https://www.wendangku.net/doc/da1378178.html,应用程序。 ?XML Web services。 ?Windows 服务。 例如,Windows窗体类是一组综合性的可重用类型,它们大大简化了Windows GUI 的开发。如果要编写https://www.wendangku.net/doc/da1378178.html, Web窗体应用程序,可使用Web窗体类。 1.1.2什么是C# 1.C#及其特点 C#是微软公司在2000年7月发布的一种全新且简单、安全、面向对象的程序设计语
51单片机C语言 相信很多爱好电子的朋友,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚, 更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机 (Single Chip Computer)。单片机的应用到处可见,应用领域广泛,主要应用在智能仪表、实时控制、通信、家电等方面。不过这一切都没 什么关系,因为我(当然也包括任何人)都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机的经历,详细地讲叙给大 家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我只是把我个人学习的经历讲述一遍而已,仅仅对那些想 学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什 么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机, 但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人也同样不知道单片 机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候, 我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出, 或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看 我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出来了:我要选择那种语言为单片机编写程序呢这个问题,困扰了我好久。具 体选择C51还是A51呢汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容易明白单片机的每一时刻的具体工作情况,但是一合上 书或者资料,自己却什么也不知道了,根本不用说自己写程序了。于是,我最终还是决定学C51,毕竟C51和我们课上讲的C语言,有些类似, 编程的思想可以说是相通的。而且C51还有更大的优点就是编写大程序时的优越性更不言而喻,当然在那时,我并没有想的那么深远,C51的特 点,还是在后来的实践过程中,渐渐体会到的!朋友如果你选择了C51,那么请继续往下看,如果你选择了A51,那么你可以不要看了!因为下面讲 的全是C方面的,完全在浪费你的时间! 呵呵 ^_^ 第二,既然你想学好单片机,你必须得舍得花钱,如果不买些芯片回来自己动手焊焊拆拆的(但是在后期会介绍给大家一个很好用的硬件 仿真软件,并不需要你用实验板和仿真器了,直接在你的PC上完成,但是软件毕竟是软件,从某个特定的意义上来说是并不能代替硬件的),即使 你每天捧着本书,把那本书翻烂,也永远学不会单片机的!刚接触单片机的朋友,看了资料,一定会对以下几个词见的比较多,但是具体的概
1.求两个数的最小公倍数: #include
c语言学习心得体会一:c语言学习心得体会 c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算机进行交流,因此,c语言的学习对我们尤其重要。 在这个星期里,我们专业的学生在专业老师的带领下进行了c语言程序实践学习。在这之前,我们已经对c语言这门课程学习了一个学期,对其有了一定的了解,但是也仅仅是停留在了解的范围,对里面的好多东西还是很陌生,的在运用起来的时候还是感到很棘手,毕竟,万事开头难嘛。 由于时间的关系,我们的这次实践课程老师并没有给我们详细的介绍,只是给我们简单的介绍了几个比较重要的实际操作。包括了程序模块处理。简单界面程序。高级界面程序。程序的添加修改。用程序做一元线性回归处理以及用c语言程序来画粒度分布图等这几样比较重要的时间操作。 上机实验是学习程序设计语言必不可少的实践环节,特别是c语言灵活、简洁,更需要通过编程的实践来真正掌握它。对于程序设计语言的学习目的,可以概括为学习语法规定、掌握程序设计方法、提高程序开发能力,这些都必须通过充分的实际上机操作才能完成。 c语言学习心得体会二:c语言学习心得体会(1116字) c语言是在国内外广泛使用的一种计算机语言。其语言功能丰富、表达能力强、使用灵活方便、既具有高级语言的优点,又具有低级语言的许多特点,适合编写系统软件。其功能强大,不仅用在计算机上广泛用在电子,机械等方面上,而且,所有的 windows,unix,linux,mac,os/2,无一例外,哪一个不是c语言写的?很多新型的语言如,c++,java,c#,j#,perl... 都是衍生自c语言。掌握了c语言,可以说你就掌握了很多门语言。 学习c程序这门课一年了,这是我们学的第一门专业课,在大学里c语言不但是计算机专业的必修课程而且也是非计算机专业学习计算机基础的一门必修课程。所以作为我这个计算机专业的学生来说当然十分重要,老师在第一节课说过,c语言是计算机的基础,大多数软件都需要用c语言来编写,通过一个年的学习,使我由初步掌握简单的应试知识到完成高难度的深入编程,如我们在编写一个较大的程序时应该把它分开成几个小程序来看,这样会容易得多。同时,我觉得c语言应该是操作和理论相结合的课程,在不断地编写中去思考,两者是不可分割的。
《Verilog HDL 综合实用教程》读书笔记——锁存器、触发器
加入收藏
2007-08-29 00:23
?
转发分享 人人网 开心网 新浪微博 搜狐博客 百度收藏 谷歌收藏 qq 书签 豆瓣 淘江湖 Facebook Twitter Digg Yahoo!Bookmarks
锁存器:
推导出锁存器的一般规则是,如果变量未在 always 语句所有可能的执行过程中被赋值, 就推导出锁存器。如果变量在 if 的所有分支中都被赋值则综合成组合逻辑。 case、casez、casex 可转成 if、else 形式。当 case 中不是所有情况都列举出或使用 default 语句时、在 case 语句前对 case 中赋值对象赋初值也可避免综合出锁存器。若不 是以上各种情况且须综合成组合逻辑可以使用综合命令,如下: 例: always @ (Toggle) case (Toggle) //synthesis full_case 2'b01: NextToggle = 2'b10; 2'b10: NextToggle = 2'b01; end case end module 上例中的//synthesis full_case 是综合命令,告知综合工具 case 中已是全部列举可能的 情况,这样综合后无锁存器。(正常的 case 语句是有优先级的,先出现的优先级最高,若 case 中各分支是互斥时,综合成译码逻辑。当使用 casex 时用综合命令//synthesis parallel-case 告知综合工具该 casex 是互斥的)。 触发器: 沿控制的用触发器,且沿控制的赋值用非阻塞的方式“Zee<=A;”。 当 always 中是沿敏感时,此 always 中有 if……else if……且在这些 if……else if 中有多 于 1 个对同一变量赋值时,这个变量很可能被综合成有异步置位或清零的触发器。 例: always @ (negedge Reset or negedge Set or negedge CLKA) if (!Reset) NextState<=12; else if (!Set) NextState<=5;
C语言基础知识 第一章数据库基础知识 1.基本概念:数据库、数据管理经历的五个阶段、数据库管理系统、数据库应用系统、数据库管理员。 2.数据库系统的组成:硬件系统、数据库集合、数据库管理系统及相关软件、数据库管理员和用户。其中数据库管理系统是数据库系统的核心。 3.数据库系统的特点:(1)实现数据共享,减少数据冗余(2)采用特定的数据模型(3)具有较高的数据独立性(4)有统一的数据控制功能 4.数据模型:实体间联系的种类:一对一、一对多、多对多。 5.数据模型的三种类型:层次模型、网状模型和关系模型。 6.关系数据库基本术语:关系、元组、属性、域、关键字、外部关键字。 关系的特点 7.关系运算:传统的集合运算(并、差、交)另一类是专门的关系运算(选择、投影、连接、等值连接、自然连接) 8.VF两种运行方式:菜单方式和交互式方式(命令方式和程序方式) 9.所谓项目是指文件、数据、文档和对象的集合,其扩展名为.pjx。 10.项目管理器包含的选项卡:全部、数据、文档、类、代码、其他 11.项目管理器各选项卡所包含的文件有哪些? 12.项目管理器可以完成对文件的新建、添加、移去、删除,但不包含重命名。 第2章 1.常量的种类:数值型、字符型、日期型、日期时间型和逻辑型 在书写字符型、日期型、日期时间型和逻辑型需要加定界符 2.变量是值能够随时改变的量。变量名的命名规则:以字母、汉字和下划线开头,后接字母、数字、汉字和下划线构成,不包含有空格 3.当内存变量与字段变量同名时,要访问内存变量需加前缀M.(或M->),例如M.姓名4.数组定义的格式DIMENSION数组名()、 创建数组后,系统自动给每个数组元素赋以逻辑假.F. 5.表达式的类型:数值表达式、字符表达式、日期时间表达式和逻辑表达式。每个表达式的运算规则与结果。 6.运算符$称为子串包含测试,格式<字符表达式1>$<字符表达式2> 7.SET EXACT ON│OFF的区别与含义。 8.逻辑型运算符有三个:NOT、AND、OR,其优先级顺序为NOT、AND、OR 9.常用函数数值函数、字符处理函数、日期类函数、数据类型转换函数、测试函数10.常用函数:LEN()、SPACE()、LEFT()、RIGHT()SUBSTR()、AT()、DATE()、TIME()、YEAR()、STR()、 VAL()、CTOD()、宏替换函数:&字符型变量、EOF()、BOF()、IIF() 11.程序文件的建立和修改命令:MODIFY COMMAND程序名 12.程序的基本结构:顺序结构、选择结构、循环结构。 13.选择结构包括条件语句(IF—ELSE--ENDIF)和分支语句(DO CASE--ENDCASE)、14.IF----ENDIF必须成对出现,在do case结构中不管有几个CASE条件成立,只有最先成立的那个CASE条件的对应命令序列被执行 15.循环结构包括:DO WHILE---ENDDO FOR---ENDFOR SCAN---ENDSCAN(其
目录 前言 (2) 第一章 MAX+plusII 软件和license的获得 (6) 第二章 MAX+plusII 软件的安装和license及驱动的设置 2.1 MAX+plusII 软件的安装 (7) 2.2 MAX+plusII 软件的license设置 (8) 2.3 MAX+plusII 软件的驱动设置 (12) 第三章用VHDL语言设计三人表决器 3.1打开MAX+plusII (22) 3.2新建VHDL文档 (23) 3.3输入设计文件 (24) 3.4保存文件 (25) 3.5检查编译 (27) 3.6创建symbol (32) 3.7波形防真 (33) 3.8下载验证 (40) 第四章用原理图输入的方式设计三人表决器 (47) 第五章用verilog-HDL语言设计三人表决器 (51)
前言 编写本入门教程(V1.2)的目点是为了让FPGA/CPLD初学者快速地入门。该教程的特点是通过基本概念讲解和实际的例子来让初学者迅速了解FPGA/CPLD。该教程是共享文件,可以复制、下载、转载,如果转载该文章请注明出处:https://www.wendangku.net/doc/da1378178.html,;该教程未经许可,不得用于商业用途。 FPGA/CPLD是电子设计领域中最具活力和发展前途的一项技术,它的影响丝毫不亚于70年代单片机的发明和使用。 FPGA/CPLD的基本知识: 1.什么是FPGA/CPLD FPGA (Field Programmable Gate Array)是现场可编程门阵列,CPLD是复杂的可编程逻辑器件(Complex Programmable Logic Device)的简称,不同厂家有不同的称呼,Xilinx把SRAM工艺,要外挂配置用的EEPROM的PLD叫FPGA,把Flash工艺(类似EEPROM工艺),乘积项结构的PLD叫CPLD; Altera把自己的PLD产品MAX系列(EEPROM工艺),FLEX/ACEX/APEX系列(SRAM工艺)都叫作CPLD,即复杂PLD(Complex PLD),由于FLEX/ACEX/APEX系列也是SRAM工艺,要外挂配置用的EPROM,用法和Xilinx的FPGA一样,所以很多人把Altera的FELX/ACEX/APEX系列产品也叫做FPGA. 但由于FPGA和CPLD功能基本相同,只是工艺和实现形式不同,所以初学者可以不要详细区分,我们可以统称为FPGA/CPLD。 2.FPGA/CPLD的用途:
#include
getch(); } #include
Verilog HDL Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象 设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 =============================== 中文版Verilog HDL简明教程:第1章简介 Verilog HDL是一种硬件描述语言,用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。 Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。 Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。 历史 Verilog HDL语言最初是于1983年由Gateway Design Automation公司为其模
初学C语言常用简单程序代码素数的筛选 #include
main() { int x,s,t,d; scanf("%d",&x); s=x%60; t=(x/60)%60; d=(x/60)/60; printf("%d时%d分%d秒",d,t,s); } 三个数的交换 #include
?Verilog-A 30分钟快速入门教程 进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS Language Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(out)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(out)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如: @(cross(V(sample) -2.0, +1.0)) //指sample的电压超过2.0时触发该事件,将会执行后面的语句,+1.0表示正向越过,-1.0则相反 ddt( expr ) //求导,如: I(n1,n2) <+ C * ddt(V(n1, n2)); //表示了一个电容 idt( expr ,[ ic [, assert [, abstol ]]] ) //积分,如: V(out) <+ gain * idt(V(in) ,0) + gain * V(in); //比例积分,式中的0表示积分的初值 transition( expr [, time_delay [, rise_time [, fall_time [, time_tol ]]]] ) //将expr的值delay一下并指定上升下降沿时间,相当于一个传输门
?进入正题,学了几天的Verilog-A,平台是Agilent ADS,主要参考“Verilog-AMS L anguage Reference Manual”和ADS的帮助文档。 现在的状态算是入门了,写了个简单的PLL。总结这几天的学习,觉得效率太低,我以前有一定Verilog基础,研一时学过一点VHDL-AMS,学到现在这个状态应该半天就够了;入门的话,30分钟足矣;跟着这个教程走,你会很快了解和熟悉Verilog-A。(前提是有一定的Verilog 基础和电路基础) 1、基尔霍夫定律撑起了整个电路学的大厦(当然也可以认为基尔霍夫定律只是麦克斯韦方程的 简化版),作为模拟电路描述语言Verilog-A,同样将基尔霍夫定律作为其基本,最重要的两个概念便是流量(Flow)和位(Potential),在电学里是电流和电压,在力学里可以是力和距离,在热学里可以是功率和温差,等等。 在Verilog-A中,你可以将电阻电容电感等器件用一个方程式来表述,比如I(out) <+ V(o ut)/R,这样就产生了一个电阻,最后Verilog-A仿真器会用某种算法(迭代是最常见的)将I(o ut)和V(out)求解出来,然后根据这个解去算下一个时刻的I、V等,当然这仅仅是指时域仿真。 2、下面讲Verilog-A的语法: begin end //相当于C语言的一对大括号,与Verilog同 if ( expression ) true_statement ; [ else false_statement ; ] //与Verilog同 case ( expression ) case_item { case_item } endcase for ( procedural_assignment ; expression; procedural_assignment ) statement //case与for语句都跟Verilog、C语言类似 cross( expr [, dir [, time_tol [, expr_tol ]]] ); //cross用来产生一个event,如:
学习C语言(新手入门) 年轻的小荣子 阿尔法和李世石的围棋对弈让我们感受到了计算机的强大,事实上计算不仅要靠硬件设备的支持,还需要在里面运行代码(很多种,包括c),这些代码就是它的灵魂(譬如我们的思想)。 介绍几部通过在计算机里头运行代码从而创造无限可能的电影,个人觉得不错的:黑客帝国,超验骇客,创战纪,人工智能等。 正题,能编辑C语言的软件非常多,比如visual c++ ,turbo c等。理论总是离不开实践,在要学习C语言理论之前先要找到属于自己的能实现代码结果的软件。 这样说,计算机语言和人的语言的区别在于,人通过各种发音实现交流,但是计算机主要是通过电流来传达信息,所以只能用0/1来表示电流拥有的两种状态,这样最底层的计算运作就是通过一段长长的0/1代码,通过0和1的不同组合来表示文字或者信息。C语言当然不是最底层的0/1代码,他是一个沟通的中介,比如等于号在c语言里就是两个等号“==”,这样使得我们更容易和计算机交流了,只要学会了C语言,它就能把我们的语言翻译成计算机的语言。 以下内容从简单到困难,先来学会如何运行c语言代码(用vc 中文版): 1.按以下步骤打开界面(以后都可以这样打开): 2.一些常用的功能键: (1是compile编译的意思,就是把这些我们能看懂的符号转换成计算机代码,同时按这个键可以检查错误和验证是否能运行。2是build,建立一个可以运行的EXE类文件,就是把这些代码弄成一个能运行的东西。3就是run运行,只有经过查错和建立才可以按运行。是不是很简单,自己动手一遍就会) 3.输入代码并运行(里面的代码如下: —————————————— #include<> main() { int a,b,c; a=1,b=2; c=a+b; printf("%d",c); } ——————————————— Include的英文意思是包含、包括,顾名思义,#include<>就是把这个东西包含进去,其实#include< >是c语言里的一种格式,就是把什么包含进来的意思(这里是口语表达)。叫做头文件,什么是头文件呢?打个比方,在C语言里我们要用到很多的比如开根号、乘方、阶乘n!等等数学公式函数,那么就可以把这些常用的同类型的函数放到一起形成一个函数库,然后给它取个名字比如叫,这样当要用到这些函数的时候就不用自己的写了,直接用#include<>把整个库包含进来,里面的函数就可以直接调用。同样的,也是这样一个库,里面有输入输出函数(就是支持键盘输入和屏幕输出)可以调用。类似的还有图形函数库,字符串函数库等等,调用格式一样的。
Quartus Ⅱ8.1入门教程 (一个Verilog 程序的编译和功能仿真) Quartus Ⅱ 是Altera 公司推出的专业EDA 工具,支持原理图输入、硬件描述语言的输入等多种输入方式。硬件描述语言的输入方式是利用类似高级程序的设计方法来设计出数字系统。接下来我们对这种智能的EDA 工具进行初步的学习。使大家以后的数字系统设计更加容易上手。 第一步:打开软件 ● 快捷工具栏:提供设置(setting ),编译(compile )等快捷方式,方便用户使用,用户也可以在菜单栏的下拉菜单找到相应的选项。 ● 菜单栏:软件所有功能的控制选项都可以在其下拉菜单中找到。 ● 信息栏:编译或者综合整个过程的详细信息显示窗口,包括编译通过信息和报错信息。 快捷工具栏 菜单栏 工作区 资源管理窗口 任务管理窗口
注意以下命名要一致。 第二步:新建工程(file>new Project Wizard)1 工程名称: 2添加已有文件(没有已有文件的直接跳过next)所建工程的保存路径 工程名称顶层模块名(芯片级设计为实体名),要求与工程名称相同 如果有已经存在的文 件就在该过程中添加, 软件将直接将用户所 添加的文件添加到工 程中。
3 选择芯片型号(我们选择MAX3000A 系列下的EPM3256AQC208-10芯片) (注:如果不下载到开发板上进行测试,这一步可以不用设置) 4 选择仿真,综合工具(第一次实验全部利用quartus 做,三项都选None ,然后next ) 所选的芯片的系列型号 快速搜索所需的芯片 选择芯片
5 工程建立完成(点finish) 选择第三方综合工具,如果 使用Quartus内部综合工具 则选择none 选择第三方仿真工具,如果 使用Quartus内部仿真工具 则选择none 选择时序分析仪 工程建立完成,该窗口显示所建立工程所有的芯片,其他第三方EDA工具选择情况,以及模块名等等信息。