news 2026/5/5 8:37:27

从芯片内部看世界:手把手教你用Verilog在FPGA上点灯(入门必备的5个基础门电路实验)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从芯片内部看世界:手把手教你用Verilog在FPGA上点灯(入门必备的5个基础门电路实验)

从芯片内部看世界:手把手教你用Verilog在FPGA上点灯

第一次接触FPGA开发时,我被这个神奇的世界深深吸引——几行代码就能在硬件上创造出各种逻辑功能。还记得当初点亮第一个LED时的兴奋,仿佛打开了数字世界的大门。本文将带你从最基础的门电路开始,通过五个经典实验,用Verilog在FPGA上实现LED控制,体验从代码到硬件的完整流程。

1. 实验环境准备

1.1 硬件选择与连接

对于入门级FPGA开发,推荐使用以下硬件组合:

  • FPGA开发板:Xilinx Artix-7系列或Intel Cyclone 10 LP系列
  • 外设需求:至少2个按键开关和4个LED灯
  • 下载器:Xilinx平台选用Digilent USB-JTAG,Intel平台选用USB-Blaster

连接示意图:

FPGA开发板 ├── JTAG接口 → 下载器 → PC ├── 按键1 → IO引脚P12 ├── 按键2 → IO引脚P13 └── LED1 → IO引脚P42

1.2 软件工具安装

不同平台需要安装对应的开发环境:

  • Xilinx Vivado(Windows/Linux)
    # Ubuntu安装示例 sudo apt install libncurses5-dev libtinfo5 ./xsetup -b Install -a XilinxEULA,3rdPartyEULA,DownloadableOpensource
  • Intel Quartus Prime(Windows/Linux)
    # 安装完成后需添加环境变量 export PATH=$PATH:/opt/intelFPGA/20.1/quartus/bin

提示:初学者建议使用Vivado ML Edition或Quartus Prime Lite版本,它们对教育用途免费。

2. 基础门电路实验

2.1 非门实验:按键控制LED反向

非门(NOT Gate)是最简单的逻辑元件,实现信号反转功能。在FPGA上,我们可以用按键作为输入,LED显示输出状态。

Verilog实现代码:

