今天做了pll重配置的实验,输入时钟50m初始配置输出75m经重配置后输出100m,带宽为low,使用的ip:rom,altpll_reconfig ,altpll,将altpll配置为可重配置模式,altpll_reconfig配置为从rom读取,rom配置为1位宽,深度256,千万要注意,用rom的话一定要对q输出锁存,原因如下:

因为rom_data_in要求的是在write_rom_ena信号有效后的两个时钟周期后有效,那就是说中间需要两个周期才会有数据输出,如果把q输出锁存去掉的话那么中间就有一个时钟周期了,所以会有问题,导致pll无法正常工作,我就是因为习惯了rom的输出不锁存,因为这样可以减少一个时钟周期等待时间,但是这个情况下就错了,必须要锁存一个周期。

rom的初始化mif文件如下:

WIDTH=1;

DEPTH=144;

ADDRESS_RADIX=UNS;

DATA_RADIX=UNS;

CONTENT BEGIN

0 : 0; -- Reserved Bits = 0 (1 bit(s))

1 : 0; -- Reserved Bits = 0 (1 bit(s))

2 : 0; -- Loop Filter Capacitance = 0 (2 bit(s)) (Setting 0)

3 : 0;

4 : 0; -- Loop Filter Resistance = 8 (5 bit(s)) (Setting 8)

5 : 1;

6 : 0;

7 : 0;

8 : 0;

9 : 0; -- VCO Post Scale = 0 (1 bit(s)) (VCO post-scale divider counter value = 2)

10 : 0; -- Reserved Bits = 0 (5 bit(s))

11 : 0;

12 : 0;

13 : 0;

14 : 0;

15 : 0; -- Charge Pump Current = 1 (3 bit(s)) (Setting 1)

16 : 0;

17 : 1;

18 : 0; -- N counter: Bypass = 0 (1 bit(s))

19 : 0; -- N counter: High Count = 0 (8 bit(s))

20 : 0;

21 : 0;

22 : 0;

23 : 0;

24 : 1;

25 : 0;

26 : 1;

27 : 1; -- N counter: Odd Division = 1 (1 bit(s))

28 : 0; -- N counter: Low Count = 0 (8 bit(s))

29 : 0;

30 : 0;

31 : 0;

32 : 0;

33 : 1;

34 : 0;

35 : 0;

36 : 0; -- M counter: Bypass = 0 (1 bit(s))

37 : 0; -- M counter: High Count = 54 (8 bit(s))

38 : 0;

39 : 1;

40 : 1;

41 : 0;

42 : 1;

43 : 1;

44 : 0;

45 : 0; -- M counter: Odd Division = 0 (1 bit(s))

46 : 0; -- M counter: Low Count = 54 (8 bit(s))

47 : 0;

48 : 1;

49 : 1;

50 : 0;

51 : 1;

52 : 1;

53 : 0;

54 : 0; -- clk0 counter: Bypass = 1 (1 bit(s))

55 : 0; -- clk0 counter: High Count = 3 (8 bit(s))

56 : 0;

57 : 0;

58 : 0;

59 : 0;

60 : 0;

61 : 1;

62 : 1;

63 : 0; -- clk0 counter: Odd Division = 0 (1 bit(s))

64 : 0; -- clk0 counter: Low Count = 3 (8 bit(s))

65 : 0;

66 : 0;

67 : 0;

68 : 0;

69 : 0;

70 : 1;

71 : 1;

72 : 1; -- clk1 counter: Bypass = 0 (1 bit(s))

73 : 0; -- clk1 counter: High Count = 0 (8 bit(s))

74 : 0;

75 : 0;

76 : 0;

77 : 0;

78 : 0;

79 : 0;

80 : 0;

81 : 0; -- clk1 counter: Odd Division = 0 (1 bit(s))

82 : 0; -- clk1 counter: Low Count = 0 (8 bit(s))

83 : 0;

84 : 0;

85 : 0;

86 : 0;

87 : 0;

