FPGA--hello

1 前言

Carver Mead and Lynn Conway, Introduction to VLSI Systems, Addison-Wesley, 1979. ISBN: 0-201-04358-0.

《Introduction to VLSI Systems》,1979,作者Carver Mead & Lynn Conway,第一次系统化提出了软件设计硬件。

想试试FPGA很久了,去年就买了一块Intel的CycloneV,但是最后愣是点灯都没跑起来。加上其它事情也多所以也没怎么搞了。

最近看到有国产的荔枝唐nano开发板,用的国产高云芯片,大家知道,国产作坊下料还是挺猛的,尤其是配套文档这块,再加上一个开发板也就几十块,比起xilinx赛灵思之流还是划算很多,所以就买了一个来玩玩。

2 环境准备

教程确实做的不错,我基本上就是跟着官方教程来的。如下:点灯LED - Sipeed Wiki

首先是安装高云的IDE,现在fpga安装的空间都不小,要好几G,真是没搞懂为什么要这么大的空间。xilinx的软件好像是更夸张,随便都是百G起步。。。只能说很多芯片公司的软件技术真的有很大成长空间。

装完之后大概是这样的:

 官方的文档比起最新的软件,还是稍微有点滞后。这里有个小坑,要留意。

选设备的时候,那个Pin脚封装一定要选88P。否则后面会出现设置报错。

3  Verilog 代码

然后就是相对最熟悉的写代码环节。

module led (
    input sys_clk,          // clk input
    input sys_rst_n,        // reset input
    output reg [5:0] led    // 6 LEDS pin
);

