1、术语定义

PS: 处理系统 (Processing System) ,  就是与FPGA无关的ARM的SOC的部分,我的理解是这部分是出场就已经封装好的。

PL: 可编程逻辑 (Progarmmable Logic), 就是FPGA部分,这部分是可以定制化的。

ZYNQ,往大里说,就是两大功能块,PS 部分和 PL部分,就是ARM的SOC部分,和FPGA部分。

下一个层级, APU部分:

 APU: 应用处理器单元(Application Processor Unit).  位于PS里面的中心位置。

APU里面具体包含的内容,就是双ARM-CortexA9核,加上高速缓冲,DMA,定时器,中断控制,浮点和NEON协处理,硬件加速器一致性控制器ACP神马的。  也就是,处理器核心部分。

TTC, Triple Time Counter的意思。 就是这个计数器里面有3个独立通道,可以独立计数。 挂在APB上,为系统或外设提供定时或计数服务的。
WDT,  看门狗定时器,有两个, 分别监视ARM-Cortex A9用的。  如果软件跑飞,无法清定时器,一段时间后,看门狗就复位。

SWDT,系统级看门狗定时器, 这个看门狗的时钟和复位信号,都可以来自于芯片外部, 这样,即使系统有严重故障,比如时钟频率本身都有问题了,仍然可以通过与系统无关的外部信号计数,计数满就复位。

 SCU, Snoop Control Unit,  用来保持双核之间的数据Cache的一致性。 也就是是说,第一个A9

处理器写存储时,只是写在了缓存里,没有进主存,  如果第二个A9读操作,涉及到第一个写脏了的数据段, SCU要保证第二个A9的缓存里是最新的数据。  如果第二个A9写同样数据段的数据,需要在第一个中体现出写的内容。   SCU的存在,才使得两个核成互相联系的“双核”,才能成为MPsoc。

ARM,CPU架构,x86(因特尔),arm(acorn)。其实就是指令集。

SOC,系统级芯片。有特定用途的一个芯片,而且这个芯片还可以自定义编程。

RAM,可以理解为手机内存(4Gb),掉电数据擦除。

ROM,可以理解为手机存储空间(远峰蓝 1Tb),掉电数据不擦除。

想详细理解PS与PL在SoC FPGA上的作用(不知道这么说对不对)请参照文献:【ZYNQ-7000开发之四】PS读写PL端BRAM_Lily_9的博客-CSDN博客

2、IP核兼容性

网上好多大牛写的IP基本都是ZYNQ-7系列的。所以在ZYNQ+(ZCU102、ZCU106、ZCU104、ZCU111)上是不能用的,但是有些时候可能由于工程师的编写失误(少写了一个器件的兼容),造成IP核的无法调用(加入IP核后显示的是灰色的,且在IP Catalog种找不到这个IP核)。那么外卖有一下的解决方案。

由上面两图,外卖发现根本找不到这个IP。首先,外卖需要改一下项目的芯片型号

随便改成一个7系列的即可

这样就看到了这个IP。然后我们右键这个IP

点击OK后,弹出一个新的Vivado窗口

点击红框按钮

点击红框按钮

点击红框,再点击OK

点击红框,然后弹出的窗口点击NEXT

点击红框按钮 ,点击NEXT,再点击NEXT,再点击Overwrite

这样就把IP核重新生成了。返回到原始窗口,更换成原有板子型号(如ZCU106)就可以调用此IP核了。

3、HDMI

想要完成FPGA需要实现的功能,一定要看文档,看文档,看文档!!!

①实验平台:Vivado 2019.1、Zybo:Zynq-7000 ARM, FPGA SoC训练板(xc7z010clg400-1)

②请下载用户手册(板子的功能)、原理图(板子对应的引脚接口)Digilent | 分享创新的乐趣,发现更好的自己

③所用IP核,在我上传的文件里(rgb2dvi_v1_2.zip-硬件开发文档类资源-CSDN下载)

④代码:

顶层设计

