【Kevin SOC 连载1】开启Zynq-7000之旅,入手一块Z-turn板,PL端控制RGB三色灯
在上海的时候,就有学习到SOC的相关知识,回到学校后,一直苦于没有一块Zynq7000的板子,所以对于SOC的学习一直处于停滞状态。一直想买一块Zynq的板子,Zed的板子对于学生党来讲,成本还是偏高了,所以自己在淘宝上选了一块相对较便宜的Z-turn来进一步学习SOC。
收到板子后,看下光盘里的资料,不得不说里边的教程,写的确实一般般,如果是一个还没使用过Vivado这个软件的朋友来讲,个人觉得阅读里边的教程还是有一定困难的。既然是写教程,就肯定是要写得让大多数人能看懂,如果达不到这个效果,就失去了写教程的意义了。
好了,言归正传,先不吐槽了,这个实验,可以说是Kevin拿到这块板子做的第一个实验。在这个实验中,我们完全是基于PL端来进行的,不涉及到PS端,所以这个实验基本上和传统的FPGA开发流程是一致的。
先来说下Kevin看完这块板子原理图的结果:1.板子上并没有专门针对于PL端的复位按键,所以Kevin是在模块内部定义的上电复位;2.针对于PL端的开发,板子上有一个12MHz的晶振,我们可以直接使用,关于这个晶振的作用,我还没仔细看,反正不是只为PL端提供时钟的,还需要给其他器件提供时钟。
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2016/04/03 14:43:14 // Design Name: // Module Name: led_ctrl // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module led_ctrl( input wire sclk, //input wire s_rst_n, output reg [2:0] led_rgb ); parameter CNT_END = 20'd600_0000; reg [19:0] cnt; reg [19:0] cnt_rst = 20'd0; reg s_rst_n = 1'b0; always @(posedge sclk) if(s_rst_n == 1'b1) cnt_rst <= 'd0; else if(s_rst_n == 1'b0) cnt_rst <= cnt_rst + 1'b1; always @(posedge sclk) if(cnt_rst == CNT_END) s_rst_n <= 1'b1; always @(posedge sclk or negedge s_rst_n) if(s_rst_n == 1'b0) cnt <= 'd0; else if(cnt == CNT_END) cnt <= 'd0; else cnt <= cnt + 1'b1; always @(posedge sclk or negedge s_rst_n) if(s_rst_n == 1'b0) led_rgb <= 3'b100; else if(cnt == CNT_END) led_rgb <= {led_rgb[1:0], led_rgb[2]}; endmodule
好了,代码写完了,只需要在Vivado中编译好,绑定管脚就可以了,然后下载bitstream文件。