FPGA(FPGA)技术目前正受到广泛欢迎。 应用程序的数量在不断增长:除处理数字信号外,FPGA还被用于加速机器学习,区块链技术,视频处理和物联网。
该技术的主要缺点是:对于编程,使用了数字设备Verilog和VHDL的相当复杂和特定的描述语言。 这使新人进入FPGA的工作变得复杂,而且雇主很难找到在劳动力市场上具有这种特定知识的专家。 另一方面,带有
MyHDL框架的流行的高级Python编程语言使FPGA编程变得简单而有趣。 而且,了解Python的人在Verilog / VHDL方面的专家要多得多。 在一系列文章中,我想展示进入Python领域并了解Python并开始用这种语言编写真正复杂的FPGA项目是多么容易。 我注意到python不是直接在FPGA上执行的,而是一个生成固件的工具。
首先,我们需要python 3.6本身(此后,所有操作都在Ubuntu 18.04 OS上执行)。
安装myhdl:
pip3 install myhdl
作为“ Hello World!” 我们将编写一个简单的程序,使按下按钮时LED点亮。 在微处理器世界中,“ Hello World!” 这是一个使用单个LED进行闪烁的程序;在FPGA世界中,Hello World是一千个LED的闪烁。 板上只有四个LED,因此我们仅根据按钮按下情况对其进行闪烁。 重要的是要注意,FPGA中的所有代码与微控制器不同,是同时执行的,所有二极管同时点亮和熄灭。 在微控制器的情况下不是顺序的。 该测试使用WaveShare OpenEPM1270板和板上的Altera Max II EPM1270T144C5板。

创建一个新的python文件:
from myhdl import * from random import randrange def led_blinker(input1, led1, led2, led3, led4): @always_comb def on_off_led(): if input1 == 1: led1.next = 1 led2.next = 1 led3.next = 0 led4.next = 0 else: led1.next = 0 led2.next = 0 led3.next = 1 led4.next = 1 return on_off_led
要了解我们的代码是否正常工作,您需要验证工具。 实际上,任何用于FPGA的程序都是数字信号处理器,因此开发人员需要确保他正确地指出了如何处理该芯片。 这是通过仿真完成的,为此,您需要安装一个程序来显示已处理的信号。 有很多这样的程序,但是我认为这是目前最好的免费GTKWave。 它从终端放:
sudo apt-get install gtkwave
接下来,在带有固件的文件中,应描述测试环境。 这也是python函数:
def test(): input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)] test = led_blinker(input1, led1, led2, led3, led4) @always(delay(10)) def gen(): input1.next = randrange(2) return test, gen
在这里,测试环境生成一个零和一的随机序列(使用Python模块random)。
def simulate(timesteps): tb = traceSignals(test) sim = Simulation(tb) sim.run(timesteps)
然后我们初始化模拟器,将test_inverter环境函数拖到那里。 因此,我们得到了俄罗斯玩偶逆变器→test_inverter→模拟(以任意单位表示的时间)。
运行脚本后,将在工作文件夹中创建一个.vcd文件,该文件应通过gtkwave在终端gtkwave test_invereter.vcd中传递。

结果,生成了输入信号input1的随机序列,以及led_blinker函数如何处理这些信号。
在确保逻辑完全按照我们的要求工作之后,我们应该将此函数放入FPGA中。 我曾经使用过Intel(以前称为Altera)的芯片,对于其他制造商使用合适的CAD系统的芯片,此操作顺序与此类似。 在FPGA芯片上创建一个二进制文件,该文件由芯片制造商的编译器创建,对于Intel,它是Quartus,对于Xilinx Vivado。 编译器只能使用VHDL / Verilog中的代码,因此Python代码应翻译为这些语言中的任何一种(无关紧要)。
def convert(): input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)] toVerilog(led_blinker, input1, led1, led2, led3, led4) convert()
在此示例中,代码被翻译为Verilog。 结果在led_blinker.v文件中,Quartus将需要提供它以生成FPGA固件:
module led_blinker ( input1, led1, led2, led3, led4 ); input input1; output led1; reg led1; output led2; reg led2; output led3; reg led3; output led4; reg led4; always @(input1) begin: LED_BLINKER_ON_OFF_LED if ((input1 == 1)) begin led1 = 1; led2 = 1; led3 = 0; led4 = 0; end else begin led1 = 0; led2 = 0; led3 = 1; led4 = 1; end end endmodule
在这种开发FPGA固件的方法中,您可以忽略该文件并将其放入Quartus。
您可以从
fpgasoftware.intel.com下载Quartus,我们需要一个免费的Lite版本,对我们来说这已经足够了。 下载9 GB的基本版本大小。
对于普通的Linux用户来说,安装Quartus应该不是问题。 安装后,您需要在系统中设置一些参数,以便可以使用设备来刷新FPGA程序-程序员:
1.创建一个udev规则。 为此,请创建一个新文件/etc/udev/rules.d/51-altera-usb-blaster.rules,内容如下:
使用udevadm重新启动udev:
sudo udevadm control --reload
2.允许非root用户访问USB-Blaster设备。 为此,请使用以下行创建文件/etc/udev/rules.d/altera-usb-blaster.rules:
ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="666"
这使rw-rw-rw-可以访问编程器。
3.配置jtagd。 Quartus使用jtagd守护程序来工作,该守护程序将软件与编程器设备相关联。 使用Quartus从目录复制描述:
sudo mkdir /etc/jtagd sudo cp <Quartus install path>/quartus/linux64/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts
运行Quartus并创建一个新项目“文件”-“新建项目向导”,输入项目名称。
接下来,单击“下一步”。 然后在“添加文件”菜单中,将生成的Verilog文件扩展名为.v。 因此,如果从python文件中编辑verilog文件,它将被Quartus自动提取。接下来,我们进入器件选择菜单,在本例中为MAX II EMP1270T144C5,接下来的几次。 项目已创建。
在项目浏览器中,转到文件菜单,然后右键单击我们的Verilog文件“设置为顶级实体”。
我们编译项目。 现在,在“ Assignments-Pin Planner”菜单中,配置芯片上的引脚:

重新编译。 现在一切准备就绪,可以进行编程了:Tools-Programmer。 我们将编程器和电源连接到板上,在“硬件设置”中,选择我们的USB-Blaster,设置如图所示的复选框并单击“开始”。

程序员报告成功之后。 您可以在板上看到结果:

结论
本课描述了如何使用Python编程语言创建工作环境和第一个简单的FPGA项目。
考虑:
- 如何安装:
- 在Ubuntu中配置的USB Blaster编程器;
- FPGA开发的FPGA项目;
- 测试和验证项目;
- 为FPGA编译了一个项目;
- 项目上传到FPGA。