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-elsecaseforwhile 等,在设计不同的逻辑模块时会经常用到。

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 设计技能! 🚀

相关推荐
森旺电子5 小时前
Vivado使用心得
fpga开发
FPGA小徐6 小时前
AI 浪潮下,FPGA 如何实现自我重塑与行业变革
人工智能·fpga开发
FPGA小徐6 小时前
[FPGA IP系列] FPGA常用存储资源大全(RAM、ROM、CAM、SRAM、DRAM、FLASH
fpga开发
Szime7 小时前
AD9218 国产替代方向:双通道 10 位 105MSPS ADC 选型支持
单片机·嵌入式硬件·fpga开发·汽车
ALINX技术博客8 小时前
ALINX VD100+Simulink 快速实现 FPGA 图像处理 Sobel 边缘检测
图像处理·人工智能·fpga开发
FPGA小徐8 小时前
FPGA开发中的常用通信协议与通信接口区别与联系
fpga开发
Szime10 小时前
深智微40Gsps高速数据采集系统进入工程化阶段
科技·单片机·嵌入式硬件·fpga开发
2601_961845421 天前
2027考研数学大纲|数一数二数三
考研·fpga开发·ar·vr·mr·oneflow
X_xcccc1 天前
2026年嵌入式智能核心,从异构计算到敏捷开发的硬核指南
fpga开发·敏捷流程·zynq-7000·fpga板卡定制
9527华安1 天前
FPGA实现GTX Transceivers Wizard传输2路视频,基于aurora 8b10b编解码架构,提供4套工程源码和技术支持
fpga开发·aurora·gtx·高速接口·高速收发器·transceivers