PYNQ-Z2 初识(九) 单独PL端的简单开发——点个灯<(^-^)>

PYNQ的PS部分可能和大家平时计算机开发流程差不多,不过PL端的FPGA相对而言就生疏一些了。

工程的创建

首先来一个工程
在这里插入图片描述

由于我们的PYNQ-Z2板搭载的是ZYNQ XC7Z020-1CLG400C SoC(可见板子原理图,提取密码wcve)
在这里插入图片描述
芯片选择xc7z020clg400-1在这里插入图片描述
ok完成创建。

一个不包含时钟的工程

verilog文件

接下来就该添加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

约束文件 constrain

约束文件的添加可以有两种方法,直接写代码和通过vivado生成

通过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初始化,然后可以看到灯在依次循环移位。
不过代码写的不好,也没有防抖什么的,所以按键不太好用。。。。

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙粽子好吃嘛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值