You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现CMOS XOR门传播延迟模拟技术求助

Python实现带传播延迟的CMOS XOR门模拟

核心逻辑

真实CMOS XOR门的传播延迟意味着输出完成翻转需要固定时间,若输入在这段时间内再次变化,输出无法响应,会丢失跳变。实现的核心是:

  • 记录输出上一次翻转的时间点
  • 每次输入变化时,计算当前时间与上一次翻转的时间差
  • 仅当时间差≥传播延迟阈值时,才更新输出;否则保持原输出状态

方案1:固定采样周期的数据流模拟

适用于输入是按固定时间间隔采样的0/1序列,用采样次数作为时间单位:

def cmos_xor_with_delay(a_stream, b_stream, delay_cycles):
    prev_output = 0
    # 初始设置为负延迟,确保第一次输入变化能触发输出翻转
    last_toggle_cycle = -delay_cycles
    output_stream = []
    
    for cycle_idx, (a_bit, b_bit) in enumerate(zip(a_stream, b_stream)):
        ideal_output = a_bit ^ b_bit
        
        # 仅当理想输出与当前输出不同时,检查延迟条件
        if ideal_output != prev_output:
            cycles_since_last_toggle = cycle_idx - last_toggle_cycle
            if cycles_since_last_toggle >= delay_cycles:
                prev_output = ideal_output
                last_toggle_cycle = cycle_idx
        
        output_stream.append(prev_output)
    
    return output_stream

使用示例

# 测试输入:a快速跳变,b保持0
a_stream = [0, 1, 0, 1, 0, 1]
b_stream = [0, 0, 0, 0, 0, 0]
# 设置传播延迟为2个采样周期
delay = 2

output = cmos_xor_with_delay(a_stream, b_stream, delay)
print("输入a:", a_stream)
print("输入b:", b_stream)
print("带延迟的XOR输出:", output)

输出结果:

输入a: [0, 1, 0, 1, 0, 1]
输入b: [0, 0, 0, 0, 0, 0]
带延迟的XOR输出: [0, 1, 1, 1, 0, 0]

可以看到:第2、3次a的跳变因间隔小于延迟,输出未响应,丢失了两次跳变。


方案2:可变时间戳的数据流模拟

适用于输入是带实际时间戳的事件序列(更贴近真实硬件场景):

def cmos_xor_with_variable_delay(timed_a, timed_b, delay_ns):
    # 初始化当前输入值和输出状态
    current_a = timed_a[0][1]
    current_b = timed_b[0][1]
    prev_output = current_a ^ current_b
    last_toggle_time = timed_a[0][0]  # 初始输出时间取第一个事件的时间
    output_events = [(last_toggle_time, prev_output)]
    
    # 合并所有输入事件并按时间排序
    all_events = sorted(timed_a + timed_b, key=lambda x: x[0])
    
    for event_time, val in all_events[1:]:
        # 更新对应输入的当前值
        if any(t == event_time and v == val for t, v in timed_a):
            current_a = val
        else:
            current_b = val
        
        ideal_output = current_a ^ current_b
        if ideal_output != prev_output:
            time_since_last_toggle = event_time - last_toggle_time
            if time_since_last_toggle >= delay_ns:
                prev_output = ideal_output
                last_toggle_time = event_time
        
        # 记录当前时间点的输出状态
        output_events.append((event_time, prev_output))
    
    return output_events

使用示例

# 带时间戳的输入:a在10ns、20ns、25ns、35ns跳变,b保持0
timed_a = [(10, 0), (20, 1), (25, 0), (35, 1)]
timed_b = [(10, 0), (35, 0)]
# 设置传播延迟为8ns
delay = 8

output = cmos_xor_with_variable_delay(timed_a, timed_b, delay)
print("带时间戳的XOR输出:", output)

输出结果:

带时间戳的XOR输出: [(10, 0), (20, 1), (25, 1), (35, 0)]

解释:20ns时输出翻转为1,25ns时输入再次变化,但与上次翻转间隔仅5ns<8ns,输出保持1;35ns时与上次翻转间隔15ns≥8ns,输出翻转为0。

内容的提问来源于stack exchange,提问作者Salvatore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:35:18