是骡子是马牵出来溜溜。——民间谚语在前五天里我们已经打通了从“0/1原理”到“Verilog代码”再到“电脑仿真”的全部通路。第五天我们认识了FPGA这块“可无限重写的数字画布”。今天我们要从理论走向实践——用Verilog代码操作真实的硬件点亮LED。一、准备工作硬件与软件1. 硬件准备可选正如第五天所说国产FPGA的崛起让入门门槛降到了地板。我们推荐使用高云半导体GowinGW1NR-40C芯片进行入门学习。高云FPGA在国产芯片中优势明显开发工具免费好用、芯片价格亲民、学习资料齐全预计将来能广泛替代ASIC。更重要的是这款芯片内嵌Cortex-M3硬核CPU一块芯片可以学习两门技术FPGA和单片机。推荐使用配套的卡片式FPGA开发板。关注“嵌入式开发之道”公众号点击“私信”进入对话了解详细信息。这块板子足够跑通我们学过的所有例子包括明天的微型CPU。板载资源FPGA主芯片GW1NR-40C普通手机USB线既当电源又可下载调试无需额外JTAG电缆一个LED、两个按键38Pin GPIO扩展口可外接各种传感器背面丝印层标注了管脚编号 如果你暂时不想买硬件今天的内容依然值得阅读理解开发流程本身也是重要的学习。2. 软件准备高云 IDEFPGA 开发离不开专用的软件工具就像写软件需要编译器一样。高云半导体提供了免费的FPGA和MCU开发工具软件。下载与安装步骤访问高云半导体官网https://www.gowinsemi.com.cn进入菜单产品中心→云源软件 教育版点击下载最新版本Windows版下载压缩安装包后解压生成安装.exe执行文件双击运行安装。一路点击“我同意”“我接受”“下一步”“安装”“解压缩”“结束”直到安装好EDA软件及两个USB驱动FTDI和GWU2X用于编程下载。安装对话框每一步一直往下点击即可。安装完成后桌面出现图标双击打开软件界面如下开发帮助文档位置C:\Gowin\Gowin_V1.9.11.03_Education_x64\IDE\doc\CN二、点亮第一个 LED我们将实现一个最简单的功能让板子上的一个 LED 常亮。1. 新建工程打开 Gowin EDA点击File → New... → FPGA Design Project填写工程名称和目录比如myLED放在目录D:/test。选择器件搜索框输入4C选中GW1NSR-4C点击Next项目创建完成。点击Finish项目窗口展示如下我们可以在项目里工作了。2. 编写 Verilog 代码我们要让 LED 常亮本质上就是让连接 LED 的 FPGA 引脚输出高电平1代码如下module led_on ( output led ); assign led 1b1; endmodule代码解析output led声明一个输出端口名字叫led。assign led 1b1使用连续赋值把二进制常量1赋给led。这是一个纯粹的组合逻辑没有时钟上电即生效。依次选择菜单File→New…→Verilog File填写文件名称和目录比如LED目录按缺省值。在右上角编辑区域输入代码或者拷贝代码输好后通过菜单操作或者快捷图标方式菜单行下面的蓝色的小方块保存文件3. 综合接下来进行综合将verilog代码翻译成FPGA里面的电路。点击软件界面左边的“Process”出现如下界面双击Synthesize开始综合完成后出现绿色的对号。3. 约束约束将verilog代码中的端口与芯片的实际管脚绑定。双击Process中的FloorPlanner软件需要你创建一个文件来放这个绑定信息点击OK。出现如下界面点击最底部的I/O Constraints或者菜单Constraint→I/O Constraints, 会出现端口列表会看到我们代码里的端口led在Location位置处双击输入管脚编号10根据板子设计。输入后发现右边的芯片最上面的一个管脚高亮显示了。视角还可以切换到芯片的封装试图。点击快捷图标保存然后关闭约束窗口。4. 布局布线布局布线是将上述步骤翻译的电路和绑定的管脚布局在FPGA内部并确定如何连接。双击Process里面的“Place Route”完成布局布线。5. 编程下载下载编程双击“Programmer”弹出编程器对话框Cable Setting点击Save确定点击下载图标进行程序下载。Operation下面如果选SRAM Program掉电后程序就没有了双击SRAM Program弹出对话框将Access Mode选为Embedded Flash Mode程序将会烧到芯片内部的Flash中掉电后程序仍然在。下载后板子上的 LED 瞬间亮起你没有焊接任何电路只是写了一行代码就控制了真实的硬件。三、进阶让 LED 闪烁引入时钟点亮 LED 操作硬件虽然激动人心但它还是静态的。让我们引入时钟“总指挥”做一个真正的数字系统——闪烁灯。1. 设计思路我们要让 LED 每隔 0.5 秒翻转一次状态。开发板上有一个27 MHz时钟即1秒振振荡27,000,000次这个时钟接在FPGA芯片的45管脚上我们需要一个计数器对时钟脉冲进行计数当计数到0.5秒时即计数27M × 0.5 ≈ 13,500,000时翻转 LED 状态。2. 编写代码将工程里的代码替换掉换成led_blink.vmodule led_blink ( input clk, // 板载时钟输入管脚45频率为27MHz output reg led // led是输出端口且需要用reg类型因为在always块里赋值 ); // 定义计数器每0.5秒翻转1次 // 计算过程27MHz时钟 → 每秒27,000,000个周期 // 0.5秒需要27,000,000 ÷ 2 13,500,000 次计数 reg [31:0] counter 0; always (posedge clk) begin if (counter 13_500_000) // 这里加下划线更易读 counter 0; else counter counter 1b1; end // LED控制逻辑每0.5秒翻转1次 always (posedge clk) begin if (counter 13_500_000) led ~led; end endmodule3. 约束文件更新重新综合双击Process窗口的Synthesize。双击FloorPlanner进行管脚约束。这次我们有两个端口clk和led。因为clk接在管脚45因此将location更改为45后保存。双击“Place Route”完成布局布线。再双击Programmer完成程序加载。此时灯开始闪烁动态图如下四、从“点灯”到“CPU”今天你完成了从代码到硬件的闭环。但这还不是终点只是通往第 7 天的桥梁。无需人为干预硬件在自动执行闪烁好像是个活的东西有了“生命”一样。这里面其实就有了CPU的影子。你看这个“计数器”不需要你每次告诉它做什么它自己就知道何时计数、何时行动——这不就是“程序”的雏形吗我们明天将在此基础上通过verilog语言把这块FPGA一步一步的变成CPU。五、小结今天你完成了安装了 FPGA 开发环境Gowin EDA。编写了第一个 Verilog 程序实现了 LED 常亮。学习了引脚约束建立了代码与现实硬件的连接。经历了 FPGA 开发全流程综合、布局布线、生成 bit 文件、下载。利用时钟和计数器实现了 LED 闪烁构建了第一个有时序的数字系统。你手中的 FPGA已经被你用Verilog语言所控制。明天预告第7天——顿悟时刻​我们将把今天学到的所有知识熔铸成一个整体设计一个能执行指令的微型 CPU。你将亲手写下第一条 CPU 指令通过按键控制 LED 闪烁彻底理解“计算机是如何工作的”。