module not_gate( input wire btn, // 连接开发板按键 output wire led // 连接开发板LED ); assign led = ~btn; // 核心逻辑:输出等于输入取反 endmodule

硬件验证步骤:

  1. 创建约束文件(XDC或QSF格式):
    # Xilinx Vivado约束示例 set_property PACKAGE_PIN P12 [get_ports btn] set_property IOSTANDARD LVCMOS33 [get_ports btn] set_property PACKAGE_PIN P42 [get_ports led] set_property IOSTANDARD LVCMOS33 [get_ports led]
  2. 综合并生成比特流文件
  3. 下载到FPGA验证:按下按键时LED应熄灭,松开时点亮

2.2 与门实验:双按键控制LED

与门(AND Gate)实现逻辑与运算,只有所有输入为1时输出才为1。我们将用两个按键模拟输入信号。

真值表对照:

按键A按键BLED状态
000
010
100
111

Verilog实现:

module and_gate( input wire btn1, input wire btn2, output wire led ); assign led = btn1 & btn2; // 逻辑与运算 endmodule

注意:实际按键通常为低电平有效,可能需要添加反相器:

assign led = ~btn1 & ~btn2;

2.3 或门实验:任一按键触发LED

或门(OR Gate)在任一输入为1时输出1。这个实验可以制作"紧急开关"效果。

硬件连接改进:

  • 增加第三个LED用于显示或门输出
  • 保持前两个LED分别显示两个按键状态

Verilog扩展代码:

module or_gate( input wire btn1, input wire btn2, output wire [2:0] leds // 三位LED总线 ); assign leds[0] = btn1; // LED0显示按键1状态 assign leds[1] = btn2; // LED1显示按键2状态 assign leds[2] = btn1 | btn2; // LED2显示或门结果 endmodule

3. 组合逻辑实验

3.1 与非门实验:反向与逻辑

与非门(NAND Gate)是与门和非门的组合,先进行与运算再取反。这是数字电路中最常用的通用逻辑门之一。

电路符号表示:

A --| | | NAND|-- Y B --|____|

Verilog实现方案对比:

实现方式代码示例资源占用
运算符直接实现assign y = ~(a & b);1个LUT
门级实例化and AND1(c, a, b); not NOT1(y, c);2个LUT

推荐使用运算符直接实现:

module nand_gate( input wire a, input wire b, output wire y ); assign y = ~(a & b); endmodule

3.2 异或非门实验:比较器应用

异或非门(XNOR Gate)输出两个输入是否相同,可用于制作简单的比较器电路。

应用场景示例:

  • 密码校验:当输入密码与预设值匹配时点亮LED
  • 信号一致性检测

Verilog实现技巧:

module xnor_gate( input wire [1:0] sw, // 两位拨码开关输入 output wire led ); // 两种等效实现方式 assign led = ~(sw[0] ^ sw[1]); // 方式1:异或后取反 // assign led = (sw[0] ~^ sw[1]); // 方式2:直接使用XNOR运算符 endmodule

4. 综合实验:门电路组合应用

4.1 简单密码锁设计

结合前面学到的门电路,我们可以创建一个基础的安全锁系统:

  • 使用4个拨码开关作为密码输入
  • 预设密码为4'b1010(二进制)
  • 当输入匹配时点亮绿色LED,不匹配时红色LED闪烁

Verilog实现代码:

module password_lock( input wire [3:0] sw, // 4位拨码开关 output wire green_led, output wire red_led, input wire clk // 板载时钟(50MHz) ); // 密码比较部分 wire match; assign match = (sw[3] ~^ 1'b1) & // 位比较 (sw[2] ~^ 1'b0) & (sw[1] ~^ 1'b1) & (sw[0] ~^ 1'b0); assign green_led = match; // 红色LED闪烁逻辑 reg [24:0] counter; always @(posedge clk) begin counter <= counter + 1; end assign red_led = ~match & counter[24]; // 约1.5Hz闪烁 endmodule

4.2 硬件调试技巧

当设计不能正常工作时,可以按照以下步骤排查:

  1. 信号完整性检查

    • 确认约束文件中的引脚分配正确
    • 用万用表测量按键和LED的电压电平
  2. 仿真验证创建测试平台文件:

    module tb_and_gate(); reg a, b; wire y; and_gate uut(a, b, y); initial begin a=0; b=0; #10; a=0; b=1; #10; a=1; b=0; #10; a=1; b=1; #10; $finish; end endmodule
  3. 内部逻辑分析

    • 使用SignalTap(II)或ILA工具抓取内部信号
    • 添加调试输出端口观察中间结果

5. 进阶思考与优化

5.1 时序约束与优化

当设计规模增大时,需要关注时序性能。基础约束示例:

# 时钟约束 create_clock -period 20.000 -name clk [get_ports clk] # 输入延迟约束 set_input_delay -clock clk 2.000 [get_ports btn*] # 输出延迟约束 set_output_delay -clock clk 2.000 [get_ports led*]

5.2 资源利用率对比

不同实现方式的资源消耗比较(Artix-7为例):

逻辑门类型LUT使用数最大频率(MHz)
非门1450
与门1400
或门1400
与非门1380
异或非门1350

5.3 实际项目中的应用

这些基础门电路在复杂系统中的典型应用:

  • 非门:信号极性转换
  • 与门:使能控制、地址解码
  • 或门:中断信号合并
  • 与非门:SR锁存器构建
  • 异或非门:奇偶校验、比较器

在完成这些实验后,可以尝试将这些模块封装成IP核,方便在更大项目中复用。例如创建一个基础门电路库:

module gates_lib( input wire a, input wire b, output wire [5:0] outputs ); assign outputs[0] = ~a; // NOT assign outputs[1] = a & b; // AND assign outputs[2] = a | b; // OR assign outputs[3] = ~(a & b); // NAND assign outputs[4] = ~(a | b); // NOR assign outputs[5] = ~(a ^ b); // XNOR endmodule
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/5 8:31:30

Python 爬虫反爬突破:访问轨迹随机化模拟真人操作

前言 随着 Web 风控体系持续迭代升级,单纯的接口参数伪造、IP 切换、请求头伪装等基础反爬手段已无法满足高防护站点的数据采集需求。现代化互联网平台不再仅依赖 IP 封禁与参数签名校验,而是深度依托用户访问行为轨迹、页面浏览逻辑、操作时序特征、交互行为习惯等多维行为…

作者头像 李华
网站建设 2026/5/5 8:23:30

别再死磕I2C了!用FPGA驱动OV7725摄像头,SCCB协议配置避坑指南

FPGA实战&#xff1a;OV7725摄像头SCCB协议配置全解析与避坑指南 当你在FPGA项目中使用OV7725摄像头时&#xff0c;是否遇到过这样的场景&#xff1a;按照标准I2C协议编写的驱动代码&#xff0c;在配置摄像头寄存器时总是失败&#xff1f;这很可能是因为你忽略了SCCB协议与I2C…

作者头像 李华
网站建设 2026/5/5 8:20:50

音频推理与模态识别技术:从特征工程到工业应用

1. 音频推理与模态识别技术概述音频推理与模态识别技术正在重塑人机交互的边界。这项技术让机器能够像人类一样理解声音环境中的复杂信息&#xff0c;从简单的语音指令识别到复杂的环境声学场景分析。我在智能家居和工业检测领域实际应用这套技术栈已有三年&#xff0c;见证了从…

作者头像 李华