Skip to content

Commit acbea53

Browse files
committed
Add seq clock op example
1 parent 01e7bac commit acbea53

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

pycde_example/seq_ops_example.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import pycde
2+
from pycde import Clock, Input, Output, Module, generator
3+
from pycde.types import Bits
4+
from pycde.dialects import seq
5+
from pycde.signals import _FromCirctValue
6+
7+
8+
class SeqOpsExample(Module):
9+
"""演示seq方言中各种时钟操作符的使用"""
10+
11+
module_name = "seq_ops_example"
12+
13+
# 输入信号
14+
clk = Clock()
15+
rst = Input(Bits(1))
16+
enable = Input(Bits(1))
17+
data_in = Input(Bits(8))
18+
mux_select = Input(Bits(1))
19+
20+
# 输出信号
21+
clock_div_out = Output(Bits(1))
22+
clock_gate_out = Output(Bits(1))
23+
clock_inv_out = Output(Bits(1))
24+
clock_mux_out = Output(Bits(1))
25+
data_out = Output(Bits(8))
26+
27+
@generator
28+
def construct(ports):
29+
# 1. 演示 ClockDividerOp - 时钟分频器
30+
# 将输入时钟分频2^4=16倍
31+
clk_as_clock = ports.clk.value
32+
clock_div = seq.clock_div(clk_as_clock, 4)
33+
# 时钟类型不能直接连接到位输出,需要转换
34+
clock_div_bit = seq.FromClockOp(clock_div)
35+
ports.clock_div_out = _FromCirctValue(clock_div_bit.value)
36+
37+
# 2. 演示 ClockGateOp - 时钟门控
38+
# 根据enable信号控制时钟的传递
39+
clock_gated = seq.clock_gate(clk_as_clock, ports.enable.value)
40+
clock_gated_bit = seq.FromClockOp(clock_gated)
41+
ports.clock_gate_out = _FromCirctValue(clock_gated_bit.value)
42+
43+
# 3. 演示 ClockInverterOp - 时钟反相器
44+
# 将时钟信号反相
45+
clock_inverted = seq.clock_inv(clk_as_clock)
46+
clock_inv_bit = seq.FromClockOp(clock_inverted)
47+
ports.clock_inv_out = _FromCirctValue(clock_inv_bit.value)
48+
49+
# 4. 演示 ClockMuxOp - 时钟多路选择器
50+
# 在两个时钟源之间选择
51+
clock_muxed = seq.clock_mux(ports.mux_select.value,
52+
clk_as_clock,
53+
clock_div)
54+
clock_muxed_bit = seq.FromClockOp(clock_muxed)
55+
ports.clock_mux_out = _FromCirctValue(clock_muxed_bit.value)
56+
57+
# 5. 演示带使能的寄存器
58+
# 使用时钟门控的时钟作为寄存器时钟
59+
reg_with_ce = seq.CompRegClockEnabledOp(
60+
Bits(8), # result_type
61+
input=ports.data_in.value, # input
62+
clk=clock_gated, # clk
63+
clockEnable=ports.enable.value, # clockEnable
64+
reset=ports.rst.value,
65+
reset_value=Bits(8)(0).value,
66+
name="reg_with_ce" # 直接使用字符串而不是StringAttr
67+
)
68+
ports.data_out = _FromCirctValue(reg_with_ce.value)
69+
70+
71+
if __name__ == "__main__":
72+
# 创建系统并编译模块
73+
s = pycde.System([SeqOpsExample],
74+
name="seq_ops_example",
75+
output_directory="build/seq_ops_example")
76+
s.compile()

0 commit comments

Comments
 (0)