先决条件
您需要对python有基本理解,以便使用MyHDL。如果您不了解python,请不要担心:它是学习最容易编程语言之一。学习python是工程专业人员能够做的最好的时间投资之一。
对于初学者来说,http:/docs.python.org/教程可能是在线教程最好的选择。备选办法见http:/wiki.python.org/moin/BeginnersGuide。
一种硬件描述语言如verilog或vhdl的工作知识也会很有帮助。
本手册中的代码示例有时为了清晰起见缩短了时间。完整的可执行示例可以在示例/手动/中找到。
生成器的小段教程
生成器在python 2.2中引入。因为生成器是的MyHDL关键概念,这里包含了一段小教程。
考虑以下不合理的函数:
def function():
for i in range(5):
return i
这不太有意义。一旦输入第一个循环迭代,函数返回:
>>> function()
0
返回对于函数调用来说是致命的。进一步循环迭代永远不会得到机会,当返回时函数调用中没有任何东西会被抛出。
为了将函数转换为生成器函数,我们用yield替换return:
def generator():
for i in range(5):
yield i
现在我们得到了:
>>> generator()
<generator object at 0x815d5a8>
当调用生成器函数时,它返回生成器对象。生成器对象支持迭代器协议,这是一种高代价的方法,可以通过调用它的next方法来生成后续值:
>>> g = generator()
>>> g.next()
0
>>> g.next()
1
>>> g.next()
2
>>> g.next()
3
>>> g.next()
4
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
StopIteration
现在我们可以根据需求从for循环生成后续值,直到它们耗尽为止。结果是,yield语句就像一个return,除了它不是致命的:生成器在yield语句执行生成后记住它的状态和代码中的位置。高阶代理器可以通过调用生成器next方法来决定何时获得下一个值。我们说生成器是可恢复的函数。
如果您熟悉硬件描述语言,那么这听起来很熟悉。在硬件仿真中,也有一个高阶代理,仿真器,它与这种可恢复函数相互作用; vhdl称为process过程, verilog成为always块。同样,python生成器提供了一种优雅高效的方法来建模并发,而不必依赖某种形式的线程。
使用生成器来建模并发性是MyHDL的第一个关键概念。第二个关键概念是一个相关的概念:在MyHDL中,所产生的值指定了生成器在恢复之前应该等待什么条件。换句话说,yield语句作为一般敏感性列表。
装饰器
python 2.4引入了一个名为装饰器的特性。MyHDL利用此特性定义一些有助于硬件描述的装饰器。然而,一些用户可能还不熟悉装饰器。因此,这里稍作介绍。
一个装饰器由函数声明前面的特殊语法组成。它指的是一个装饰函数。装饰函数自动将声明函数转换为其他可调用对象。
装饰功能装饰在装饰说明中使用如下:
@deco
def func(arg1, arg2, ...):
<body>
此代码与下列代码等效:
def func(arg1, arg2, ...):
<body>
func = deco(func)
注意,装饰语句直接在函数声明前面,并且函数名函数自动重用为最终结果。
MyHDL使用修饰符从本地函数定义创建现成的仿真生成器。他们的功能和用法后面将进一步描述。