第一章:CPLD与Verilog概述

各位同学好,我是老张。做FPGA/CPLD开发十几年了,今天咱们来聊聊最基础的东西——CPLD是什么?Verilog又是什么?为什么我们要用Verilog来开发CPLD?

说实话,我刚开始接触这行的时候,也搞不清楚CPLD和FPGA到底有啥区别。后来踩了不少坑,才慢慢摸出门道。今天就把这些经验分享给你们。

一、CPLD是什么?

CPLD,全称是Complex Programmable Logic Device,复杂可编程逻辑器件。说白了,就是一种可以让你「自定义」芯片功能的硬件。

你想想看,传统的数字电路,你要实现一个功能,得焊一堆74系列芯片,连线密密麻麻的,改起来还特别麻烦。CPLD就不一样了,你只需要写代码,下载进去,芯片就能按你的想法工作。改功能?重新下载一次就行。

CPLD的内部结构,我画了个图,你们一看就明白:

CPLD内部结构框图 宏单元阵列 (Logic Blocks) 每个宏单元含乘积项、触发器 可编程互连矩阵 (PIA / Switch Matrix) 连接宏单元与I/O I/O模块 输入/输出缓冲 I/O模块 输入/输出缓冲 特点:非易失性、上电即用、逻辑密度较小、延迟可预测

CPLD最大的特点是什么?非易失性。就是你下载完程序,断电再上电,程序还在。这一点跟FPGA不一样,FPGA大多是SRAM结构的,断电就丢了。

核心要点:CPLD适合做「胶合逻辑」——就是把几个芯片粘在一起的那种控制逻辑。比如地址译码、总线控制、状态机等。我早期做的一个项目,用CPLD实现了整个系统的复位管理和时钟分配,一片搞定,省了不少事。

二、Verilog是什么?

Verilog是一种硬件描述语言(HDL)。注意,它不是软件编程语言,是描述硬件行为的。

你写C语言,编译器会生成机器码,CPU去执行。你写Verilog,综合器会生成电路——真实的与门、或门、触发器、计数器……这些物理存在的电路。

我经常跟新手说一句话:「写Verilog的时候,脑子里要有电路图」。如果你脑子里只有软件的那套if-else,写出来的代码综合出来可能跟你想象的不一样。

举个例子:

// 这是一个简单的D触发器描述
module d_flip_flop (
    input  clk,
    input  d,
    output reg q
);
    always @(posedge clk) begin
        q <= d;
    end
endmodule

这段代码,综合出来就是一个D触发器。时钟上升沿的时候,把d的值锁存到q。就这么简单。

三、为什么用Verilog开发CPLD?

这个问题,我当年也问过自己。那时候市面上还有VHDL,还有原理图输入法。为什么我最终选择了Verilog?

  1. 语法简洁,上手快——Verilog的语法风格跟C语言很像,有编程基础的人一周就能上手。VHDL的语法太啰嗦了,一个实体声明就要写好几行。
  2. 行业主流,资源多——现在绝大多数IC设计公司都用Verilog/SystemVerilog。你学会了Verilog,不光能做CPLD,还能做FPGA,甚至做ASIC。我面试过不少公司,基本都要求Verilog。
  3. 仿真调试方便——Verilog的仿真机制很成熟,Modelsim、Vivado Simulator都支持得很好。我在项目中遇到过一个时序问题,就是靠仿真一点点定位出来的。
  4. 可读性好——相比原理图,Verilog代码更容易维护。一个几千门的CPLD,用原理图画出来密密麻麻的,改起来想死。用Verilog,改几行代码就行。

我的建议:如果你刚开始学,直接学Verilog。别走原理图那条老路了。原理图适合做小规模电路,稍微复杂一点就hold不住。我见过有人用原理图画了一个几百门的计数器,那连线……嗯,不说了。

四、开发环境安装与验证

工欲善其事,必先利其器。咱们得先把开发环境搭起来。

CPLD的主流厂商有两家:Intel(原Altera)和Lattice。对应的开发工具分别是Quartus II和Lattice Diamond。

4.1 Quartus II 安装要点

  • 去Intel官网下载Quartus II Web Edition(免费版)
  • 注意版本兼容性——Quartus II 13.0以后对某些老器件不支持了
  • 安装时选择对应的器件库,比如MAX II、MAX V系列
  • 建议安装ModelSim-Altera Starter Edition,用于仿真

避坑指南:我曾经在Windows 10上装Quartus II 13.0,死活装不上。后来发现是杀毒软件拦截了驱动安装。关掉杀毒软件,以管理员身份运行,一次成功。另外,安装路径不要有中文,不要有空格。

4.2 Lattice Diamond 安装要点

  • Lattice官网注册账号后下载Diamond免费版
  • 支持MachXO、MachXO2、MachXO3等主流CPLD系列
  • 安装过程比较友好,一路Next就行
  • 注意License申请——免费版需要在线获取License文件

4.3 验证环境是否装好

装完之后,咱们做个最简单的验证——写一个LED闪烁的程序,下载到开发板上。

// 简单的LED闪烁
module led_blink (
    input  clk,      // 假设输入时钟50MHz
    input  rst_n,    // 复位,低有效
    output reg led   // 接LED
);
    reg [24:0] cnt;
    
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt <= 0;
        else
            cnt <= cnt + 1;
    end
    
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            led <= 0;
        else
            led <= cnt[24];  // 取最高位,约0.3秒翻转一次
    end
endmodule

把这个代码综合、布局布线、生成烧录文件,下载到CPLD里。如果LED能闪烁,恭喜你,环境装好了!

验证清单:

  • ☐ 软件能正常打开,新建工程
  • ☐ 能添加Verilog源文件
  • ☐ 能进行综合(Analysis & Synthesis)
  • ☐ 能进行布局布线(Fitter)
  • ☐ 能生成烧录文件(Assembler)
  • ☐ 能下载到开发板

嗯,到这里,第一章的内容就差不多了。CPLD是什么、Verilog是什么、为什么用Verilog、环境怎么装,这些基础概念咱们都过了一遍。

记住一句话:「硬件设计,思路比代码重要」。代码写错了可以改,思路错了,整个项目都得重来。我见过太多人一上来就写代码,写到一半发现架构不对,全部推翻重来……那滋味,不好受。

下一章,咱们会深入Verilog的基本语法,从模块结构、数据类型、运算符开始。别急,一步一步来。


公众号:蓝海资料掘金营,微信deep3321