39. VHDL を使った問題
signal x: std_logic
…
process (clk)
variable y : std_logic;
begin
if clk’event and clk = 1 then
y := x + 1
x <= x + 1
end if;
end process;
Q: x はいま 3 とします。
左辺にある y と x は
いくつになるでしょう?
40. VHDL を使った問題
signal x: std_logic
…
process (clk)
variable y : std_logic;
begin
if clk’event and clk = 1 then
y := x + 1
x <= x + 1
end if;
end process;
A:
y は 4、
x は 3のまま。
次のクロックで 4。
何を意味してい
るのか?
41. FPGA でパイプライン処理(再掲)
処理 処理 処理 処理 処理
処理を細分化することで高速化が可能
x + 1
x
x + 1
x
頭の中でオーバラップする時間を
考えながら設計する!!
何を意味してい
るのか?
59. Python のプログラム例
def func(x):
ans = 0
iterLeft = x
while ( iterLeft != 0 ):
ans = ans + x
iterLeft = iterLeft - 1
if True :
print("x = ", x, ", ans = ", ans, ",
iterLeft = ", iterLeft)
return ans
宣言しなくても
よい
代入は
ローカル変数
60. Python のローカルとグローバル変数
のルールは何ですか?
Python では、関数内で参照されるだけの変数は暗黙的にグローバル
にです。関数の本体のどこかで値が変数に代入されたなら、それは明
示的にグローバルであると宣言されない限り、ローカルであるとみなさ
れます。Python では、関数内で参照されるだけの変数は暗黙的にグ
ローバルにです。関数の本体のどこかで値が変数に代入されたなら、
それは明示的にグローバルであると宣言されない限り、ローカルであ
るとみなされます。
最初はちょっと驚くでしょうが、少し考えると納得できます。一方では、
代入された変数に global を要求することで、意図しない副作用を防げ
ます。他方では、グローバルな参照の度に global が要求されてしまう
と、 global を使ってばかりになってしまいます。ビルトイン関数やイン
ポートされたモジュールの内容を参照するたびにグローバル宣言をし
なければならないのです。その乱雑さは副作用を特定するための
global 宣言の便利さよりも重大です。
http://docs.python.jp/3/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python
61. Global と Local
? 関数内で参照されるだけの変数は暗黙的にグローバル。
? 関数の本体のどこかで値が変数に代入されたなら、ローカルであ
るとみなされます。
def func(x):
ans = g_v + x
return ans
ans: 代入されているのでローカル
g_v: 参照だけなのでグローバル
x: 引数なのでローカル
ルール
62. Fibonacci Number
#from polyphony import testbench
def fib(n):
if n <= 0: return 0
if n == 1: return 1
r0 = 0
r1 = 1
for i in range(n-1):
prev_r1 = r1
r1 = r0 + r1
r0 = prev_r1
return r1
#@testbench
def test():
expect = [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610]
for i in range(len(expect)):
result = fib(i)
assert expect[i] == result
print(i, "=>", result)
test()
73. まずは Lチカ、、、
? こんな感じでできます
といいたいところですが、デモしません。たぶん方向性が違うので
from polyphony import testbench, module, is_worker_running
from polyphony.io import Bit
@module
class Blink:
def __init__(self):
self.led = Bit(0)
self.append_worker(self.main, led)
def main(self):
led = 1
while is_worker_running():
self.led.wr(led)
led = ~led
self._wait(10000000)
def _wait(self, interval):
for i in range(interval):
pass
blink = Blink()
91. Fibonacci Number
from polyphony import testbench
def fib(n):
if n <= 0: return 0
if n == 1: return 1
r0 = 0
r1 = 1
for i in range(n-1):
prev_r1 = r1
r1 = r0 + r1
r0 = prev_r1
return r1
@testbench
def test():
expect = [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610]
for i in range(len(expect)):
result = fib(i)
assert expect[i] == result
print(i, "=>", result)
test()