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