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
相关产品推荐
相关产品推荐

