FPGA--hello

发布于:2025-06-21 ⋅ 阅读:(20) ⋅ 点赞:(0)

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,空间是很坑爹,弄完差不多100G,真是没搞懂为什么要这么大的空间。xilinx的软件好像也是只大不小。。。只能说很多芯片公司的软件技术真的有很大成长空间。

装完之后大概是这样的:

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

选设备的时候,哪个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 是**最经典的「流水灯」**写法之一。它做了两件事:

1 计时——用一个 24 位的计数器 counter 产生约 0.5 s 的节拍;

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

名称 位宽 方向 说明
sys_clk 1 in 系统时钟
sys_rst_n 1 in 复位,低电平有效 (n 表示 active‑low)
led 6 out 6 个 LED 引脚,reg 类型,时序逻辑驱动
counter 24 reg 内部 24 位计数器

第一个循环always是计数器:

时钟触发:上升沿计数;

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

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

第二个循环always是led控制:

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

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

其它时刻 led 不变。

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

4 综合、约束、布局布线

也就是Synthesis,Constraints,Place&Route。

这个部分估计是和传统编程区别最大的地方。

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

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

这几个部分的解释是这样的。

综合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中持久运行。写进去就自动开始跑了。

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


网站公告

今日签到

点亮在社区的每一天
去签到