【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文件。