`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
//
// Create Date: 2021/12/06 22:10:17
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module top(input   clk_p,input   clk_n,input   rst,//按钮按下位低电平//output  [0:0] HDMI_OEN,output        TMDS_Clk_n,output        TMDS_Clk_p,output  [2:0] TMDS_Data_n,output  [2:0] TMDS_Data_p,output  led_video_active,output  led_Pixel_clk);wire    Pixel_clk;wire    Serial_clk;wire    video_hs;wire    video_vs;wire    video_de;wire    [7:0]   video_r;wire    [7:0]   video_g;wire    [7:0]   video_b;wire sys_rst_n;assign  led_video_active = video_active;assign  led_Pixel_clk = Pixel_clk;color_bar uut_color_bar(.clk(Pixel_clk),//传输时钟.rst(rst),//复位.hs(video_hs),//行同步(列).vs(video_vs),//场同步(行).de(video_de),//数据有效.rgb_r(video_r),//红.rgb_g(video_g),//绿.rgb_b(video_b),//蓝.video_active(video_active));clk_wiz_0 uut_clk_wiz_0(.clk_out1(Pixel_clk),     // output clk_out1.clk_out2(Serial_clk),     // output clk_out2// Status and control signals.reset(rst), // input reset.locked(sys_rst_n),       // 闭锁信号// Clock in ports.clk_in1_p(clk_p),.clk_in1_n(clk_n)); hdmi_disp_0 uut_hdmi_disp_0(.TMDS_Clk_p(TMDS_Clk_p),//以什么频率在显示器上渲染图片  输出到显示器上.TMDS_Clk_n(TMDS_Clk_n),//.TMDS_Data_p(TMDS_Data_p),//线路上传输的8位数据高电平   输出到显示器上.TMDS_Data_n(TMDS_Data_n),//线路上传输的8位数据低电平   输出到显示器上//下面是FPGA调用HDMI的驱动.aRst(rst),//.aRst_n(~rst),//.vid_pData({video_r,video_b,video_g}),//三个线路同时传输的8Bit数据.vid_pVDE(video_de),//数据有效.vid_pHSync(video_hs),//行同步(列).vid_pVSync(video_vs),//场同步(行).PixelClk(Pixel_clk),//.SerialClk(Serial_clk)//);
endmodule

时钟IP核的例化在我前面的教程里有,这里重点说一下采用什么频率的时钟。

首先观察芯片文档,

有50MHz和125MHz的差分信号我们可以使用

因此

输入要这样设置,其次由于显示器的分辨率是根据时钟信号来设定的,又由于

(别人的图),我们实现的是1280*720的图片,因此这样设置时钟输出。

图片生成器

`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/12/06 22:14:04
// Design Name:
// Module Name: color_bar
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module color_bar(input clk,//像素时钟input rst,//复位,高电平使能output hs,//行同步,高电平有效(一行有几列)output  vs,//场同步,高电平有效(一共有几行)output  de,//数据有效output  [7:0]   rgb_r,//红output  [7:0]   rgb_g,//绿output  [7:0]   rgb_b,//蓝output  video_active//);//有多少列parameter H_ACTIVE = 16'd1280;  //行有效长度(像素时钟周期个数)parameter H_FP = 16'd110;       //行同步前肩长度parameter H_SYNC = 16'd40;      //行同步长度parameter H_BP = 16'd220;       //行同步后肩长度//有多少行parameter V_ACTIVE = 16'd720;   //场有效长度(行的个数)parameter V_FP    = 16'd5;        //场同步前肩长度parameter V_SYNC  = 16'd5;      //场同步长度parameter V_BP  = 16'd20;       //场同步后肩长度parameter H_TOTAL = H_ACTIVE + H_FP + H_SYNC + H_BP;//有多少列parameter V_TOTAL = V_ACTIVE + V_FP + V_SYNC + V_BP;//有多少行//图片定义parameter WHITE_R      = 8'hff;parameter WHITE_G         = 8'hff;parameter WHITE_B         = 8'hff;parameter YELLOW_R        = 8'hff;parameter YELLOW_G        = 8'hff;parameter YELLOW_B        = 8'h00;                                  parameter CYAN_R        = 8'h00;parameter CYAN_G      = 8'hff;parameter CYAN_B      = 8'hff;                              parameter GREEN_R       = 8'h00;parameter GREEN_G         = 8'hff;parameter GREEN_B         = 8'h00;parameter MAGENTA_R   = 8'hff;parameter MAGENTA_G   = 8'h00;parameter MAGENTA_B   = 8'hff;parameter RED_R       = 8'hff;parameter RED_G       = 8'h00;parameter RED_B       = 8'h00;parameter BLUE_R      = 8'h00;parameter BLUE_G      = 8'h00;parameter BLUE_B      = 8'hff;parameter BLACK_R         = 8'h27;parameter BLACK_G         = 8'hE1;parameter BLACK_B         = 8'hB5;//定义reg hs_reg;//定义行同步寄存器,代表xreg vs_reg;//定义场同步寄存器,代表yreg hs_reg_d0;//hs_reg一个时钟的延迟reg vs_reg_d0;//vs_reg一个时钟的延迟reg[11:0] h_cnt;//用于x的计数器reg[11:0] v_cnt;//用于y的计数器reg[11:0] active_x;//有效图像的的坐标xreg[11:0] active_y;//有效图像的坐标yreg[7:0] rgb_r_reg;//像素数据r分量reg[7:0] rgb_g_reg;//像素数据g分量reg[7:0] rgb_b_reg;//像素数据b分量reg h_active;//行图像有效reg v_active;//场图像有效//wire video_active;//一帧内图像的有效区域h_active & v_activereg video_active_d0;assign hs = hs_reg_d0;assign vs = vs_reg_d0;assign video_active = h_active & v_active;assign de = video_active_d0;assign rgb_r = rgb_r_reg;assign rgb_g = rgb_g_reg;assign rgb_b = rgb_b_reg;always@(posedge clk or posedge rst)beginif(rst)beginhs_reg_d0 <= 1'b0;vs_reg_d0 <= 1'b0;video_active_d0 <= 1'b0;endelsebeginhs_reg_d0 <= hs_reg;vs_reg_d0 <= vs_reg;video_active_d0 <= video_active;endendalways@(posedge clk or posedge rst)beginif(rst)h_cnt <= 12'd0;else if(h_cnt == H_TOTAL - 1)//行计数器到最大值清零h_cnt <= 12'd0;elseh_cnt <= h_cnt + 12'd1;endalways@(posedge clk or posedge rst)beginif(rst)active_x <= 12'd0;else if(h_cnt >= H_FP + H_SYNC + H_BP - 1)//计算图像的x坐标active_x <= h_cnt - (H_FP[11:0] + H_SYNC[11:0] + H_BP[11:0] - 12'd1);elseactive_x <= active_x;endalways@(posedge clk or posedge rst)beginif(rst)v_cnt <= 12'd0;else if(h_cnt == H_FP  - 1)//在行数计算器为H_FP - 1的时候场计数器+1或清零if(v_cnt == V_TOTAL - 1)//场计数器到最大值了,清零v_cnt <= 12'd0;elsev_cnt <= v_cnt + 12'd1;//没到最大值,+1elsev_cnt <= v_cnt;endalways@(posedge clk or posedge rst)beginif(rst)h_active <= 1'b0;else if(h_cnt == H_FP + H_SYNC + H_BP - 1)h_active <= 1'b1;else if(h_cnt == H_TOTAL - 1)h_active <= 1'b0;elseh_active <= h_active;endalways@(posedge clk or posedge rst)beginif(rst)hs_reg <= 1'b0;else if(h_cnt == H_FP - 1)//行同步hs_reg <= 1'b1;else if(h_cnt == H_FP + H_SYNC - 1)//行同步这时候要结束了hs_reg <= 1'b0;elsehs_reg <= hs_reg;endalways@(posedge clk or posedge rst) beginif(rst)v_active <= 1'd0;else if((v_cnt == V_FP + V_SYNC + V_BP - 1)&& (h_cnt == H_FP - 1) )//&& (h_cnt == H_FP - 1)v_active <= 1'b1;else if((v_cnt == V_TOTAL - 1)&& (h_cnt == H_FP - 1))v_active <= 1'b0;    elsev_active <= v_active;endalways@(posedge clk or posedge rst)beginif(rst)vs_reg <= 1'd0;else if((v_cnt == V_FP - 1) && (h_cnt == H_FP - 1))vs_reg <= 1'b1;else if((v_cnt == V_FP + V_SYNC - 1)&& (h_cnt == H_FP - 1) )vs_reg <= 1'b0;    elsevs_reg <= vs_reg;end//要控制的就是下面这部分always@(posedge clk or posedge rst)beginif(rst)beginrgb_r_reg <= 8'h00;rgb_g_reg <= 8'h00;rgb_b_reg <= 8'h00;endelse if(video_active)if(active_x == 12'd0)beginrgb_r_reg <= WHITE_R;rgb_g_reg <= WHITE_G;rgb_b_reg <= WHITE_B;endelse if(active_x == (H_ACTIVE/8) * 1)beginrgb_r_reg <= YELLOW_R;rgb_g_reg <= YELLOW_G;rgb_b_reg <= YELLOW_B;end          else if(active_x == (H_ACTIVE/8) * 2)beginrgb_r_reg <= CYAN_R;rgb_g_reg <= CYAN_G;rgb_b_reg <= CYAN_B;endelse if(active_x == (H_ACTIVE/8) * 3)beginrgb_r_reg <= GREEN_R;rgb_g_reg <= GREEN_G;rgb_b_reg <= GREEN_B;endelse if(active_x == (H_ACTIVE/8) * 4)beginrgb_r_reg <= MAGENTA_R;rgb_g_reg <= MAGENTA_G;rgb_b_reg <= MAGENTA_B;endelse if(active_x == (H_ACTIVE/8) * 5)beginrgb_r_reg <= RED_R;rgb_g_reg <= RED_G;rgb_b_reg <= RED_B;endelse if(active_x == (H_ACTIVE/8) * 6)beginrgb_r_reg <= BLUE_R;rgb_g_reg <= BLUE_G;rgb_b_reg <= BLUE_B;end    else if(active_x == (H_ACTIVE/8) * 7)beginrgb_r_reg <= BLACK_R;rgb_g_reg <= BLACK_G;rgb_b_reg <= BLACK_B;endelsebeginrgb_r_reg <= rgb_r_reg;rgb_g_reg <= rgb_g_reg;rgb_b_reg <= rgb_b_reg;end         elsebeginrgb_r_reg <= 8'h00;rgb_g_reg <= 8'h00;rgb_b_reg <= 8'h00;endend
endmodule

仿真文件(testbench)

`timescale 1ns / 1ps
//
// Company: 东北电力大学
// Engineer: Yang Zheng
//
// Create Date: 2021/12/06 22:18:36
// Design Name:
// Module Name: testbench
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module testbench();reg sys_clk;
reg [2:0] TMDS_Data_n_data;
reg [2:0] TMDS_Data_p_data;
reg rst;initial beginsys_clk  =   0;rst  =   1'b1;#1000;rst  =   1'b0;end//125MHZ,周期是8ns,所4ns取反�?�?always #4 sys_clk = ~sys_clk;  top uut_top(.clk_p(~sys_clk),.clk_n(sys_clk),.rst(rst),//按钮按下位低电平.TMDS_Clk_n(TMDS_Clk_n),.TMDS_Clk_p(TMDS_Clk_p),.TMDS_Data_n(TMDS_Data_n),.TMDS_Data_p(TMDS_Data_p),.led_video_active(led_video_active),.led_Pixel_clk(led_Pixel_clk));//接受驱动输出信号always @(*) beginTMDS_Data_n_data=TMDS_Data_n;TMDS_Data_p_data=TMDS_Data_p;end
endmodule

这个结束后,我们可以先点击

看一看波形,网上教程都没有这个测试(只有我有,哈哈哈)

约束文件

观察原理图,我们可以得到引脚约束

set_property PACKAGE_PIN B19 [get_ports {TMDS_Data_p[2]}]
set_property PACKAGE_PIN C20 [get_ports {TMDS_Data_p[1]}]
set_property PACKAGE_PIN D19 [get_ports {TMDS_Data_p[0]}]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_Data_p[1]}]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_Data_p[2]}]
set_property IOSTANDARD TMDS_33 [get_ports {TMDS_Data_p[0]}]
set_property PACKAGE_PIN H16 [get_ports TMDS_Clk_p]
set_property IOSTANDARD LVCMOS12 [get_ports rst]
set_property PACKAGE_PIN R18 [get_ports rst]
set_property PACKAGE_PIN M14 [get_ports led]
set_property IOSTANDARD LVCMOS33 [get_ports led]
set_property PACKAGE_PIN L16 [get_ports clk_p]
set_property IOSTANDARD TMDS_33 [get_ports clk_p]
set_property IOSTANDARD TMDS_33 [get_ports clk_n]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_Clk_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_Clk_n]set_property PACKAGE_PIN M14 [get_ports led_Pixel_clk]
set_property PACKAGE_PIN M15 [get_ports led_video_active]
set_property IOSTANDARD LVCMOS33 [get_ports led_Pixel_clk]
set_property IOSTANDARD LVCMOS33 [get_ports led_video_active]

注意,这个电平设置是不能随便写的,如果在一个块级上,那么电平必须一致,否则会出现问题。

由于HDMI必须是3.3V驱动,因此时钟与LED都变成了3.3V,正常时1.2V。我不知道我理解的对不对。

然后综合-实现-bit文件-烧录即可实现。

FPGA学习之路-fpga术语与zynq7000HDMI显示相关推荐

  1. FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析

    FPGA学习之路--原码二位乘法器及Verilog代码分析 原理 原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异.原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作.而原码 ...

  2. FPGA学习之路—应用程序—基于Verilog设计单总线8位ALU

    FPGA学习之路--基于Verilog设计单总线8位ALU 定义 ALU(arithmetic and logic unit) 算术逻辑单元,简称ALU,是计算机的数学运算核心,也就是负责运算的组件, ...

  3. FPGA学习之路—接口(3)—SPI详解及Verilog源码分析

    FPGA学习之路--SPI详解及Verilog源码分析 概述 SPI = Serial Peripheral Interface,是串行外围设备接口,是一种高速,全双工,同步的通信总线. 优点 支持全 ...

  4. FPGA学习之路—接口(2)—I2C协议详解+Verilog源码分析

    FPGA学习之路--I2C协议详解+Verilog源码分析 定义 I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时 ...

  5. FPGA学习之路—接口(1)—URAT Verilog程序设计

    FPGA学习之路--URAT Verilog程序设计 UART(Universal Asynchronous Receiver Transmitter,通用异步收发器)是广泛使用的异步串行数据通信协议 ...

  6. Cyclone V SoC FPGA学习之路第一章:综述

    Cyclone V SoC FPGA学习之路第一章:总体了解 关键词: adaptive logic modules – ALM 自适应逻辑模块 logic array block --LAB 逻辑阵 ...

  7. Cyclone V SoC FPGA学习之路第二章:硬件篇

    Cyclone V SoC FPGA学习之路第二章:硬件篇(内部资源) 前言 上一章了解了<cycloneV device datasheet>,其中数据手册里重点介绍了电源要求,时序参数 ...

  8. 奋斗的小孩系列 FPGA学习altera系列: FPGA学习altera 系列 第二十一篇 数码管设计

    奋斗的小孩系列 FPGA学习altera系列: FPGA学习altera 系列 第二十一篇 数码管设计 作者:奋斗的小孩 郝旭帅(转载请注明出处) 大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是 ...

  9. FPGA学习笔记-1 FPGA原理与开发流程

    1 初识FPGA 文章目录 1 初识FPGA 1.1 基本认知 1.1.1 什么是FPGA? 1.1.2 什么是HDL?什么是Verilog? 1.1.3 硬件开发与软件开发 1.1.4 FPGA与其 ...

最新文章

  1. 《 短文本数据理解》——2.5小结
  2. hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)...
  3. 一个不用SD卡,不用livesuit的刷nand的想法
  4. 浏览器开发调试工具的秘密 - Secrets of the Browser Developer Tools
  5. LINQ to SharePoint 试用感受, 欢迎讨论~
  6. 软件项目管理-构建之法-四周总结
  7. Map的value值降序排序与升序排序(java)
  8. bootstrap-fileinput插件获取图片文件并展示,不进行上传
  9. ITEXT-PDF彩色字体显示-支持中文
  10. Win10+1050Ti配置Tensorflow教程
  11. 计算机月考分析报告,月考分析总结500字(通用7篇)
  12. VR系列——Oculus最佳实践:七、虚拟幻境头晕(下)
  13. Large Division-----同余模定理(大数的求余)
  14. 【c语言学习课堂笔记第三天】:int函数有符号整型和无符号整型
  15. 您还没有登录或登录已超时,请重新登录
  16. 【R文档】1 isolation.forest/孤立森林算法
  17. 赋值具有的非单一 rhs 维度多于非单一下标数错误的分析和解决方法
  18. python 踩坑之解决django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.Did you insta
  19. 【数值溢出】从二进制的角度看数值溢出
  20. 人脸检测dlib, mtcnnx对比,FDDB测试对比

热门文章

  1. 黑峡谷 X3 Pro、X5 Pro 评测
  2. ADB命令学习-RM用法
  3. 泰克示波器MD03012-一款高性能、高可靠性的仪器
  4. RaabitMQ灵魂拷问
  5. 前端中文转码后端转换处理
  6. 网易在美试乘FF91 贾跃亭的年终考核你给打多少分? | CES
  7. 离散余弦变换java实现_离散余弦变换(含源码)
  8. typecho文章内挂载B站视频
  9. 研究表明:视频游戏和体育运动一样可以增强人的空间感
  10. 收集了非常好的免费学习Java网站 新手可以看看很适用