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

相关推荐
仲南音21 小时前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner1 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20202 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy2 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia2 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20202 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子2 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安3 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun4 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议