Verilog学习方法—基础入门篇(二)

前言

在上一篇文章中,我们介绍了 Verilog 的基本概念、语法结构和入门学习方法。本篇文章将进一步探讨 Verilog 语言中的操作符、时序控制 以及常见设计技巧,帮助初学者更深入理解 Verilog HDL 在 FPGA 开发中的应用。

1. Verilog中的运算符

Verilog 提供了一系列运算符来支持逻辑运算、算术运算、位操作和条件判断。在 FPGA 设计中,合理使用这些运算符可以提高代码的可读性和设计效率。

1.1 算术运算符

运算符 说明 示例
+ 加法 sum = a + b;
- 减法 diff = a - b;
* 乘法 product = a * b;
/ 除法 quotient = a / b;
% 取模 remainder = a % b;

注意: 在 FPGA 设计中,除法和乘法通常需要大量硬件资源,因此建议使用移位运算或**查找表(LUT)**优化计算。

1.2 逻辑运算符

运算符 说明 示例
&& 逻辑与 y = (a > 0) && (b < 5);
` `
! 逻辑非 y = !(a == 1);

1.3 位运算符

运算符 说明 示例
& 按位与 y = a & b;
` ` 按位或
^ 按位异或 y = a ^ b;
~ 按位取反 y = ~a;

1.4 移位运算符

运算符 说明 示例
<< 左移 y = a << 2; (相当于 a * 4)
>> 右移 y = b >> 1; (相当于 b / 2)

2. Verilog中的时序控制

在 FPGA 设计中,时序控制 是核心部分。Verilog 提供了两种主要的时序控制方法:阻塞赋值 和非阻塞赋值。

2.1 阻塞赋值(==)

阻塞赋值的执行是顺序进行的,类似于软件语言中的赋值操作,适用于组合逻辑。

示例:

复制代码
always @(*) begin
    a = b;
    c = a; // 这里c的值取决于上一步a的赋值
end

2.2 非阻塞赋值(=<=)

非阻塞赋值是并行执行的 ,通常用于时序逻辑(触发器、寄存器等)。

示例:

复制代码
always @(posedge clk) begin
    a <= b;
    c <= a; // c 不会立即获取 a 的新值
end

总结:

  • 组合逻辑 用 =(阻塞赋值)。
  • 时序逻辑 用 <=(非阻塞赋值)。

3. Verilog中的流程控制

Verilog 提供了一些常见的流程控制语句,如 if-else、case、for、while 等,在设计不同的逻辑模块时会经常用到。

3.1 if-else 语句

适用于条件判断,例如设计一个简单的优先级编码器:

复制代码
always @(*) begin
    if (a == 1)
        y = 2'b01;
    else if (b == 1)
        y = 2'b10;
    else
        y = 2'b00;
end

3.2 case 语句

适用于多路选择结构,例如多路选择器(MUX):

复制代码
always @(*) begin
    case(sel)
        2'b00: y = a;
        2'b01: y = b;
        2'b10: y = c;
        2'b11: y = d;
        default: y = 0;
    endcase
end

建议: case 语句适用于状态机、指令译码等场景,可以提高代码可读性。

4. Verilog编写的常见问题

4.1 latches(锁存器)问题

如果 always 代码块中某些条件下变量没有赋值,综合工具可能会推导出锁存器 ,导致非预期的硬件结构。
示例(错误写法):

复制代码
always @(*) begin
    if (sel)
        y = a;
    // 缺少 else 分支,会导致 latch
end

正确写法:

复制代码
always @(*) begin
    if (sel)
        y = a;
    else
        y = 0;  // 明确指定默认值,避免 latch
end

4.2 时钟问题

时钟信号应始终由FPGA的全局时钟提供,避免手动生成时钟信号:

复制代码
always @(*) clk = ~clk;  // ❌ 这样会导致综合时钟问题

正确方式:

复制代码
always @(posedge clk) begin
    // 正确的时钟同步逻辑
end

5. 结语

在本篇文章中,我们进一步探讨了 Verilog 的运算符、时序控制和流程控制 ,并介绍了 FPGA 设计中常见的编写问题及优化方法。对于初学者来说,掌握这些基础知识后,建议结合仿真工具,通过编写和调试小型项目来巩固学习成果。

在后续的文章中,我们将深入讨论 Verilog 设计中的状态机(FSM)、测试平台(Testbench)以及优化技巧,敬请关注!


🚀 如果你对 FPGA 开发和 Verilog 学习感兴趣,欢迎关注 宸极教育 ,我们提供系统的 FPGA 课程,帮助你从零开始掌握 FPGA 设计技能! 🚀

相关推荐
szxinmai主板定制专家3 小时前
AMR 项目落地:机器人控制器硬件定制化需求复盘
arm开发·单片机·fpga开发·系统架构·机器人·am62x
FPGA小迷弟1 天前
FPGA 与卫星:从星载硬件到在轨智能的完整技术解析
fpga开发·架构·fpga·1024程序员节·无线电
NamoAmitabha1281 天前
CPU 内部结构是什么?---deepseek
fpga开发
abc light1 天前
ARM 裸机开发(6)——时钟树与定时器
arm开发·单片机·fpga开发
156082072192 天前
JFMZQ28DR、JFMZQ68DR、RFsoc XCZU47DR、XCZU48DR 信号处理板
fpga开发·信号处理
XMAIPC_Robot2 天前
-40~85℃宽温实测:RK3588 机器人控制器硬件底座,长时间 SLAM 定位稳定性验证
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga
樱木花道長2 天前
AMD Ross 深度系列 8:FAQ 七问七答(文末附网盘链接)
人工智能·fpga开发
FPGA小迷弟2 天前
FPGA 与无人机:从飞控实时性到智能载荷的硬件加速实践
人工智能·ai·fpga开发·架构·无人机·ai编程
低慢小uav2 天前
(已解决)Zynq芯片lwip协议栈,使用tcp作为服务器Service,接收大量数据时,长度接收正常,接收对数据校验,校验和异常分析
网络协议·tcp/ip·fpga开发
szxinmai主板定制专家2 天前
ARM+FPGA 数控机床控制器:选 CODESYS SoftMotion CNC,还是基于 LinuxCNC 自研搭建?架构、授权、实时性、量产风险深度对比
arm开发·fpga开发·codesys·数据采集卡·linuxcnc·rk3576