首页 > 其他分享 >Xilinx ZYNQ 7000+Vivado2015.2系列(二)之奇数分频和逻辑分析仪(ILA)的使用

Xilinx ZYNQ 7000+Vivado2015.2系列(二)之奇数分频和逻辑分析仪(ILA)的使用

时间:2024-03-27 10:04:02浏览次数:28  
标签:ILA 分频 set get clk Vivado2015.2 rst ports

前言:

偶数分频容易得到:N倍偶数分频,可以通过由待分频的时钟触发计数器计数,当计数器从0计数到N/2-1时,输出时钟进行翻转,并给计数器一个复位信号,使得下一个时钟从零开始计数。以此循环下去。

奇数分频如何得到呢?

第一部分  奇数分频

奇数分频方法:

N倍奇数分频,首先进行上升沿触发进行模N计数,

计数到(N-1)/2时输出时钟翻转,同时进行下降沿触发的模N计数,

计数到(N-1)/2时输出时钟翻转时,进行输出时钟时钟翻转。

两个占空比非50%的n分频时钟相或运算,得到占空比为50%的奇数N分频时钟。

或者使用“相与”,方法与上相同,只是翻转的数值变为(N-2)/2。

三分频的Verilog实现:

module Divider_Multiple(
	input clk_i,
	input rst_n_i,
	output div2_o,
	output div3_o
);

reg div2_o_r;
always@(posedge clk_i or negedge rst_n_i)  //二分频
begin
	if(!rst_n_i)
	div2_o_r<=1'b0;
	else
	div2_o_r<=~div2_o_r;
end

reg [1:0] pos_cnt;
reg [1:0] neg_cnt;