88 : 0;

89 : 0;

90 : 1; -- clk2 counter: Bypass = 1 (1 bit(s))

91 : 0; -- clk2 counter: High Count = 0 (8 bit(s))

92 : 0;

93 : 0;

94 : 0;

95 : 0;

96 : 0;

97 : 0;

98 : 0;

99 : 0; -- clk2 counter: Odd Division = 0 (1 bit(s))

100 : 0; -- clk2 counter: Low Count = 0 (8 bit(s))

101 : 0;

102 : 0;

103 : 0;

104 : 0;

105 : 0;

106 : 0;

107 : 0;

108 : 1; -- clk3 counter: Bypass = 1 (1 bit(s))

109 : 0; -- clk3 counter: High Count = 0 (8 bit(s))

110 : 0;

111 : 0;

112 : 0;

113 : 0;

114 : 0;

115 : 0;

116 : 0;

117 : 0; -- clk3 counter: Odd Division = 0 (1 bit(s))

118 : 0; -- clk3 counter: Low Count = 0 (8 bit(s))

119 : 0;

120 : 0;

121 : 0;

122 : 0;

123 : 0;

124 : 0;

125 : 0;

126 : 1; -- clk4 counter: Bypass = 1 (1 bit(s))

127 : 0; -- clk4 counter: High Count = 0 (8 bit(s))

128 : 0;

129 : 0;

130 : 0;

131 : 0;

132 : 0;

133 : 0;

134 : 0;

135 : 0; -- clk4 counter: Odd Division = 0 (1 bit(s))

136 : 0; -- clk4 counter: Low Count = 0 (8 bit(s))

137 : 0;

138 : 0;

139 : 0;

140 : 0;

141 : 0;

142 : 0;

143 : 0;

END;

前面是关于电荷泵和环路滤波器的参数的,我用的fpga只支持低中高三个默认的选项,其他配置不支持,我选择的是低带宽对应的值,低带宽时钟锁定时间长,但是相位抖动小,高带宽时钟锁定时间短,但是相位抖动大,中带宽是二者的平衡。之后是 n,m,c0c1,c2,c3,c4的配置,这几个计数器的配置中有几个注意点:1,rbypass位,决定了此计数器是否有效,设为1的时候将旁路此计数器,0则使用此计数器的值,2,rseodd位,如果为1,那么需要从高脉冲减去0.5个周期,相应的,低脉冲加上0.5个周期。3,计数器除rbypass外的高8位决定了高电平的周期,除rseodd外的低8位决定了低电平的周期,二者之和决定了分频数,如高8位为3,低8位为3,那么代表的意思是6分频,高电平三个周期,低电平三个周期。

附图:pll原理图

整个系统的结构如下图所示,这样看更直观(只是为了看起来更直观,我不是这样做的,写的verilog代码)

在整个配置过程中,其他连线按所示连接好,只需要对write_from_rom和reconfig两个信号操作就可以了,write_from_rom一个高电平后拉低,检测到busy为0后reconfig拉高一个高电平之后拉低,配置完成后 scandone为高电平。

