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

相关推荐
LabVIEW开发1 小时前
LabVIEW 如何把地下震源定位误差做到5米内
fpga开发·labview·labview知识·labview功能·labview程序
Dr.kangder4 小时前
嵌入式处理器架构解析(十)——DSP+FPGA
fpga开发·架构·嵌入式
szxinmai主板定制专家11 小时前
Zynq MPSoC实现半导体真空腔体状态监测|FPGA多传感器时序同步采集方案
fpga开发·zynq·控制器·mpsoc·半导体设备·fpga同步
学习FPGA的电气小兴兴13 小时前
基于FPGA的DDS信号发生器设计,生成频率可调的正弦波、三角波、锯齿波和方波
fpga开发·数字信号处理·fpga·vivado·dsp·dds·diy
szxinmai主板定制专家1 天前
Zynq MPSoC半导体高精度运动控制方案|FPGA硬件插补实现亚微米级伺服实时控制
人工智能·嵌入式硬件·fpga开发·zynq·运动控制·ethercat
星夜离尘562 天前
ILA 在线调试:Vivado 抓取片内信号与定位下板问题(附完整实操)
fpga开发
jz_ddk2 天前
[学习] 深入理解 USB 通信与 FPGA 实现:从协议到逻辑设计
学习·fpga开发·xilinx·usb2.0
星夜离尘562 天前
PWM 信号生成与呼吸灯:占空比控制、按键调光与舵机扩展(附完整 Verilog 实操)
fpga开发
zlinear数据采集卡3 天前
ZLinear DABM-D223 通信协议与软件开发全解析:从 USB CDC 到 DDS 波形输出
arm开发·嵌入式硬件·fpga开发·开源