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

相关推荐
c-u-r-ry309 小时前
009---基于Verilog HDL的单比特信号边沿检测
嵌入式硬件·fpga开发
数字芯片实验室9 小时前
【AI速读】突破形式验证的极限:数据包协议验证实战指南
fpga开发
博览鸿蒙13 小时前
Verilog学习方法—基础入门篇(一)
fpga开发
qq_4165602014 小时前
fmql之Linux WDT
linux·fpga开发
hexiaoyan8271 天前
国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡
fpga开发·3u pxie·jfm7k325t板卡·k7图形图像硬件加速器·fmql45t900i
CWNULT1 天前
AMD(xilinx) FPGA书籍推荐
fpga开发
啄缘之间2 天前
17. 示例:用assert property检查FIFO空满标志冲突
学习·fpga开发·verilog·uvm·sv
Sunrise黎2 天前
FPGA学习(一) —— 四位全加器
学习·fpga开发
通信小小昕3 天前
Verilog IIC驱动| FPGA驱动
fpga开发·iic·状态机·驱动·i2c