Verilog 零基础入门:语法、仿真与 FPGA 实战

一、入门前提

Verilog 是 FPGA 开发的核心硬件描述语言,学习需具备两大基础:一是数字电子技术常识(理解逻辑门、时序 / 组合逻辑等概念),二是 C 语言基础(有助于快速适应语法结构)。学习核心是掌握 “代码→硬件” 的映射逻辑,而非单纯记忆语法。

二、仿真环境选择

根据开发场景选择适配环境,需重点注意路径约束:

  • FPGA 开发环境:Xilinx Vivado(主流推荐)、Xilinx ISE(已停更)、Intel Quartus II
  • ASIC 开发环境:Synopsys VCS
  • 关键约束:电脑用户名、软件安装路径、工程路径必须全英文(无中文 / 特殊符号),否则会导致软件启动失败、编译报错或仿真异常。

三、Verilog 设计流程

  1. 需求分析:明确电路核心功能(如 LED 闪烁、数据运算);
  2. 功能划分:拆解复杂功能为独立子模块(如时钟模块、逻辑处理模块);
  3. HDL 描述:用 Verilog 代码编写模块,定义端口、数据类型与逻辑功能;
  4. 功能仿真:验证代码逻辑正确性,不通过则返回修改;
  5. 逻辑综合:将代码映射为 FPGA 内部物理结构(查找表、触发器等);
  6. 布局布线:按时序、引脚约束,匹配 FPGA 硬件资源;
  7. 时序仿真:验证时序性能,无问题则生成比特流文件,下载至 FPGA 硬件。

四、核心语法规则

1. 基础格式规范

  • 大小写敏感:clkCLK是不同标识符,关键字必须全小写;
  • 空格与换行:无语法意义,可灵活排版;
  • 语句结束:以分号;结尾,不可省略;
  • 注释方式:单行// 注释内容,多行/* 注释内容 */(不可嵌套)。

示例(两种写法功能一致)

verilog

// 推荐写法:分行排版 input wire a; input wire b; wire [1:0] results; assign results = (a == 1'b0) ? 2'b01 : (b == 1'b0) ? 2'b10 : 2'b11; // 紧凑写法:语法合法但可读性差 input wire a;input wire b;wire[1:0] results;assign results=(a==1'b0)?2'b01:(b==1'b0)?2'b10:2'b11; 

2. 标识符与关键字

  • 标识符:变量 / 模块的 “名字”,首字符为字母 / 下划线,后续可接字母 / 数字 / 下划线(不可数字 / 特殊符号开头);
  • 关键字:语言预留功能词汇(全小写),如reg(寄存器)、input(输入端口)、wire(线网)等;
  • 示例:reg [3:0] counter;中,reg是关键字,counter是标识符。

3. 数值表示规则

(1)四种基础逻辑值(硬件电平描述)
  • 0:逻辑 0(低电平,“假”);
  • 1:逻辑 1(高电平,“真”);
  • x/X:未知状态(信号可能为 0 或 1);
  • z/Z:高阻状态(无驱动源,逻辑值由上下拉电阻决定)。
(2)进制格式(格式:位宽 +' 进制符号 + 数值)
  • 二进制:'b(如2'b01);
  • 八进制:'o(如3'o15);
  • 十进制:'d(如4'd10);
  • 十六进制:'h(如8'h3F,适合简化宽位数据)。

4. 核心数据类型(仅两种,明确硬件映射)

(1)reg 类型

    Read more

    From Pixels to Numbers: A Deep Dive into ISBN Recognition with OpenCV and C++

    从像素到数字:基于OpenCV与C++的ISBN识别系统深度解析 1. 项目背景与核心挑战 在数字化浪潮席卷各行各业的今天,自动识别技术已成为连接物理世界与数字世界的重要桥梁。ISBN(国际标准书号)作为图书的唯一身份标识,其自动识别在图书馆管理、智能零售、出版发行等领域具有广泛应用价值。然而,传统OCR技术面对复杂背景、光照变化和倾斜变形等现实场景时,识别准确率往往难以满足实际需求。 本项目基于OpenCV和C++构建了一套完整的ISBN识别系统,通过精心设计的图像处理流水线,实现了从原始图像到数字编码的精准提取。系统在Visual Studio环境下开发,主要解决以下核心挑战: * 复杂背景干扰:图书封面通常包含丰富的色彩和图案 * 光照条件多变:不同环境下的亮度对比度差异显著 * 几何形变问题:拍摄角度导致的透视变形和旋转 * 字符分割困难:连笔、断笔等印刷质量问题 2. 技术架构与处理流程 2.1 系统整体架构 系统采用模块化设计,主要包含以下核心组件: class detectSolution { private: // 图像处理相关成员变量 Ma

    By Ne0inhk
    【C++STL】map与set(举例+详解,一文说懂)!

    【C++STL】map与set(举例+详解,一文说懂)!

    🌟个人主页:第七序章   🌈专栏系列:C++ 目录 ❄️前言: 一、☀️序列式容器与关联式容器 二、☀️键值对 三、☀️树形结构的关联式容器 四、☀️set 4.1 🌙set介绍  4.2 🌙set的构造和迭代器 4.3 🌙set的增删查 4.4 🌙insert和迭代器遍历使用样例  4.5 🌙find和erase使用样例 4.6 🌙multiset和set的差异 4.7 🌙set相关题目练习 五、☀️multiset 5.1 🌙multiset介绍 5.2 🌙multiset使用 六、☀️map 6.1 🌙map介绍 6.2

    By Ne0inhk
    《C++进阶之STL》【set/map 模拟实现】

    《C++进阶之STL》【set/map 模拟实现】

    【set/map 模拟实现】目录 * 前言: * ------------标准介绍------------ * 1. 标准库中的set/map是怎么实现的呢? * 2. 为什么需要两个模板参数(Key & Value)? * ------------模拟实现------------ * 头文件: * RBTree.h * Myset.h * Mymap.h * 测试文件:Test.cpp * 运行结果 * ------------基本操作------------ * 一、前置++操作 * 1. 本质 * 2. 步骤 * 3. 图示 * 4. 解释 * 二、前置--操作 * 1. 本质 * 2. 步骤 * 3. 图示 * 4. 解释 * ------------代码解释------------ * 片段一:

    By Ne0inhk
    C++分布式语音识别服务实践

    C++分布式语音识别服务实践

    基于 brpc+etcd + 百度 AI SDK 的分布式语音识别服务实践:从代码架构到踩坑复盘 一、项目背景与核心功能 最近基于 C++ 实现了一个分布式语音识别子服务,核心目标是提供高可用的 RPC 接口,支持客户端上传 PCM 音频文件并返回识别结果。技术栈选型如下: * RPC 框架:brpc(百度开源高性能 RPC 框架,支持多种协议); * 数据序列化:Protobuf(定义 RPC 接口和数据结构); * 服务注册与发现:etcd(分布式键值存储,实现服务上下线感知); * 语音识别能力:百度 AI 语音 SDK(提供成熟的 PCM 音频转文字能力); * 日志与配置:spdlog(高性能日志库)、gflags(命令行参数解析)。 项目分为服务端和客户端两部分:

    By Ne0inhk