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

如何使用Python/C/C++生成含恒定频率方波的VCD文件

实现方案:生成恒定频率方波VCD文件

1. 实现原理

VCD(值变转储文件)是通用的波形记录格式,不需要依赖Verilog生成,直接按照VCD标准语法拼接文本即可,核心结构分为两部分:

  • 头部定义区:声明时间单位、信号名称、位宽等元信息
  • 数值变化区:按时间顺序记录信号的电平跳变点

2. 代码实现

2.1 Python实现(最简版本)

可直接运行,生成1MHz、占空比50%的方波VCD文件:

# 配置参数
TIME_SCALE = "1ns"        # 时间单位
FREQ = 1e6                # 方波频率 1MHz
DUTY_CYCLE = 0.5          # 占空比
TOTAL_CYCLES = 100        # 生成的方波周期总数
SIGNAL_NAME = "square_wave"
OUTPUT_FILE = "square_wave.vcd"

# 计算高低电平持续时间(ns)
period_ns = int(1 / FREQ * 1e9)
high_ns = int(period_ns * DUTY_CYCLE)
low_ns = period_ns - high_ns

with open(OUTPUT_FILE, "w") as f:
    # 写入VCD头部
    f.write("$date\n    Generated by Python script\n$end\n")
    f.write(f"$timescale {TIME_SCALE} $end\n")
    f.write("$scope module top $end\n")
    f.write(f"$var wire 1 ! {SIGNAL_NAME} $end\n")
    f.write("$upscope $end\n")
    f.write("$enddefinitions $end\n")
    
    # 写入初始值
    current_time = 0
    f.write(f"#{current_time}\n")
    f.write("0!\n")
    
    # 循环写入电平跳变
    for _ in range(TOTAL_CYCLES):
        current_time += high_ns
        f.write(f"#{current_time}\n")
        f.write("1!\n")
        current_time += low_ns
        f.write(f"#{current_time}\n")
        f.write("0!\n")

运行后生成的square_wave.vcd即为符合标准的波形文件。

2.2 C实现版本

#include <stdio.h>
#include <stdint.h>

#define TIME_SCALE "1ns"
#define FREQ 1000000
#define DUTY_CYCLE 0.5
#define TOTAL_CYCLES 100
#define OUTPUT_FILE "square_wave.vcd"

int main() {
    uint64_t period_ns = (uint64_t)(1.0 / FREQ * 1e9);
    uint64_t high_ns = (uint64_t)(period_ns * DUTY_CYCLE);
    uint64_t low_ns = period_ns - high_ns;

    FILE *f = fopen(OUTPUT_FILE, "w");
    if (!f) {
        perror("Failed to open file");
        return 1;
    }

    // 写头部
    fprintf(f, "$date\n    Generated by C script\n$end\n");
    fprintf(f, "$timescale %s $end\n", TIME_SCALE);
    fprintf(f, "$scope module top $end\n");
    fprintf(f, "$var wire 1 ! square_wave $end\n");
    fprintf(f, "$upscope $end\n");
    fprintf(f, "$enddefinitions $end\n");

    uint64_t current_time = 0;
    fprintf(f, "#%llu\n0!\n", current_time);

    for (int i = 0; i < TOTAL_CYCLES; i++) {
        current_time += high_ns;
        fprintf(f, "#%llu\n1!\n", current_time);
        current_time += low_ns;
        fprintf(f, "#%llu\n0!\n", current_time);
    }

    fclose(f);
    return 0;
}

编译运行后即可生成相同的VCD文件。

3. 效果验证

生成的VCD文件可使用GTKWave等通用波形查看工具直接打开,显示的方波周期、占空比与配置参数完全一致。
参考截图说明:[GTKWave打开方波VCD效果] 截图左侧信号栏显示top.square_wave信号,右侧波形区域为连续的高低电平交替的恒定频率方波。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 10:24:08