3选1出问题了

[复制链接]
1801|2
 楼主| hlhfootbal 发表于 2012-6-13 08:56 | 显示全部楼层 |阅读模式
XGA_PLL 产生3个 clocks.
CLK0 : 24MHz
CLK1 : 48MHz
CLK2 : 96MHz
根据FORMATDAT,从3个 clocks中选一个时钟输出。
但是结果出错,FORMATCLK输出的是4MHz,不是 96MHz.
请教下问题出在哪里了。
谢谢!

  1. library ieee;
  2. use ieee.STD_LOGIC_1164.all;
  3. library ieee;
  4. use ieee.STD_LOGIC_ARITH.all;
  5. library ieee;
  6. use ieee.STD_LOGIC_UNSIGNED.all;

  7. entity XGA_PLL is
  8. port(
  9. CLB : out std_logic;
  10. CLK0 : out std_logic;
  11. CLK1 : out std_logic;
  12. CLK2 : out std_logic
  13. );
  14. end;

  15. architecture XGA_PLL of XGA_PLL is
  16. constant CLK0_CYCLE : TIME := 41.667 ns ;--24MHz
  17. constant CLK1_CYCLE : TIME := 20.833 ns ;--48MHz
  18. constant CLK2_CYCLE : TIME := 10.416 ns ;--96MHz

  19. signal ICLK0 : std_logic;
  20. signal ICLK1 : std_logic;
  21. signal ICLK2 : std_logic;
  22. signal ICLB : std_logic;

  23. begin

  24. process
  25. begin
  26. ICLK0 <= '1' ;wait for CLK0_CYCLE / 2;
  27. ICLK0 <= '0' ;wait for CLK0_CYCLE / 2;
  28. end process;
  29. CLK0 <= ICLK0;

  30. process
  31. begin
  32. ICLK1 <= '1' ;wait for CLK1_CYCLE / 2;
  33. ICLK1 <= '0' ;wait for CLK1_CYCLE / 2;
  34. end process;
  35. CLK1 <= ICLK1;

  36. process
  37. begin
  38. ICLK2 <= '1' ;wait for CLK2_CYCLE / 2;
  39. ICLK2 <= '0' ;wait for CLK2_CYCLE / 2;
  40. end process;
  41. CLK2 <= ICLK2;

  42. process
  43. begin
  44. ICLB <= '0' ;wait for CLK0_CYCLE * 16;
  45. ICLB <= '1' ;wait;
  46. end process;
  47. CLB <= ICLB;

  48. end;


  49. library ieee;
  50. use ieee.STD_LOGIC_1164.all;
  51. library ieee;
  52. use ieee.STD_LOGIC_ARITH.all;
  53. library ieee;
  54. use ieee.STD_LOGIC_UNSIGNED.all;


  55. entity SSTC_TEST_TOP is
  56. port(
  57. -- CLB : in std_logic ;
  58. -- CLK : in std_logic ;
  59. FORMATCLK : out std_logic
  60. -- locked : out std_logic
  61. );
  62. end;

  63. architecture SSTC_TEST_TOP of SSTC_TEST_TOP is
  64. signal ICLK : std_logic;
  65. -- signal IQ : std_logic_vector(3 downto 0);
  66. signal CLK_XGA1 : std_logic;
  67. signal CLK_XGA2 : std_logic;
  68. signal CLK_XGA3 : std_logic;
  69. signal FORMATDAT : std_logic_vector(7 downto 0);
  70. signal ICLB : std_logic;

  71. component XGA_PLL
  72. port (
  73. CLB : out std_logic;
  74. CLK0 : out std_logic;
  75. CLK1 : out std_logic;
  76. CLK2 : out std_logic
  77. );
  78. end component;

  79. begin
  80. C1: XGA_PLL
  81. port map (
  82. CLB => ICLB,
  83. CLK0 => CLK_XGA1,
  84. CLK1 => CLK_XGA2,
  85. CLK2 => CLK_XGA3
  86. );

  87. process(ICLK)
  88. begin
  89. if ICLK'event and ICLK = '1' then
  90. if ICLB = '0' then
  91. FORMATCLK <= '0';
  92. else
  93. case FORMATDAT(7 downto 0) is
  94. when "00000000" => FORMATCLK <= CLK_XGA1;
  95. when "00000001" => FORMATCLK <= CLK_XGA2;
  96. when "00000010" => FORMATCLK <= CLK_XGA3;
  97. when others => FORMATCLK <= '0';
  98. end case;
  99. end if;
  100. end if;
  101. end process;

  102. process(ICLK)
  103. begin
  104. if ICLK'event and ICLK = '1' then
  105. if ICLB = '0' then
  106. FORMATDAT <= "00000000";
  107. else FORMATDAT <= "00000010";
  108. end if;
  109. end if;
  110. end process;

  111. ICLK <= CLK_XGA1;

  112. end SSTC_TEST_TOP;

drentsi 发表于 2012-6-16 11:49 | 显示全部楼层
process(ICLK)

begin

if ICLK'event and ICLK = '1' then

if ICLB = '0' then

FORMATCLK <= '0';

else

case FORMATDAT(7 downto 0) is

when "00000000" => FORMATCLK <= CLK_XGA1;

when "00000001" => FORMATCLK <= CLK_XGA2;

when "00000010" => FORMATCLK <= CLK_XGA3;

when others => FORMATCLK <= '0';

end case;

end if;

end if;

end process;

-----------------------------------------------------------------
FORMATCLK 不要放在process里面选择
而应放在process外面,用这样的方式
FORMATCLK <= CLK_XGA1 when FORMATDAT(7 downto 0) =***
else CLK_XGA2 when ***
else CLK_XGA3 when ***
else '0';
lwq030736 发表于 2012-6-16 13:55 | 显示全部楼层
看下你的锁相环参数设置对不对
你那些wait for什么的其实只在testbench里面有用
不会给你综合成能够实现的电路的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

417

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部