连接

Avalon -MM接口

mgmt_waitrequest:当 PLL 重配置进程开始后,此端口变高并在 PLL 重配置期间保持高电平。

PLL 重配置进程完成后,此端口变低。

I/O PLL重配写操作步骤:

1、  为mgmt_address和mgmt_writedata设置有效值,并且使能mgmt_write一个mgmt_clk周期

2、  重复步骤1共8次

3、  为mgmt_address设置启动地址9’b000000000,mgmt._writedata任意,并且使能mgmt_write一个mgmt_clk周期

4、  当配置完成后mgmt_waitrequest拉低

注:(1)如果发送的命令超过8个,内部的FIFO会溢出。

(2)每个命令(地址数据对)属于以下三种之一:

1、计数器重配设置

2、带宽重配设置

3、动态相位移动

1、计数器重配设置寄存器

1、  动态相位移动

3、带宽重配设置

环路滤波器和充电泵设置

CP :Charge pump setting

BP :Loop filter setting

对于PLL的带宽选择有三种—在PLL的参数设置中可以选择,它们是Low,Medium和High。可以来看下手册上对它们的说明:

• Low—PLL with a low bandwidth has better jitter rejection but a slower lock time.
• High—PLL with a high bandwidth has a faster lock time but tracks more jitter.
• Medium—A medium bandwidth offers a balance between lock time and jitter rejection.

带宽应该指的是环路滤波带宽,带宽越小就越不容易锁定,太宽了时钟抖动会比较大。

VCO的设置范围为600~1434M

其中M,N,C的参数分别对应上面,C0表示输出通道0,C1表示输出通道1,以此类推。

