PYNQ的PS部分可能和大家平时计算机开发流程差不多,不过PL端的FPGA相对而言就生疏一些了。
由于我们的PYNQ-Z2板搭载的是ZYNQ XC7Z020-1CLG400C SoC(可见板子原理图,提取密码wcve)
芯片选择xc7z020clg400-1
ok完成创建。
接下来就该添加verilog文件了,让我想起了当年在basys3上写verilog的日子。
单击加号选择add or create designe sources,然后选择create file,名字就叫PLled吧
这里需要考虑一下我们要实现什么功能,就简单的两个switch控制四个灯吧,或者四个button控制四个灯,算了全写上吧先,在IO port定义的地方定义两个input, switch和button,一个output led
ok接下来考虑一下咱们的verilog写啥
先来个用拨码开关表示一个2位二进制数,然后点亮对应的灯吧,写入这样的verilog代码
module PLled(
input [3:0] btns,
input [1:0] sws,
output [3:0] leds
);
reg [3:0] leds;
always@ ( sws)
begin
case(sws)
0:leds = 4'b0001;
1:leds = 4'b0010;
2:leds = 4'b0100;
3:leds = 4'b1000;
default: leds = 4'b1111;
endcase
end
endmodule
约束文件的添加可以有两种方法,直接写代码和通过vivado生成
在比如综合完成知乎,打开IO planning
可以看到最下面有让你定义btns等几个变量对应的IO引脚的地方,那到底选哪个呢?
打开原理图,找LED1
OK是P14,旁边的LED0是R14,同理有LED2为N16,LED3为M14
然后开关sw0是M20,sw1是M19
按键btn0 D19,btn1为D20,btn2为L20,btn3为L19
一一对应的进行勾选。
把这个constrains保存下来,然后让他重新综合(这里忘了改那个I/Ostd,记得改成LVCMOS33)
刚才保存的constrains文件其实在source中可以直接看到,如图所示,其实它就是一个文本,所以另一个方法就你直接新建一个xdc文件,然后把图中这些引脚定义的语句放进去就行。
以后引脚多了的话一个一个的去选怕是要累死人,还是文本这样的比较好操作。
接下来就是generate bitstream了
emmm没啥好说的,点就完事了,然后不报错,ok
连接好JTAG模式,上电
在VIVADO中打开hardware manager,自动连接目标
可以看到下载器连接有ARM核和FPGA内核,右键FPGA选择program device,选择刚才生成的bitstream,点击点击“Program”下载程序,然后再看板子,调节拨码开关可以有对应的灯亮起。
这次我们添加一个输入端,clk,回到刚才的verilog文件中
重新修改一下(全部重写)
module PLled(
input [3:0] btns,
input [1:0] sws,
input clk,
output reg [3:0] leds
);
// 1000000000
reg [32:0]count;
parameter timecounts = 100000000;
reg [1:0] coe = 0;
always@ (posedge clk)
begin
if (btns[0]) //复位
begin
count <= 0;
leds = 4'b0001;
coe <= 0;
end
if (btns[1])
begin
coe <= coe - 1;
end
if(btns[2])
begin
coe <= coe + 1;
end
count <= count +1; // 计数增加
if (count > coe * timecounts)
begin
leds <= {leds[2:0],leds[3]}; // 循环移位
count <= 0;
end
end
endmodule
希望实现的功能是按下btn0复位,按下btn1和btn2时分别是灯的循环移位速度减慢和加快。(在0和最大值的地方会越界。)
同样打开引脚设定,添加clk引脚W5
直接往文本里面写就好了
set_property PACKAGE_PIN H16 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
然后依然是synthesis
这次我们要多一步,打开constrains wizard,定义一个时钟频率,这决定了我们灯闪的速度。
然后再implementation,generate bitstream二连
同样是烧录到开发板上,可以看下实验效果
先按下复位键btn0初始化,然后可以看到灯在依次循环移位。
不过代码写的不好,也没有防抖什么的,所以按键不太好用。。。。