Sie sind hier

Der Vorteiler

Fehlermeldung

Deprecated function: Array and string offset access syntax with curly braces is deprecated in include_once() (line 20 of /mnt/web216/e3/48/5667948/htdocs/includes/file.phar.inc).

Hier ist nicht der Vorteiler gemeint, der etwa ein zu messendes Signal bei 1 GHz auf eine Frequenz z.B. unter 10 MHz herunterteilt, sondern der Vorteiler, der den Referenztakt von 10 MHz auf 10 kHz reduziert. Die Ablaufsteuerung wird den Takt weiter herunterteilen so daß Torzeiten zwischen 0.01 und 10 Sekunden verfügbar sind.

Der Vorteiler ist relativ einfach, weswegen ich ihn am Anfang präsentieren. Er soll also ein 10 MHz-Signal auf 10 kHz herunterteilen. Er wird daher einen Eingang namens clk haben und einen Ausgang, den ich mit clk1000 (1000 steht für 1/1000) bezeichne. Darüber hinaus gibt es einen reset-Eingang (reset) und einen enable-Eingang (en). Im folgenden der VHDL-Code:
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.STD_LOGIC_ARITH.ALL;
  4. use IEEE.STD_LOGIC_UNSIGNED.ALL;
  5.  
  6. entity prescaler is
  7. port(clk : in std_logic;
  8. en : in std_logic;
  9. clk1000 : out std_logic;
  10. reset : in std_logic );
  11. end;
  12.  
  13. architecture behavioral of prescaler is
  14. signal x : std_logic_vector (8 downto 0);
  15. signal c_int : std_logic;
  16. begin
  17.  
  18.  
  19. p1: process(clk, en, reset) begin
  20. if reset = '1' then
  21. x <= conv_std_logic_vector(499,9);
  22. c_int <= '0';
  23. elsif clk = '1' and clk'event then
  24. if en = '1' then
  25. if x = "000000000" then
  26. x <= conv_std_logic_vector(499,9);
  27. c_int <= not c_int;
  28. else
  29. x <= x-1;
  30. end if;
  31. end if;
  32. end if;
  33. end process p1;
  34.  
  35. clk1000 <= c_int;
  36.  
  37. end behavioral;

Ohne den code im einzelnen erklären zu wollen sei erwähnt, daß die entity prescaler genau die oben aufgeführten Ein- und Ausgänge besitzt und daß intern ein 9 bit breiter Zähler verwendet wird. Er beginnt bei Zählerstand 499 rückwärts bis auf Null zu zählen und invertiert dann beim Vesuch auf -1 zu zählen c_int. Außerhalb der synchronen Umgebung p1 wird der Zustand von c_int direkt an clk1000 in einem nebenläufigen Prozeß weitergereicht. Nachfolgend noch die Constraints, die die Pinbelegung festlegen.

  1. NET "clk" LOC = "P1" | BUFG = CLK ;
  2. NET "clk1000" LOC = "P28" ;
  3. NET "en" LOC = "P7" ;
  4. NET "reset" LOC = "P33" | BUFG = SR ;

Der Vorteiler wurde auch simuliert. Das folgende File zeigt den Simulationsaufbau.

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE ieee.std_logic_unsigned.all;
  4. USE ieee.numeric_std.ALL;
  5.  
  6. ENTITY presscaler_test IS
  7. END presscaler_test;
  8.  
  9. ARCHITECTURE behavior OF presscaler_test IS
  10.  
  11. -- Component under Test
  12. COMPONENT prescaler PORT(
  13. clk : IN std_logic;
  14. en : IN std_logic;
  15. clk1000 : OUT std_logic;
  16. reset : IN std_logic);
  17. END COMPONENT;
  18.  
  19. --Inputs
  20. signal clk : std_logic := '0';
  21. signal en : std_logic := '0';
  22. signal reset : std_logic := '0';
  23.  
  24. --Outputs
  25. signal clk1000 : std_logic;
  26.  
  27. -- Clock period definition for 10 MHz
  28. constant clk_period : time := 100 ns;
  29.  
  30. BEGIN
  31.  
  32. -- Instantiate the Unit Under Test (UUT)
  33. uut: prescaler PORT MAP (
  34. clk => clk,
  35. en => en,
  36. clk1000 => clk1000,
  37. reset => reset);
  38.  
  39. -- Clock process definitions
  40. clk_process :process begin
  41. clk <= '0';
  42. wait for clk_period/2;
  43. clk <= '1';
  44. wait for clk_period/2;
  45. end process;
  46.  
  47. -- Enable signal generation
  48. en_process :process begin
  49. en <= '0';
  50. wait for 10 us;
  51. en <= '1';
  52. wait;
  53. end process;
  54.  
  55. -- Reset signal generation
  56. reset_process :process begin
  57. reset <= '0';
  58. wait for 3 us;
  59. reset <= '1';
  60. wait for 3 us;
  61. reset <= '0';
  62. wait;
  63. end process;
  64.  
  65. END;

Initial sind alle Eingänge auf Low. Der Augang ist anfangs undefiniert. Simuliert wird mit einer Taktfrequenz von 10 MHz. Das Reset-Signal (active high) geht nach 3 us für 3 us auf High um danach für den Rest der Simulation auf Low zu verbleiben. Das enable-Signal (evenfalls active high) geht nach 10 us bis zum Ender der Simulation auf High. Ab diesem Zeitpunkt wird das Eingangssignal mit 10 MHz Taktfrequenz durch 1000 geteilt. Das folgende Bild illustriert das Simulationsergebnis:

Simulationsergebnis der entity prescaler

Die oberste Spur zeigt das 10 MHz-Signal, das bei dem gewählten Zeitfenster nicht mehr aufgelöst dargestellt wird. Daher der breite grüne Balken. Darunter ist das enable Signal dargestellt, gefolgt vom Reset-Signal. Gemessen wurde nun der Abstand zweier aufeinanderfolgender steigender Flanken des Ausgangssignals clk1000. Schon die automatische Abstandsmessung der beiden Cursorlinien zeigt 100,000,000 ps an, was, nach auszählern der Nullern genau 100 us entspricht und das ist nichts anderes als 10 kHz. Dieses CPLD müßte schon mal funktionieren und tut es auch, nachdem es auf dem Experimentierboard programmiert worden ist.