Verilog & FPGA入门实战:流水灯实验与硬件思维解析

1. 初识FPGA与Verilog:从软件思维到硬件思维的转变

大家好,今天我想和大家聊聊FPGA和Verilog的那些事儿。作为一个有多年经验的开发者,我刚开始接触FPGA时也踩过不少坑,特别是从软件编程转向硬件设计时的思维转变。如果你之前主要写C、Python这类软件代码,刚开始接触Verilog时可能会觉得有点懵——为什么代码看起来像C,但运行逻辑却完全不同?

其实关键在于理解"硬件描述语言"这个概念。Verilog不是用来写软件的,而是用来描述硬件电路的。当你写下一段Verilog代码时,你实际上是在设计一个真实的数字电路,这个电路最终会在FPGA芯片上以物理形式存在。这就是为什么Verilog代码中的每个语句都对应着具体的硬件组件和连接关系。

我刚开始用Tang Nano 9K开发板时,最大的"顿悟时刻"就是意识到:在Verilog中,所有的always块都是并行执行的!这完全颠覆了我对程序执行的认知。在软件中,代码是一行接一行顺序执行的;而在硬件中,所有电路模块都是同时工作的,就像交响乐团中不同乐器同时演奏一样。

2. 流水灯实验:硬件设计的"Hello World"

2.1 环境搭建与项目创建

首先让我们来搭建开发环境。高云的Gowin软件用起来相当友好,安装过程也很简单。下载好软件后,新建一个工程,选择Tang Nano 9K开发板对应的器件型号GW1NR-9。创建完成后,我们添加一个新的Verilog源文件,命名为led.v。

这里有个小技巧:我建议在项目目录中建立良好的文件结构,比如单独建立src、sim、constraints三个文件夹,分别存放源代码、仿真文件和约束文件。这样的习惯会让后续开发更加有条理,特别是当项目变得复杂时,你会感谢自己当初的整理。

2.2 流水灯代码详解

让我们来看一个基础的流水灯实现代码:

module led (
    input sys_clk,        // 27MHz系统时钟
    input sys_rst_n,      // 复位信号,低电平有效
    output reg [5:0] led  // 6个LED灯
);

reg [23:0] counter;      // 24位计数器

// 计数器逻辑
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter <= 24'd0;
    else if (counter < 24'd1349_9999)
        counter <= counter + 1'b1;
    else
        counter <= 24'd0;
end

// LED控制逻辑
always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led <= 6'b111110;  // 初始状态:第一个灯亮
    else if (counter == 24'd1349_9999)
        led[5:0] <= 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值