always@(posedge div2_o_r or negedge rst_n_i)  //上升沿计数
begin
	if(!rst_n_i)
	pos_cnt<=2'b00;
	else if(pos_cnt==2'd2)
	pos_cnt<=2'b00;
	else
	pos_cnt<=pos_cnt+1'b1;
end

always@(negedge div2_o_r or negedge rst_n_i)  //下降沿计数
begin
	if(!rst_n_i)
	neg_cnt<=2'b00;
	else if(neg_cnt==2'd2)
	neg_cnt<=2'b00;
	else
	neg_cnt<=neg_cnt+1'b1;
end

reg div3_o_r0;
reg div3_o_r1;

always@(posedge div2_o_r or negedge rst_n_i)
begin
	if(!rst_n_i)
	div3_o_r0<=1'b0;
	else if(pos_cnt<2'd1)
	div3_o_r0<=1'b1;
	else
	div3_o_r0<=1'b0;
end
always@(negedge div2_o_r or negedge rst_n_i)
begin
	if(!rst_n_i)
	div3_o_r1<=1'b0;
	else if(neg_cnt<2'd1)
	div3_o_r1<=1'b1;
	else
	div3_o_r1<=1'b0;
end

assign div2_o=div2_o_r;
assign div3_o=div3_o_r0 | div3_o_r1;  //相或

endmodule

仿真:

仿真文件:

module Divider_Multiple_tb;
    // Inputs
    reg clk_i;
    reg rst_n_i;
    // Outputs
    wire div2_o;
    wire div3_o;
    // Instantiate the Unit Under Test (UUT)
    Divider_Multiple uut (
    .clk_i(clk_i),
    .rst_n_i(rst_n_i),
    .div2_o(div2_o),
    .div3_o(div3_o)
    );
    initial
    begin
    // Initialize Inputs4
    clk_i = 0;
    rst_n_i = 0;
    // Wait 100 ns for global reset to finish
    #96;
    rst_n_i=1;
    end
    always
    begin
    #5 clk_i=~clk_i;
    end
endmodule

vivado仿真结果:

20170923220846085

至此,第一部分结束。

第二部分  逻辑分析仪

增加逻辑分析仪:

首先为了配合手里的**zc702**板子,修改了一下输入时钟;

为了观察分频信号,增加了一个2Hz的信号,将其连接在led上,可以看见led闪烁。

逻辑分析仪的使用分三步走:

1. 在设计文件中,在要抓取的信号定义前添加:

<strong>(*make_debug="true"*)</strong>

2. 导入ILA的IP核:

20170924152017463

双击添加的IP,在General Options里设置探针数(信号组数)和采样深度(利用BRAM存储的),在Probe Ports里设置信号位宽:

20170924152834955

20170924152951634

OK之后,点击Generate。

IP Source里双击模板,将例化模板复制到设计文件中,填好对应的待测信号:

20170924153834680

3. 添加约束-->生成比特文件-->下载-->添加触发信号-->抓取。

为了阅读的连贯性,贴出修改后的代码:

module Divider_Multiple(
	input clk_p,
	input clk_n,
	input rst_n_i,
	output div2_o,
	output div3_o,
	output div2hz_o
);

IBUFGDS IBUFGDS_inst (
          .O(clk_i),  // Clock buffer output
          .I(clk_p),  // Diff_p clock buffer input (connect directly to top-level port)
          .IB(clk_n) // Diff_n clock buffer input (connect directly to top-level port)
       );
 (*make_debug="true"*)wire div2_o;
 (*make_debug="true"*)wire div3_o;
 (*make_debug="true"*)wire div2hz_o;
reg div2_o_r;
always@(posedge clk_i or negedge rst_n_i)  //二分频
begin
	if(rst_n_i)
	div2_o_r<=1'b0;
	else
	div2_o_r<=~div2_o_r;
end

reg [1:0] pos_cnt;
reg [1:0] neg_cnt;

always@(posedge div2_o_r or negedge rst_n_i)  //上升沿计数
begin
	if(rst_n_i)
	pos_cnt<=2'b00;
	else if(pos_cnt==2'd2)
	pos_cnt<=2'b00;
	else
	pos_cnt<=pos_cnt+1'b1;
end

always@(negedge div2_o_r or negedge rst_n_i)  //下降沿计数
begin
	if(rst_n_i)
	neg_cnt<=2'b00;
	else if(neg_cnt==2'd2)
	neg_cnt<=2'b00;
	else
	neg_cnt<=neg_cnt+1'b1;
end

reg div3_o_r0;
reg div3_o_r1;

always@(posedge div2_o_r or negedge rst_n_i)
begin
	if(rst_n_i)
	div3_o_r0<=1'b0;
	else if(pos_cnt<2'd1)
	div3_o_r0<=1'b1;
	else
	div3_o_r0<=1'b0;
end
always@(negedge div2_o_r or negedge rst_n_i)
begin
	if(rst_n_i)
	div3_o_r1<=1'b0;
	else if(neg_cnt<2'd1)
	div3_o_r1<=1'b1;
	else
	div3_o_r1<=1'b0;
end

reg div2hz_o_r;
reg [25:0] div2hz_cnt;
always@(posedge clk_i or negedge rst_n_i)
begin
    if(rst_n_i)
    div2hz_cnt<=0;
    else if(div2hz_cnt<26'd50_000000)
    div2hz_cnt<=div2hz_cnt+1'b1;
    else
    div2hz_cnt<=0;
end
always@(posedge clk_i or negedge rst_n_i)
begin
    if(rst_n_i)
    div2hz_o_r<=0;
    else if(div2hz_cnt==26'd24_999999 || div2hz_cnt==26'd49_999999)
    div2hz_o_r<=~div2hz_o_r;
    else
    div2hz_o_r<=div2hz_o_r;
end

assign div2_o=div2_o_r;
assign div3_o=div3_o_r0 | div3_o_r1;  //相或
assign div2hz_o=div2hz_o_r;

ila_0 ila_0_0 (  //逻辑分析仪的例化
.clk(clk_i), // input wire clk
.probe0(div2hz_o), // input wire [0:0] probe0
.probe1({div2_o,div3_o}) // input wire [3:0] probe1
);

endmodule

约束文件如下:

set_property PACKAGE_PIN D18 [get_ports {clk_p}]
set_property IOSTANDARD LVDS_25 [get_ports {clk_p}]
set_property PACKAGE_PIN C19 [get_ports {clk_n}]
set_property IOSTANDARD LVDS_25 [get_ports {clk_n}]

set_property PACKAGE_PIN G19 [get_ports {rst_n_i}] 
set_property IOSTANDARD LVCMOS18 [get_ports {rst_n_i}]
#GPIO PMOD1
set_property PACKAGE_PIN E15 [get_ports {div2_o}]
set_property IOSTANDARD LVCMOS18 [get_ports {div2_o}]
set_property PACKAGE_PIN D15 [get_ports {div3_o}]
set_property IOSTANDARD LVCMOS18 [get_ports {div3_o}]
set_property PACKAGE_PIN W17 [get_ports {div2hz_o}]
set_property IOSTANDARD LVCMOS18 [get_ports {div2hz_o}]

下载到fpga之后,逻辑分析仪的界面会自动打开,各个区域的功能如下,先添加触发信号,可以右键点击添加,也可以点击window-->debug probe将信号拖拽至“触发信号”区域:

20170924155220761

总结:

信号运算得到新的信号。没有仿真就没有发言权。

标签:ILA,分频,set,get,clk,Vivado2015.2,rst,ports
From: https://www.cnblogs.com/L707/p/18098235

相关文章

  • Xilinx ZYNQ 7000+Vivado2015.2系列(一)之流水灯(纯PL)
    原文链接:https://blog.csdn.net/u014485485/article/details/78056980前言:学习Xilinx的ZYNQ7000系列,用的板子是zc702(注意不是zedboard),SOC型号是xc7z020。虽然设计思路一样,但不同的套件引脚和io标准是有区别的,zc702评估板的的外观图如下,可以对照下自己的板子:作为入门体验,本设......
  • No qualifying bean of type 'XXX' available:expected at least 1 bean which qualif
    一项目启动报,Noqualifyingbeanoftype'XXX'available:expectedatleast1beanwhichqualifiesasautowirecandidate翻译为:没有类型为“XXX”的合格bean可用:应至少有1个bean符合autowire候选者的条件排查步骤如下:(1)项目启动类上是否有扫描到该bean下的包(2)如果用......
  • vue3 动态编译组件失败:Component provided template option but runtime compilation
    根据vue3官方文档路由,写了如下一个简单的页面来模拟路由的实现。为了减少*.vue文件的个数,在这个但页面中,使用defineComponent通过object定义组件。<scriptsetup>import{ref,computed,defineComponent}from'vue'constHome=defineComponent({template:`......
  • 初用scrapy 报错503 Service Unavailable问题
    毕设基于Hadoop的电子产品推荐系统 系统需要大量的电子产品信息,爬取的是中关村的数据(没有像京东一样的反爬机制)使用scrapyspider爬取页面信息中,可以获取部分页面数据,但爬取一些页面时,会报错503ServiceUnavailable部分代码详情defparse(self,response):if......
  • Thumbnailator处理图片
    Thumbnailator处理图片 读取源图of(String...files)of(File...files)of(InputStream...inputStreams)of(URL...urls)输出文件toFile(StringoutFilepath)toFile(FileoutFile)toOutputStream(OutputStreamos)缩放size(intwidth,intheight)width(intwidt......
  • Paper Content Similarity Detection
    PaperContentSimilarityDetectiongitcode项目地址:https://gitcode.com/2301_78305256/PaperContentSimilarityDetection/tree/masterPSP表格PSP2.1PersonalSoftwareProcessStages预估耗时(分钟)实际耗时(分钟)Planning计划2020·Estimate·估计这个任......
  • 猫头虎分享已解决Bug || 分布式文件系统问题(Distributed File System Issue):DFSUnavail
    博主猫头虎的技术世界......
  • 使用ilasm 和 ildasm编译和反编译工具对DLL文件修改
    目录前言一、使用ildasm反编译dll文件二、使用ilasm将il文件编译成dll或exe文件前言文本讲述怎么通过ildasm工具将dll文件进行反编译为il文件,修改il文件后再如何通过ilasm工具将il文件反编译成dll或exe文件。ildasm工具:用于将dll文件反编译成可读......
  • 【Filament】材质系统
    1前言​本文主要介绍Filament的材质系统,官方介绍详见→FilamentMaterialsGuide。材质系统中会涉及到一些空间和变换的知识点,可以参考:【Unity3D】空间和变换、【Unity3D】Shader常量、变量、结构体、函数、【OpenGLES】MVP矩阵变换、【OpenGLES】透视变换原理。​......
  • 【Filament】壁纸
    1前言​本文将使用Filament制作壁纸。Android中要实现自定义壁纸,需要继承WallpaperService和WallpaperService.Engine,并在onCreateEngine方法中返回自定义Engine的实例。publicclassMyWallpaperServiceextendsWallpaperService{@Overridepublic......