reg [23:0] counter;

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter <= 24'd0;
    else if (counter < 24'd1349_9999)       // 0.5s delay
        counter <= counter + 1'b1;
    else
        counter <= 24'd0;
end

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        led <= 6'b111110;
    else if (counter == 24'd1349_9999)       // 0.5s delay
        led[5:0] <= {led[4:0],led[5]};
    else
        led <= led;
end

endmodule

这里是代码解读( Verilog我还没开始学,所以解读来自GPT):


这段 Verilog 是最经典的「流水灯」写法之一。

数据定义如下:

名称位宽方向说明
sys_clk1in系统时钟
sys_rst_n1in复位,低电平有效 (n 表示 active‑low)
led6out6 个 LED 引脚,reg 类型,时序逻辑驱动
counter24reg内部 24 位计数器

代码流程如下:

第一个循环always是计时器:

这里用一个 24 位的计数器counter产生约 0.5 s 的节拍;

时钟触发:上升沿计数;

复位:低电平时立即清零;

门限 1349_9999:等价十进制 13 499 999。 (若板载晶振是 27 MHz,计到 13 500 000 约 0.5 s)

第二个循环always是led控制:

就是控制灯光移动,每当计数器归零时,把 6 个 LED 的点亮位向左循环移动一格。

复位时:led = 111110 假设 LED 低电平点亮 则只亮最右边一个;若是高电平点亮则恰好相反。

计数器到达极值那一拍: {led[4:0], led[5]} 是拼接操作: 把原来 [4:0] 放高位,最左端插入旧的 led[5] → 实现“循环左移”效果,流水灯向左跑。

其它时刻 led 不变。

代码也不算难,看就基本和C控制寄存器的玩法差不多。

4 综合、约束、布局布线

也就是SynthesisConstraintsPlace&Route。因为FPGA是由大量可配置逻辑单元(CLB)、互联资源和少量专用模块组成,功能完全通过编程定义,逻辑实现和信号路径均需工具链自动规划。而MCU内部集成固定功能模块(如 CPU、RAM、UART、ADC 等),模块间的连接在芯片制造时已固定,开发者只需调用预设接口,无需关心底层物理实现。FPGA 的逻辑资源(LUT、FF)和互联资源是通用的,需工具链动态分配。而MCU的资源(如定时器、GPIO)是专用的,地址和功能在芯片手册中明确定义,开发者直接操作寄存器即可。

这个部分我觉得也是和传统编程区别最大的地方。

在高云的界面上,这三个部分是在这里进行设置:

这几个部分的详细解释是这样的:

综合Synthesis

之前的代码中有了描述了“寄存器行为”的抽象语义,但是FPGA 工具并不知道你是想用哪个寄存器、放在哪。也就是说给逻辑分配物理资源和具体位置。

约束Constraints:解决的问题如下:

哪个引脚是时钟? 输入/输出用哪个物理引脚? 最大延迟是多少? 要不要走高速 IO? 多快的频率必须满足?(Timing)

 点开约束,详细的设置大概是这样:

这个部分应该是要生成.xdc、.sdc文件,不过高云的IDE看起来是自动把这部分干了,不用再去手动配置文件。

布局布线Place&Route:这个部分就是做三件事。

1 把每个逻辑元件 放到芯片上的某个位置(place);

2 然后根据这些位置,自动生成连线,连接逻辑(route);

3 同时满足你的时序需求(Timing Constraints);

三个部分完成后,生成.bit / .bin / .fs / .sof等一系列文件。

从上面可以看出,FPGA就是很多东西需要自定义,而MCU这些都是定死的或者说不需要再自定义了。一个简单的类比如下:

阶段类比
写 Verilog/VHDL画建筑设计图(行为设计)
综合把图纸变成具体砖瓦组合(门级网表)
约束告诉施工队电、水、入口在哪(物理条件)
布局布线实际把砖瓦放入地基 & 走电线水管(物理实现)
Bitstream房子盖好,钥匙交给你(可以运行)

5 运行

 运行就是很简单了,可以直接写到sram中简单运行,或者写到flash中持久运行。写进去就自动开始跑了。

好了,就这样,先玩玩。。。 

为什么要学学习指导篇: 对于FPGA初学者来说,什么是FPGA?为什么要学习FPGA?怎么学习FPGA?这三个是我们最先会面对的大问题,我们只有搞明白、弄清楚了这三个问题,才能有目的、有计划的去掌握这门技术,否则,我们学习FPGA的愿望只是空中楼阁而已。学习指导篇包含哪些内容:该篇以什么是FPGA、为什么要学习FPGA、怎么学习FPGA为主线,详细的讲解了FPGA是什么、FPGA有什么用, FPGA发展前景,以及FPGA职业待遇,并且在该基础上,我们还进一步详细讲解了如何从一个什么都不会的FPGA初学者成长到无所不知、无所不能的一个FPGA工程师。 为什么要学数字电路篇: 数字电路是FPGA的敲门砖、垫脚石,为什么这样说呢,因为数字电路主要的内容就是逻辑和时序,而逻辑与时序就是FPGA设计的核心。逻辑无非就是与门、或门、非门 ,时序无非就是锁存器、触发器、寄存器等等,再复杂的设计也就是用这些基本电路搭起来的,那么我们只有知道了这些基本电路的功能才能搭建出想要的电路。数字电路篇包含了哪些内容:该篇是从数字逻辑最基础的0和1入手,以逻辑代数为基础详细来讲解与门、或门、非门等基本门电路的功能,又以基本的门电路为基础,进一步学习了组合逻辑电路,其中不同的与或非门组合,可构造出不同的组合逻辑电路,例如编码器、译码器、数据选择器等。接下来在组合逻辑电路的基础上,我们又进一步了解学习时序逻辑电路,时序逻辑电路不同于组合逻辑电路,时序逻辑电路能做到组合电路做不到的事情,那就是让电路具有“记忆”功能,如寄存器、计数器等。最后,我们深入探讨读者最为关心的可编程器件的内部结构和原理,为进一步学习FPGA原理打下了基础。 为什么要学硬件语法篇: 大家都知道软件设计使用软件编程语言,例如我们熟知的C、 Java等等,而FPGA设计使用的是HDL语言,例如VHDL和Verilog HDL,说的直白点, FPGA的设计就是逻辑电路的实现,就是把我们从数字电路中学到的逻辑电路功能,使用硬件描述语言Verilog/NHDL)描述出来,这需要设计人员能够用硬件编程思维来编写代码,以及拥有扎实的数字电路功底。硬件语法篇包含了哪些内容:该篇不仅仅是介绍了Verilog HDL基本概念和语法,更着重讲解了Verilog HDL的基本设计思想及优良的代码书写规范和风格。 为什么要学软件工具篇: Altera的开发环境为Quartus ll, xilinx的开发环境为ISE( IntegratedSoftware Environment ),这里我们选择的是Altera的器件,所以开发环境为Quartus ll, Quartus11开发软件是Altera公司为其FPGA芯片设计的集成化专用开发工具,是Altera最新一代功能更强的集成EDA开发软件,使用Quartus 1l可完成从设计输入,综合适配,仿真验证到下载调试的整个设计过程。Quartus 11集成了Modelsim-Altera, SignalTap工具,可以直接调用来完成设计任务的仿真及调试。软件工具篇包含了哪些内容:该篇不仅讲解了如何使用Quartus 1l软件、ModelSim和SignalTapll软件,还讲解了PLL. ROM,RAM,FIFO、 DDRIP核的使用。从第一个新工程建立,管脚分配,程序下载及工程仿真,工程调试等一系列图文操作手把手带领读者掌握软件的操作,更进一步铺开来详细讲解软件的操作界面及菜单说明,功能使用。解决读者在学习上遇到的最棘手的“软”问题,为进一步学习实战篇奠定了基础。 为什么要学项目实战篇: 前面的篇章多为理论知识,而这一篇是结合开发板实物,从理论上升到实践,将前面的基础知识运用到实际的工程项目当中。项目实战篇包含哪些内容:我们例举三人表决器、数字时钟、多终端点歌系统、数字示波器、数码相框、USB2.0摄像头和千兆网络摄像头这七个实际的工程项目,手把手带领大家从分析工程、分解工程、到最终实现工程。通过逐个解决工程中的实际问题,来学习原汁原味的FPGA设计。本篇一改传统教程里逐个讲解外设的方法,巧妙的将所有外设功能放在实际项目当中讲解,使读者1意X上做到了现现,活学活用。
### 什么是 M2S-HELLO-FPGA? M2S-HELLO-FPGA 通常指的是与 Microsemi SmartFusion2 FPGA 开发套件相关的入门级示例项目。这个示例项目旨在帮助开发者快速熟悉 FPGA 开发流程,尤其是基于 Microsemi(现为 Microchip)的 SmartFusion2 系列 FPGA。它通常包含一个简单的“Hello World”级别的功能,例如点亮 LED、通过 UART 输出调试信息等。 Microsemi SmartFusion2(M2S)系列是基于 ARM Cortex-M3 软处理器的 SoC FPGA,支持软硬件协同开发。M2S-HELLO-FPGA 示例项目通常包括以下内容: - **硬件设计**:使用 Libero SoC 工具创建一个 FPGA 项目,配置 FPGA 引脚、时钟、PLL 以及嵌入式软核(如 CoreUART、CoreGPIO 等)。 - **软件开发**:使用 SoftConsole(基于 Eclipse 的 IDE)编写 C/C++ 应用程序,与 FPGA 中的硬件模块进行交互。 - **调试与下载**:将 FPGA 配置文件(.bit 文件)和软件程序下载到目标板上,并通过 JTAG 或 UART 调试接口查看运行结果。 ### 示例代码结构 以下是一个典型的 M2S-HELLO-FPGA 项目的代码结构: ```c #include "mss_uart.h" #include "mss_gpio.h" int main(void) { // 初始化 UART MSS_UART_init(MSS_UART_0, 115200, MSS_UART_DATA_8_BITS, MSS_UART_NO_PARITY, MSS_UART_ONE_STOP_BIT); // 初始化 GPIO MSS_GPIO_init(); MSS_GPIO_config(MSS_GPIO_0, MSS_GPIO_OUTPUT_MODE); // 输出调试信息 MSS_UART_polled_tx_string(MSS_UART_0, "Hello from M2S-HELLO-FPGA!\r\n"); // 点亮 LED MSS_GPIO_set(MSS_GPIO_0, 1); while (1) { // 主循环 } return 0; } ``` ### 开发流程概述 1. **硬件设计阶段**: - 使用 Libero SoC 创建 FPGA 项目。 - 添加所需的 IP 核(如 CoreUART、CoreGPIO)。 - 配置引脚映射和系统时钟。 - 综合并生成比特流文件。 2. **软件开发阶段**: - 在 SoftConsole 中创建一个新的 C/C++ 工程。 - 编写与硬件交互的应用程序。 - 编译生成可执行文件(ELF 文件)。 3. **调试与部署阶段**: - 使用 JTAG 接口将比特流文件下载到 FPGA- 将软件程序加载到目标设备。 - 使用 UART 查看调试信息,验证功能是否正常[^1]。 ### 应用场景 M2S-HELLO-FPGA 示例项目适用于以下场景: - FPGA 开发入门教学。 - 嵌入式系统与 FPGA 协同开发的初步验证。 - 基于 SmartFusion2 的定制化系统开发前期原型验证。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值