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可以实现各种数字电路设计,如逻辑电路、时序电路和算术电路。在项目进阶篇中,我们可以学习更复杂的电路设计技术,如使用硬件描述语言(HDL)进行设计,如VHDL或Verilog。这些语言可以更好地描述电路的行为与结构,使得设计更加灵活且易于维护。 此外,项目进阶篇也会介绍一些高级工具和开发环境,如Vivado等。这些工具提供了更多的功能和性能优化选项,可以帮助我们更好地进行设计和调试。 在项目进阶篇,我们也可以学习如何使用FPGA实现一些实际应用,如数字信号处理、图像处理和通信系统等。这些应用涉及到更多的算法和技术,需要更深入的学习和理解。通过这些项目,我们可以更好地理解FPGA在各种领域中的应用,并掌握如何将理论知识应用到实际项目中。 最后,项目进阶篇也会涉及到FPGA的性能优化和资源管理等内容。通过对FPGA资源的有效利用和性能优化,我们可以提高电路的速度和效率,减少功耗和成本。 总之,在项目进阶篇中,我们将进一步学习和探索FPGA的高级应用和使用方法,提高设计的灵活性和性能,并掌握将FPGA应用到实际项目中的技巧。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值