fpga pll重配置实验总结的更多相关文章

  1. Xilinx 7系列FPGA部分重配置【2】

    在之前的“Xilinx 7系列FPGA部分重配置[1]”中已经较为详细地记录了分别在工程模式(Project Mode)和非工程模式(Non-Project Mode)下.使用7系列的Xilinx F ...

  2. 【iCore4 双核心板_FPGA】例程十七:基于FIFO的ARM+FPGA数据存取实验

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int fsmc_read_data; ; ]; ]; char *p; /* ...

  3. 【iCore1S 双核心板_FPGA】例程十七:基于双口RAM的ARM+FPGA数据存取实验

    实验现象: 核心代码: module DUAL_PORT_RAM( input CLK_12M, inout WR, input RD, input CS0, :]A, :]DB, output FP ...

  4. 【iCore4 双核心板_FPGA】例程十五:基于单口RAM的ARM+FPGA数据存取实验

    实验现象: 写RAM命令格式:write:地址(0-255),数据(0-65535)\cr\lf 读RAM命令格式:read:地址(0-255)\cr\lf 核心代码: int main(void) ...

  5. 【iCore4 双核心板_FPGA】例程十六:基于双口RAM的ARM+FPGA数据存取实验

    实验现象: 核心代码: int main(void) { /* USER CODE BEGIN 1 */ int i; int address,data; ; ]; ]; char *p; /* US ...

  6. 基于FPGA的通信系统实验

    伪随机信号发生器 1.伪随机信号发生器原理 伪随机信号发生器又叫PN序列发生器或者是m序列发生器.m序列是一种线性反馈寄存器序列,m序列的产生可以利用r级寄存器产生长度为2^r-1的m序列,该实验中采 ...

  7. 【iCore3 双核心板_FPGA】实验十八:基于单口RAM的ARM+FPGA数据存取实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1i58Ssvz iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  8. 【iCore3 双核心板_FPGA】实验十九:基于双口RAM的ARM+FPGA数据存取实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1pLReIc7 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  9. 【iCore3 双核心板_FPGA】实验二十:基于FIFO的ARM+FPGA数据存取实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1cmisnO iCore3 购买链接: https://item.taobao.com/item.htm?id=5242294 ...

随机推荐

  1. PHP运算符-算术运算符、三元运算符、逻辑运算符

    运算符是用来对变量.常量或数据进行计算的符号,它对一个值或一组值执行一个指定的操作.PHP的运算符包括算术运算符.字符串运算符.赋值运算符.位运算符.逻辑运算符.比较运算符.递增或递减运算符.错误控制 ...

  2. HUST 1010 The Minimum Length (字符串最小循环节)

    题意 有一个字符串A,一次次的重写A,会得到一个新的字符串AAAAAAAA.....,现在将这个字符串从中切去一部分得到一个字符串B.例如有一个字符串A="abcdefg".,复制 ...

  3. IOS-程序员和设计师必备的20个CSS工具

    程序员和设计师必备的20个CSS工具   CSS工具是现今网站开发人员和设计人员使用的最必要和最重要的工具之一.这是因为这些CSS工具,可以为开发人员和设计人员简化手头的工作,大大减少web开发和设计 ...

  4. window.history.go(-1);

    history是你浏览过的网页的url(简单的说就是网址)的集合,也就是你的浏览器里的那个历史记录.它在js里是一个内置对象,就跟document一样,它有自己的方法,go就是其中一个. 这个方法的参 ...

  5. Java复习9网路编程

    Java 复习9网路编程 20131008 前言: Java语言在网络通信上面的开发要远远领先于其他编程语言,这是Java开发中最重要的应用,可以基于协议的编程,如Socket,URLConnecti ...

  6. 【lightoj-1024】Eid (高精度)

    [题意] 给定n个数,求这n个数的最小公倍数. [题解] 最小公倍数当然不能按常规方法来求,因为最大的数将近是10000^1000级别的.然鹅最小公倍数怎么搞呢? 这里发现了一个规律: 4 5 6 3 ...

  7. SQLServer中通过脚本内容查找存储过程

    select o.name,m.definition from sys.objects o left outer join sys.sql_modules m on o.object_id = m.o ...

  8. LaTex中插入大括号的多行公式

    由于近期要发表论文,不得不恶补LaTex.现在需要插入带大括号的多行公式,效果如下: LaTex编辑如下: \begin{equation} \label{eq6} [x_{i}]=\left\{ \ ...

  9. vue.js 源代码学习笔记 ----- 工具方法 env

    /* @flow */ /* globals MutationObserver */ import { noop } from 'shared/util' // can we use __proto_ ...

  10. InfluxDB使用纪录

    我是Mac环境 1.安装 brew install influxdb 安装完成后,默认目录为/usr/local/opt/influxdb. 2.安装完成后,打开influxdb服务. $ influ ...