module mr_reconfig_master_pll #(
parameter MIF_OFFSET = 7, // total cram address that differ resulted from PLL mif files comparison
parameter ADDR_WIDTH_FOR_VALUEMASK = 6, // number of bits representation for total ROM depth for PLL valuemask
parameter ADDR_WIDTH_FOR_DPRIOADDR = 3, // number of bits representation for total CRAM address that differ
parameter DPRIO_ADDRESS_WIDTH = 9, //
parameter DPRIO_DATA_WIDTH = 32 //
) (
input wire clock,
input wire reset,
input wire reconfig_request, // from main state machine - request for reconfig
output reg reconfig_done, // to main state machine - indicate reconfig is completed
input wire clr_reconfig_done, // from main state machine - full handshake signal to acknowledge reconfig_done (both rx & pll) is serviced
input wire [ADDR_WIDTH_FOR_VALUEMASK-1:0] offset_pointer, // from main state machine - indicate which rom address (mif range) to be read
output wire [ADDR_WIDTH_FOR_VALUEMASK-1:0] valuemask_addr_ptr, // to value mask rom - start from offset_pointer & increment by 1 for each cycle & increment for MIF_OFFSET times
output wire [ADDR_WIDTH_FOR_DPRIOADDR-1:0] dprioaddr_addr_ptr, // to dprio addr rom - start from 0 & increment by 1 for each cycle & increment for MIF_OFFSET times
input wire [7:0] dprio_offset, // from dprio addr rom - indicate which cram address to write to
input wire [31:0] field_valuemask, // from value mask rom - indicate the value of cram bit to write to (in 8-bitmask format)
input wire reconfig_waitrequest, //
output reg reconfig_write, // Reconfig signals to/from PLL reconfig controller
output reg [DPRIO_ADDRESS_WIDTH-1:0] reconfig_address, //
output reg [DPRIO_DATA_WIDTH-1:0] reconfig_writedata //
); localparam [2:0]
IDLE = 0,
MOD = 1,
WR = 2,
TRANS = 3,
START = 4,
WAITREQUEST = 5,
DONE = 6; reg [2:0] next_state;
reg [2:0] current_state;
wire [DPRIO_DATA_WIDTH-1:0] data_to_write; // data to be written to PLL
reg [ADDR_WIDTH_FOR_DPRIOADDR-1:0] num_exec; // offset start from 0 & increment by 1 & for MIF_OFFSET times
reg [ADDR_WIDTH_FOR_VALUEMASK-1:0] pointer; // get the pointer start offset from main state machine
reg last_offset; // indicate if the current offset is the last or not
wire reconfig_waitrequest_sync; // synchronize waitrequest signal from the PLL reconfig controller altera_std_synchronizer #(.depth(3)) u_reconfig_waitrequest_sync (.clk(clock),.reset_n(1'b1),.din(reconfig_waitrequest),.dout(reconfig_waitrequest_sync)); always @ (posedge clock or posedge reset)
begin
if (reset) begin
current_state <= IDLE;
end else begin
current_state <= next_state;
end
end always @ (*)
begin
next_state = current_state; case (current_state)
IDLE: begin
if (reconfig_request) begin //由主状态机发出重配请求
next_state = MOD;
end
end MOD: begin
next_state = WR;
end // reconfig write
WR: begin
if (~reconfig_request) begin//如果重配请求清除则返回IDLE状态
next_state = IDLE;
end else begin
next_state = TRANS;
end
end // cycle to next offset before it hits MIF_OFFSET times
//TRANS state:
TRANS: begin
if (last_offset) begin
next_state = START;
end else begin
next_state = MOD;
end
end // write to start register to initiate the PLL reconfig
// then wait for waitrequest signal to be asserted
//发送启动地址0x000
START: begin
if (reconfig_waitrequest_sync) begin
next_state = WAITREQUEST;
end else if (~reconfig_request) begin
next_state = IDLE;
end
end
// once waitrequest is deasserted, PLL reconfig is complete
//等待PLL重配完成
WAITREQUEST: begin
if (~reconfig_waitrequest_sync) begin
next_state = DONE;
end else if (~reconfig_request) begin
next_state = IDLE;
end
end // full handshaking between this master and main state machine
DONE: begin
if (~reconfig_request) begin
next_state = IDLE;
end
end
endcase
end
//mun_exec是参数ROM模块的读地址
always @ (posedge clock or posedge reset)
begin
if (reset) begin
num_exec <= {ADDR_WIDTH_FOR_DPRIOADDR{1'b0}};
pointer <= {ADDR_WIDTH_FOR_VALUEMASK{1'b0}};
last_offset <= 1'b0;
end else begin
if (next_state == IDLE) begin
num_exec <= {ADDR_WIDTH_FOR_DPRIOADDR{1'b0}};
pointer <= offset_pointer;
end else if (next_state == TRANS && ~last_offset) begin
num_exec <= num_exec + {{{ADDR_WIDTH_FOR_DPRIOADDR-1}{1'b0}}, 1'b1};
pointer <= pointer + {{{ADDR_WIDTH_FOR_VALUEMASK-1}{1'b0}}, 1'b1};
end last_offset <= num_exec == (MIF_OFFSET - 1);
end
end
// mgmt_write signal
always @ (posedge clock or posedge reset)
begin
if (reset) begin
reconfig_write <= 1'b0;
end else begin
if (next_state == WR || next_state == START) begin
reconfig_write <= 1'b1;
end else begin
reconfig_write <= 1'b0;
end
end
end
//write address to pll mgmt_address
always @ (posedge clock or posedge reset)
begin
if (reset) begin
reconfig_address <= {DPRIO_ADDRESS_WIDTH{1'b0}};
end else begin
if (next_state == WR) begin
reconfig_address <= {1'b0, dprio_offset};
end else if (next_state == START) begin
reconfig_address <= {1'b0, 8'h00};
end
end
end
//write data to pll mgmt_writedata
assign data_to_write = field_valuemask; always @ (posedge clock or posedge reset)
begin
if (reset) begin
reconfig_writedata <= {DPRIO_DATA_WIDTH{1'b0}};
end else begin
if (next_state == WR) begin
reconfig_writedata <= data_to_write;
end else if (next_state == START) begin
reconfig_writedata <= 32'd0;
end
end
end
// reconfigure done signal
always @ (posedge clock or posedge reset)
begin
if (reset) begin
reconfig_done <= 1'b0;
end else begin
if (clr_reconfig_done) begin
reconfig_done <= 1'b0;
end else if (next_state == DONE) begin
reconfig_done <= 1'b1;
end
end
end assign dprioaddr_addr_ptr = num_exec;
assign valuemask_addr_ptr = pointer; endmodule 关于TX IOPLL(用于配置HDMI)的参数设置
void GPLL_RECONFIG(int GPLL_RANGE, int COLOR_DEPTH)
{
IOWR(WD_TIMER_BASE, 0x0, 0x0); // clear timeout flag
IOWR(WD_TIMER_BASE, 0x2, 0x1); // reset internal counter
IOWR(WD_TIMER_BASE, 0x1, 0x4); // start timer
switch (GPLL_RANGE)
{
case 0: // <50MHz
GPLL_RCFG_WRITE(0x90, 0x00000F0F); // m 30
GPLL_RCFG_WRITE(0xA0, 0x00010000); // n 1
GPLL_RCFG_WRITE(0xC0, 0x00000303); // c0 6
GPLL_RCFG_WRITE(0xC1, 0x00001E1E); // c1 60
if (COLOR_DEPTH == 0) GPLL_RCFG_WRITE(0xC2, 0x00001E1E); // c2 60
else if (COLOR_DEPTH == 1) GPLL_RCFG_WRITE(0xC2, 0x00002625); // c2 75
else if (COLOR_DEPTH == 2) GPLL_RCFG_WRITE(0xC2, 0x00002D2D); // c2 90
else GPLL_RCFG_WRITE(0xC2, 0x00003C3C); // c2 120
GPLL_RCFG_WRITE(0x20, 0x00000010); // cp
GPLL_RCFG_WRITE(0x40, 0x00000100); // bw
GPLL_RCFG_WRITE(0x00, 0x00000001); // Write trigger
break;
case 1: // <70MHz
GPLL_RCFG_WRITE(0x90, 0x00000A0A); // m 20
GPLL_RCFG_WRITE(0xA0, 0x00010000); // n 1
GPLL_RCFG_WRITE(0xC0, 0x00000202); // c0 4
GPLL_RCFG_WRITE(0xC1, 0x00001414); // c1 40
if (COLOR_DEPTH == 0) GPLL_RCFG_WRITE(0xC2, 0x00001414); // c2 40
else if (COLOR_DEPTH == 1) GPLL_RCFG_WRITE(0xC2, 0x00001919); // c2 50
else if (COLOR_DEPTH == 2) GPLL_RCFG_WRITE(0xC2, 0x00001E1E); // c2 60
else GPLL_RCFG_WRITE(0xC2, 0x00002828); // c2 80
GPLL_RCFG_WRITE(0x20, 0x0000000B); // cp
GPLL_RCFG_WRITE(0x40, 0x000000C0); // bw
GPLL_RCFG_WRITE(0x00, 0x00000001); // Write trigger
break;
case 2: // <100MHz
GPLL_RCFG_WRITE(0x90, 0x00000505); // m 10
GPLL_RCFG_WRITE(0xA0, 0x00010000); // n 1
GPLL_RCFG_WRITE(0xC0, 0x00000101); // c0 2
GPLL_RCFG_WRITE(0xC1, 0x00000A0A); // c1 20
if (COLOR_DEPTH == 0) GPLL_RCFG_WRITE(0xC2, 0x00000A0A); // c2 20
else if (COLOR_DEPTH == 1) GPLL_RCFG_WRITE(0xC2, 0x00000D0C); // c2 25
else if (COLOR_DEPTH == 2) GPLL_RCFG_WRITE(0xC2, 0x00000F0F); // c2 30
else GPLL_RCFG_WRITE(0xC2, 0x00001414); // c2 40
GPLL_RCFG_WRITE(0x20, 0x00000010); // cp
GPLL_RCFG_WRITE(0x40, 0x000000C0); // bw
GPLL_RCFG_WRITE(0x00, 0x00000001); // Write trigger
break;
case 3: // <170MHz
GPLL_RCFG_WRITE(0x90, 0x00000404); // m 8
GPLL_RCFG_WRITE(0xA0, 0x00010000); // n 1
GPLL_RCFG_WRITE(0xC0, 0x00000404); // c0 8
GPLL_RCFG_WRITE(0xC1, 0x00000808); // c1 16
if (COLOR_DEPTH == 0) GPLL_RCFG_WRITE(0xC2, 0x00000808); // c2 16
else if (COLOR_DEPTH == 1) GPLL_RCFG_WRITE(0xC2, 0x00000A0A); // c2 20
else if (COLOR_DEPTH == 2) GPLL_RCFG_WRITE(0xC2, 0x00000C0C); // c2 24
else GPLL_RCFG_WRITE(0xC2, 0x00001010); // c2 32
GPLL_RCFG_WRITE(0x20, 0x00000010); // cp
GPLL_RCFG_WRITE(0x40, 0x000000C0); // bw
GPLL_RCFG_WRITE(0x00, 0x00000001); // Write trigger
break;
case 4: // <340MHz
GPLL_RCFG_WRITE(0x90, 0x00000404); // m 8
GPLL_RCFG_WRITE(0xA0, 0x00010000); // n 1
GPLL_RCFG_WRITE(0xC0, 0x00000202); // c0 4
GPLL_RCFG_WRITE(0xC1, 0x00000404); // c1 8
if (COLOR_DEPTH == 0) GPLL_RCFG_WRITE(0xC2, 0x00000404); // c2 8
else if (COLOR_DEPTH == 1) GPLL_RCFG_WRITE(0xC2, 0x00000505); // c2 10
else if (COLOR_DEPTH == 2) GPLL_RCFG_WRITE(0xC2, 0x00000606); // c2 12
else GPLL_RCFG_WRITE(0xC2, 0x00000808); // c2 16
GPLL_RCFG_WRITE(0x20, 0x00000010); // cp
GPLL_RCFG_WRITE(0x40, 0x000000C0); // bw
GPLL_RCFG_WRITE(0x00, 0x00000001); // Write trigger
break;
case 5: // <600MHz
GPLL_RCFG_WRITE(0x90, 0x00000404); // m 8
GPLL_RCFG_WRITE(0xA0, 0x00010000); // n 1
GPLL_RCFG_WRITE(0xC0, 0x00000101); // c0 2
GPLL_RCFG_WRITE(0xC1, 0x00000202); // c1 4
if (COLOR_DEPTH == 0) GPLL_RCFG_WRITE(0xC2, 0x00000202); // c2 4
else if (COLOR_DEPTH == 1) GPLL_RCFG_WRITE(0xC2, 0x00000302); // c2 5
else if (COLOR_DEPTH == 2) GPLL_RCFG_WRITE(0xC2, 0x00000303); // c2 6
else GPLL_RCFG_WRITE(0xC2, 0x00000404); // c2 8
GPLL_RCFG_WRITE(0x20, 0x00000010); // cp
GPLL_RCFG_WRITE(0x40, 0x000000C0); // bw
GPLL_RCFG_WRITE(0x00, 0x00000001); // Write trigger
break;
default: // <600MHz
GPLL_RCFG_WRITE(0x90, 0x00000404); // m 8
GPLL_RCFG_WRITE(0xA0, 0x00010000); // n 1
GPLL_RCFG_WRITE(0xC0, 0x00000101); // c0 2
GPLL_RCFG_WRITE(0xC1, 0x00000202); // c1 4
if (COLOR_DEPTH == 0) GPLL_RCFG_WRITE(0xC2, 0x00000202); // c2 4
else if (COLOR_DEPTH == 1) GPLL_RCFG_WRITE(0xC2, 0x00000302); // c2 5
else if (COLOR_DEPTH == 2) GPLL_RCFG_WRITE(0xC2, 0x00000303); // c2 6
else GPLL_RCFG_WRITE(0xC2, 0x00000404); // c2 8
GPLL_RCFG_WRITE(0x20, 0x00000010); // cp
GPLL_RCFG_WRITE(0x40, 0x000000C0); // bw
GPLL_RCFG_WRITE(0x00, 0x00000001); // Write trigger
break;
} READ_GPLL_RCFG_READY (); IOWR(WD_TIMER_BASE, 0x1, 0x8); // stop the timer
IOWR(WD_TIMER_BASE, 0x0, 0x0); // clear timeout flag
IOWR(WD_TIMER_BASE, 0x2, 0x1); // reset internal counter
}
在上面的程序中,关于COLOR_DEPTH,根据HDMI IP里面gcp的定义00:8位,01:10位,10:12位,11:16位,Nios程序中给出COLOR_DEPTH参数0,说明输出时是按8位定义的。

IOPLL动态重配的更多相关文章

  1. Android开发环境的发展以及重装系统之后在myeclipse重配Android开发环境。

    android的开发环境早期要自己去去官网下SDK,ADT,AVD等.不仅在一开始要面临国内防火墙的阻拦,四处奔波之后都下载好了,还得自己Linked,可谓困难重重.随着android开发的火热,上面 ...

  2. GXB动态重配置

    可选择重配置逻辑(Optional Reconfiguration Logic) 使能选项: • Capability registers • Control and status registers ...

  3. fPLL结构及动态配置

    输入参考时钟 从上图可以看到参考时钟输入的几种类型.   注意:fPLL的校正是由CLKUSR来驱动的,这个时钟必须要保持稳定. 参考时钟利用器     N计数器 N计数器会把参考时钟利用器输出进行分 ...

  4. SDAccel-FPGA将带来至多25倍单位功耗性能提升

    很久没有看FPGA了,本来想继续学习HLS,就上Xilinx的网站看了看.结果发现了SDx 开发环境,很新的一个东西.由于我对这方面了解不多,本篇博文仅仅只是资料的整合和介绍. 1.SDx开发环境 X ...

  5. Zynq Fatfs文件系统应用笔记

    Zynq Fatfs文件系统应用笔 Hello,panda 笔记介绍基于所描写叙述的Zynq Fatfs基于Xilinx xilffsv3.0和Sdpsv2.4,文件系统採用在Bare-Metal和轻 ...

  6. C++单重继承分析

    code[class*="language-"], pre[class*="language-"] { color: rgba(51, 51, 51, 1); ...

  7. swing容器继承重绘问题解决

    swing容器继承重绘问题解决   以JPanel为例,继承JPanel,想动态为器更换背景,这就涉及到重绘问题.一下是本人重写代码: package ui; import java.awt.Grap ...

  8. atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js

    atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js 1. 图片按钮的效果总结 1 1.1. 按钮图片自动缩放的. 1 1.2. 不要 ...

  9. 路由重分发 最重要 最难 ccnp

    路由重分发   多种协议之间    彼此学习到对方的路由 重分发好   结果好 重分发不好   结果最好是产生次优路径      最差事产生路由黑洞和环路 实例1:    重分发一般需要双向重分发   ...

随机推荐

  1. 关于x-shell连接不上本地虚拟机linux

    首先把虚拟机网络模式调成nat模式,用于共享主机的ip地址. 然后再虚拟机输入命令ifconfig查看虚拟机的ip 在windows下ping一下虚拟机的ip确保能ping通,同理在虚拟机下ping主 ...

  2. Python的set集合

    set集合也用{}表示,set中的元素是不重复的.无序的,且它里面的元素必须是可hash的(int,str,tuple,bool),set是可变的. 1.使用set去重 m = [1, '] s = ...

  3. ORA-00911: invalid character 包含中文报错

    SQL在pl下正常执行在vs里报错ORA-00911: invalid character. 1.检查SQL末尾是否含有";" 去掉 2.sql包含中文报错 string sql ...

  4. exchang2010OWA主界面添加修改密码选项

    原文链接:http://www.mamicode.com/info-detail-1444660.html exchange邮箱用户可以登录OWA修改密码,当AD用户密码过期或者重置密码勾选了“用户下 ...

  5. eclipse的Git忽略某些不需要提交的文件

    Eclipse切换到Navigator视图,找到.gitignore文件(如果是maven项目,一般找作为modules的项目的.gitignore文件),添加内容: .settings .proje ...

  6. 数据库设计,表与表的关系,一对一。One-To-One(1)

    如何处理对象间one-to-ont的映射关系:one-to-one: 处理一对一关联的方式有两种: 1.主键关联使用主键关联处理一对一的关系. 主键关联不需要额外的表字段:两行是通过这种一对一关系相关 ...

  7. MySQL InnoDB引擎B+树索引简单整理说明

    本文出处:http://www.cnblogs.com/wy123/p/7211742.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  8. 在delphi中XLSReadWriteII.组件的应用实例(1)

    第三方组件:XLSReadWriteII.v.5.20.67_XE3 实例源码如下: unit Unit1; interface uses Winapi.Windows, Winapi.Message ...

  9. R语言-增加图例

    legend()函数 > plot(rain$Tokyo,type="l",col="red", + ylim=c(0,300), + main=&quo ...

  10. MySQL事件不自动执行

    前台统计数据量很大,于是在数据库中新建了一个事件,每隔10分钟执行一次存储过程,向统计表中插入统计数据 但是创建完成后发现事件并不会自动执行,上网查了一下才知道必须手工开启才事件可以 查看事件开启状态 ...