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] <=


3万+

被折叠的 条评论
为什么被折叠?



