tb_mc8051_tmrctr_sim.vhd
上传用户:sztwq510
上传日期:2007-04-20
资源大小:209k
文件大小:28k
源码类别:

VHDL/FPGA/Verilog

开发平台:

Matlab

  1. -------------------------------------------------------------------------------
  2. --                                                                           --
  3. --          X       X   XXXXXX    XXXXXX    XXXXXX    XXXXXX      X          --
  4. --          XX     XX  X      X  X      X  X      X  X           XX          --
  5. --          X X   X X  X         X      X  X      X  X          X X          --
  6. --          X  X X  X  X         X      X  X      X  X         X  X          --
  7. --          X   X   X  X          XXXXXX   X      X   XXXXXX      X          --
  8. --          X       X  X         X      X  X      X         X     X          --
  9. --          X       X  X         X      X  X      X         X     X          --
  10. --          X       X  X      X  X      X  X      X         X     X          --
  11. --          X       X   XXXXXX    XXXXXX    XXXXXX    XXXXXX      X          --
  12. --                                                                           --
  13. --                                                                           --
  14. --                       O R E G A N O   S Y S T E M S                       --
  15. --                                                                           --
  16. --                            Design & Consulting                            --
  17. --                                                                           --
  18. -------------------------------------------------------------------------------
  19. --                                                                           --
  20. --         Web:           http://www.oregano.at/                             --
  21. --                                                                           --
  22. --         Contact:       mc8051@oregano.at                                  --
  23. --                                                                           --
  24. -------------------------------------------------------------------------------
  25. --                                                                           --
  26. --  MC8051 - VHDL 8051 Microcontroller IP Core                               --
  27. --  Copyright (C) 2001 OREGANO SYSTEMS                                       --
  28. --                                                                           --
  29. --  This library is free software; you can redistribute it and/or            --
  30. --  modify it under the terms of the GNU Lesser General Public               --
  31. --  License as published by the Free Software Foundation; either             --
  32. --  version 2.1 of the License, or (at your option) any later version.       --
  33. --                                                                           --
  34. --  This library is distributed in the hope that it will be useful,          --
  35. --  but WITHOUT ANY WARRANTY; without even the implied warranty of           --
  36. --  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU        --
  37. --  Lesser General Public License for more details.                          --
  38. --                                                                           --
  39. --  Full details of the license can be found in the file LGPL.TXT.           --
  40. --                                                                           --
  41. --  You should have received a copy of the GNU Lesser General Public         --
  42. --  License along with this library; if not, write to the Free Software      --
  43. --  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA  --
  44. --                                                                           --
  45. -------------------------------------------------------------------------------
  46. --
  47. --
  48. --         Author:                 Roland H鰈ler
  49. --
  50. --         Filename:               tb_mc8051_tmrctr_sim.vhd
  51. --
  52. --         Date of Creation:       Mon Aug  9 12:14:48 1999
  53. --
  54. --         Version:                $Revision: 1.3 $
  55. --
  56. --         Date of Latest Version: $Date: 2002/01/07 12:16:57 $
  57. --
  58. --
  59. --         Description: Module level testbench for the timer/counter unit.
  60. --
  61. --
  62. --
  63. --
  64. -------------------------------------------------------------------------------
  65. architecture sim of tb_mc8051_tmrctr is
  66.   type mode is (MODE0_timer,
  67.                 MODE0_timer_interrupt,
  68.                 MODE0_counter,
  69.                 MODE0_counter_interrupt,
  70.                 MODE1_timer,
  71.                 MODE1_timer_interrupt,
  72.                 MODE1_counter,
  73.                 MODE1_counter_interrupt,
  74.                 MODE2_timer,
  75.                 MODE2_timer_interrupt,
  76.                 MODE2_counter,
  77.                 MODE2_counter_interrupt,
  78.                 MODE3_timer,
  79.                 MODE3_timer_interrupt,
  80.                 MODE3_counter,
  81.                 MODE3_counter_interrupt,
  82.                 SIMULATION_ERROR);
  83.   
  84.   signal s_tmod,
  85.            s_th0_out,
  86.            s_tl0_out,
  87.            s_th1_out,
  88.            s_tl1_out,
  89.            s_reload: std_logic_vector(7 downto 0);
  90.     
  91.     signal clk,
  92.            reset,
  93.            s_int0,
  94.            s_int1,
  95.            s_t0,
  96.            s_t1,
  97.            s_tcon_tr0,
  98.            s_tcon_tr1,
  99.            s_tf0,
  100.            s_tf1,
  101.            s_wt_en: std_logic;
  102.     
  103.     signal tmr_ctr0, tmr_ctr1: mode;
  104.     signal s_wt : std_logic_vector (1 downto 0);
  105.     
  106.     
  107. begin
  108.   i_mc8051_tmrctr : mc8051_tmrctr
  109.     port map (clk        => clk,   -- tmrctr inputs
  110.               reset      => reset,
  111.               int0_i     => s_int0,
  112.               int1_i     => s_int1,
  113.               t0_i       => s_t0,
  114.               t1_i       => s_t1,
  115.               tmod_i     => s_tmod,
  116.               tcon_tr0_i => s_tcon_tr0,
  117.               tcon_tr1_i => s_tcon_tr1,
  118.               reload_i   => s_reload,
  119.               wt_en_i    => s_wt_en,
  120.               wt_i       => s_wt,
  121.               th0_o => s_th0_out,   -- tmrctr outputs
  122.               tl0_o => s_tl0_out,
  123.               th1_o => s_th1_out,
  124.               tl1_o => s_tl1_out,
  125.               tf0_o => s_tf0,
  126.               tf1_o => s_tf1);
  127. p_run: process
  128. begin
  129. -------------------------------------------------------------------------------
  130. -- set start values and perform reset
  131. -------------------------------------------------------------------------------
  132.     s_tmod <= conv_std_logic_vector(0,8);
  133.     s_tcon_tr0 <= '0';    
  134.     s_tcon_tr1 <= '0';
  135.     s_wt <= conv_std_logic_vector(0,2);
  136.     s_wt_en <= '0';
  137.     s_reload <= conv_std_logic_vector(0,8);       -- reload value
  138.     reset <= '1';
  139.     wait for one_period + one_period/2 + 5 ns ;
  140.     reset <= '0';
  141.     
  142. -------------------------------------------------------------------------------
  143. -- Testing MODE 0
  144. -------------------------------------------------------------------------------
  145. -------------------------------------------------------------------------------
  146. -- set the two timer/counters in mode 0 as timers
  147. -------------------------------------------------------------------------------
  148.     -- Perform reloads of tmr/ctr registers
  149.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  150.     s_wt_en <= '1';
  151.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  152.     wait for one_period;
  153.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  154.     s_wt_en <= '1';
  155.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  156.     wait for one_period;
  157.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  158.     s_wt_en <= '1';
  159.     s_reload <= conv_std_logic_vector(31,8);    -- reload value
  160.     wait for one_period;
  161.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  162.     s_wt_en <= '1';
  163.     s_reload <= conv_std_logic_vector(31,8);    -- reload value
  164.     wait for one_period;
  165.     s_wt_en <= '0';
  166.     
  167.     s_tmod <= conv_std_logic_vector(0,8);       -- "00000000"
  168.     s_tcon_tr0 <= '1';    
  169.     s_tcon_tr1 <= '1';
  170.     wait for one_period * 80;
  171.     
  172. -------------------------------------------------------------------------------
  173. -- set the two timer/counters in mode 0 as counters
  174. -------------------------------------------------------------------------------
  175.     -- Perform reloads of tmr/ctr registers
  176.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  177.     s_wt_en <= '1';
  178.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  179.     wait for one_period;
  180.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  181.     s_wt_en <= '1';
  182.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  183.     wait for one_period;
  184.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  185.     s_wt_en <= '1';
  186.     s_reload <= conv_std_logic_vector(31,8);    -- reload value
  187.     wait for one_period;
  188.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  189.     s_wt_en <= '1';
  190.     s_reload <= conv_std_logic_vector(31,8);    -- reload value
  191.     wait for one_period;
  192.     s_wt_en <= '0';
  193.     
  194.     s_tmod <= conv_std_logic_vector(68,8);      -- "01000100"
  195.     s_tcon_tr0 <= '1';    
  196.     s_tcon_tr1 <= '1';
  197.     wait for one_period * 640;
  198.     s_tcon_tr0 <= '0';    
  199.     s_tcon_tr1 <= '0';
  200.     wait for one_period * 4;
  201. -------------------------------------------------------------------------------
  202. -- set the two timer/counters in mode 0 as counters using interrupt inputs
  203. -------------------------------------------------------------------------------
  204.     -- Perform reloads of tmr/ctr registers
  205.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  206.     s_wt_en <= '1';
  207.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  208.     wait for one_period;
  209.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  210.     s_wt_en <= '1';
  211.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  212.     wait for one_period;
  213.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  214.     s_wt_en <= '1';
  215.     s_reload <= conv_std_logic_vector(31,8);    -- reload value
  216.     wait for one_period;
  217.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  218.     s_wt_en <= '1';
  219.     s_reload <= conv_std_logic_vector(31,8);    -- reload value
  220.     wait for one_period;
  221.     s_wt_en <= '0';
  222.     
  223.     s_tmod <= conv_std_logic_vector(204,8);     -- "11001100"
  224.     s_tcon_tr0 <= '1';    
  225.     s_tcon_tr1 <= '1';
  226.     wait for one_period * 960;
  227.     s_tcon_tr0 <= '0';    
  228.     s_tcon_tr1 <= '0';
  229.     wait for one_period * 4;
  230.     
  231. -------------------------------------------------------------------------------
  232. -- set the two timer/counters in mode 0 as timers using interrupt inputs
  233. -------------------------------------------------------------------------------
  234.     -- Perform reloads of tmr/ctr registers
  235.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  236.     s_wt_en <= '1';
  237.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  238.     wait for one_period;
  239.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  240.     s_wt_en <= '1';
  241.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  242.     wait for one_period;
  243.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  244.     s_wt_en <= '1';
  245.     s_reload <= conv_std_logic_vector(31,8);    -- reload value
  246.     wait for one_period;
  247.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  248.     s_wt_en <= '1';
  249.     s_reload <= conv_std_logic_vector(31,8);    -- reload value
  250.     wait for one_period;
  251.     s_wt_en <= '0';
  252.     
  253.     s_tmod <= conv_std_logic_vector(136,8);     -- "10001000"
  254.     s_tcon_tr0 <= '1';    
  255.     s_tcon_tr1 <= '1';
  256.     wait for one_period * 640;
  257.     s_tcon_tr0 <= '0';    
  258.     s_tcon_tr1 <= '0';
  259.     wait for one_period * 4;
  260.     
  261. -------------------------------------------------------------------------------
  262. -- Testing MODE 1
  263. -------------------------------------------------------------------------------
  264. -------------------------------------------------------------------------------
  265. -- set the two timer/counters in mode 1 as timers
  266. -------------------------------------------------------------------------------
  267.     -- Perform reloads of tmr/ctr registers
  268.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  269.     s_wt_en <= '1';
  270.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  271.     wait for one_period;
  272.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  273.     s_wt_en <= '1';
  274.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  275.     wait for one_period;
  276.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  277.     s_wt_en <= '1';
  278.     s_reload <= conv_std_logic_vector(255,8);   -- reload value
  279.     wait for one_period;
  280.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  281.     s_wt_en <= '1';
  282.     s_reload <= conv_std_logic_vector(255,8);   -- reload value
  283.     wait for one_period;
  284.     s_wt_en <= '0';
  285.     
  286.     s_tmod <= conv_std_logic_vector(17,8);      -- "00010001"
  287.     s_tcon_tr0 <= '1';    
  288.     s_tcon_tr1 <= '1';
  289.     wait for one_period * 640;
  290.     s_tcon_tr0 <= '0';    
  291.     s_tcon_tr1 <= '0';
  292.     wait for one_period * 4;
  293. -------------------------------------------------------------------------------
  294. -- set the two timer/counters in mode 1 as counters
  295. -------------------------------------------------------------------------------
  296.     -- Perform reloads of tmr/ctr registers
  297.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  298.     s_wt_en <= '1';
  299.     s_reload <= conv_std_logic_vector(254,8);   -- reload value
  300.     wait for one_period;
  301.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  302.     s_wt_en <= '1';
  303.     s_reload <= conv_std_logic_vector(254,8);   -- reload value
  304.     wait for one_period;
  305.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  306.     s_wt_en <= '1';
  307.     s_reload <= conv_std_logic_vector(255,8);   -- reload value
  308.     wait for one_period;
  309.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  310.     s_wt_en <= '1';
  311.     s_reload <= conv_std_logic_vector(255,8);   -- reload value
  312.     wait for one_period;
  313.     s_wt_en <= '0';
  314.     
  315.     s_tmod <= conv_std_logic_vector(85,8);      -- "01010101"
  316.     s_tcon_tr0 <= '1';    
  317.     s_tcon_tr1 <= '1';
  318.     wait for one_period * 960;
  319.     s_tcon_tr0 <= '0';    
  320.     s_tcon_tr1 <= '0';
  321.     wait for one_period * 4;
  322. -------------------------------------------------------------------------------
  323. -- set the two timer/counters in mode 1 as counters using interrupt inputs
  324. -------------------------------------------------------------------------------
  325.     -- Perform reloads of tmr/ctr registers
  326.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  327.     s_wt_en <= '1';
  328.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  329.     wait for one_period;
  330.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  331.     s_wt_en <= '1';
  332.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  333.     wait for one_period;
  334.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  335.     s_wt_en <= '1';
  336.     s_reload <= conv_std_logic_vector(255,8);   -- reload value
  337.     wait for one_period;
  338.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  339.     s_wt_en <= '1';
  340.     s_reload <= conv_std_logic_vector(255,8);   -- reload value
  341.     wait for one_period;
  342.     s_wt_en <= '0';
  343.     
  344.     s_tmod <= conv_std_logic_vector(221,8);     -- "11011101"
  345.     s_tcon_tr0 <= '1';    
  346.     s_tcon_tr1 <= '1';
  347.     wait for one_period * 1280;
  348.     s_tcon_tr0 <= '0';    
  349.     s_tcon_tr1 <= '0';
  350.     wait for one_period * 4;
  351.     
  352. -------------------------------------------------------------------------------
  353. -- set the two timer/counters in mode 1 as timers using interrupt inputs
  354. -------------------------------------------------------------------------------
  355.     -- Perform reloads of tmr/ctr registers
  356.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  357.     s_wt_en <= '1';
  358.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  359.     wait for one_period;
  360.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  361.     s_wt_en <= '1';
  362.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  363.     wait for one_period;
  364.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  365.     s_wt_en <= '1';
  366.     s_reload <= conv_std_logic_vector(255,8);   -- reload value
  367.     wait for one_period;
  368.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  369.     s_wt_en <= '1';
  370.     s_reload <= conv_std_logic_vector(255,8);   -- reload value
  371.     wait for one_period;
  372.     s_wt_en <= '0';
  373.     
  374.     s_tmod <= conv_std_logic_vector(153,8);     -- "10011001"
  375.     s_tcon_tr0 <= '1';    
  376.     s_tcon_tr1 <= '1';
  377.     wait for one_period * 640;
  378.     s_tcon_tr0 <= '0';    
  379.     s_tcon_tr1 <= '0';
  380.     wait for one_period * 4;
  381.     
  382. -------------------------------------------------------------------------------
  383. -- Testing MODE 2
  384. -------------------------------------------------------------------------------
  385. -------------------------------------------------------------------------------
  386. -- set the two timer/counters in mode 2 as timers
  387. -------------------------------------------------------------------------------
  388.     -- Perform reloads of tmr/ctr registers
  389.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  390.     s_wt_en <= '1';
  391.     s_reload <= conv_std_logic_vector(250,8);   -- reload value
  392.     wait for one_period;
  393.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  394.     s_wt_en <= '1';
  395.     s_reload <= conv_std_logic_vector(250,8);   -- reload value
  396.     wait for one_period;
  397.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  398.     s_wt_en <= '1';
  399.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  400.     wait for one_period;
  401.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  402.     s_wt_en <= '1';
  403.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  404.     wait for one_period;
  405.     s_wt_en <= '0';
  406.     
  407.     s_tmod <= conv_std_logic_vector(34,8);      -- "00100010"
  408.     s_tcon_tr0 <= '1';    
  409.     s_tcon_tr1 <= '1';
  410.     wait for one_period * 640;
  411.     s_tcon_tr0 <= '0';    
  412.     s_tcon_tr1 <= '0';
  413.     wait for one_period * 4;
  414. -------------------------------------------------------------------------------
  415. -- set the two timer/counters in mode 2 as counters
  416. -------------------------------------------------------------------------------
  417.     -- Perform reloads of tmr/ctr registers
  418.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  419.     s_wt_en <= '1';
  420.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  421.     wait for one_period;
  422.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  423.     s_wt_en <= '1';
  424.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  425.     wait for one_period;
  426.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  427.     s_wt_en <= '1';
  428.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  429.     wait for one_period;
  430.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  431.     s_wt_en <= '1';
  432.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  433.     wait for one_period;
  434.     s_wt_en <= '0';
  435.     
  436.     s_tmod <= conv_std_logic_vector(102,8);     -- "01100110"
  437.     s_tcon_tr0 <= '1';    
  438.     s_tcon_tr1 <= '1';
  439.     wait for one_period * 1280;
  440.     s_tcon_tr0 <= '0';    
  441.     s_tcon_tr1 <= '0';
  442.     wait for one_period * 4;
  443. -------------------------------------------------------------------------------
  444. -- set the two timer/counters in mode 2 as counters using interrupt inputs
  445. -------------------------------------------------------------------------------
  446.     -- Perform reloads of tmr/ctr registers
  447.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  448.     s_wt_en <= '1';
  449.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  450.     wait for one_period;
  451.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  452.     s_wt_en <= '1';
  453.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  454.     wait for one_period;
  455.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  456.     s_wt_en <= '1';
  457.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  458.     wait for one_period;
  459.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  460.     s_wt_en <= '1';
  461.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  462.     wait for one_period;
  463.     s_wt_en <= '0';
  464.     
  465.     s_tmod <= conv_std_logic_vector(238,8);     -- "11101110"
  466.     s_tcon_tr0 <= '1';    
  467.     s_tcon_tr1 <= '1';
  468.     wait for one_period * 1280;
  469.     s_tcon_tr0 <= '0';    
  470.     s_tcon_tr1 <= '0';
  471.     wait for one_period * 4;
  472.     
  473. -------------------------------------------------------------------------------
  474. -- set the two timer/counters in mode 2 as timers using interrupt inputs
  475. -------------------------------------------------------------------------------
  476.     -- Perform reloads of tmr/ctr registers
  477.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  478.     s_wt_en <= '1';
  479.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  480.     wait for one_period;
  481.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  482.     s_wt_en <= '1';
  483.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  484.     wait for one_period;
  485.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  486.     s_wt_en <= '1';
  487.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  488.     wait for one_period;
  489.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  490.     s_wt_en <= '1';
  491.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  492.     wait for one_period;
  493.     s_wt_en <= '0';
  494.     
  495.     s_tmod <= conv_std_logic_vector(170,8);          -- "101010101"
  496.     s_tcon_tr0 <= '1';    
  497.     s_tcon_tr1 <= '1';
  498.     wait for one_period * 800;
  499.     s_tcon_tr0 <= '0';    
  500.     s_tcon_tr1 <= '0';
  501.     wait for one_period * 4;
  502.     
  503. -------------------------------------------------------------------------------
  504. -- Testing MODE 3
  505. -------------------------------------------------------------------------------
  506. -------------------------------------------------------------------------------
  507. -- set the two timer/counters in mode 3 as timers
  508. -------------------------------------------------------------------------------
  509.     -- Perform reloads of tmr/ctr registers
  510.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  511.     s_wt_en <= '1';
  512.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  513.     wait for one_period;
  514.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  515.     s_wt_en <= '1';
  516.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  517.     wait for one_period;
  518.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  519.     s_wt_en <= '1';
  520.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  521.     wait for one_period;
  522.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  523.     s_wt_en <= '1';
  524.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  525.     wait for one_period;
  526.     s_wt_en <= '0';
  527.     
  528.     s_tmod <= conv_std_logic_vector(51,8);           -- "00110011"
  529.     s_tcon_tr0 <= '1';    
  530.     s_tcon_tr1 <= '1';
  531.     wait for one_period * 960;
  532.     s_tcon_tr0 <= '0';    
  533.     s_tcon_tr1 <= '0';
  534.     wait for one_period * 4;
  535. -------------------------------------------------------------------------------
  536. -- set the two timer/counters in mode 3 as counters
  537. -------------------------------------------------------------------------------
  538.     -- Perform reloads of tmr/ctr registers
  539.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  540.     s_wt_en <= '1';
  541.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  542.     wait for one_period;
  543.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  544.     s_wt_en <= '1';
  545.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  546.     wait for one_period;
  547.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  548.     s_wt_en <= '1';
  549.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  550.     wait for one_period;
  551.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  552.     s_wt_en <= '1';
  553.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  554.     wait for one_period;
  555.     s_wt_en <= '0';
  556.     
  557.     s_tmod <= conv_std_logic_vector(119,8);           -- "01110111"
  558.     s_tcon_tr0 <= '1';    
  559.     s_tcon_tr1 <= '1';
  560.     wait for one_period * 960;
  561.     s_tcon_tr0 <= '0';    
  562.     s_tcon_tr1 <= '0';
  563.     wait for one_period * 4;
  564. -------------------------------------------------------------------------------
  565. -- set the two timer/counters in mode 3 as counters using interrupt inputs
  566. -------------------------------------------------------------------------------
  567.     -- Perform reloads of tmr/ctr registers
  568.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  569.     s_wt_en <= '1';
  570.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  571.     wait for one_period;
  572.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  573.     s_wt_en <= '1';
  574.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  575.     wait for one_period;
  576.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  577.     s_wt_en <= '1';
  578.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  579.     wait for one_period;
  580.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  581.     s_wt_en <= '1';
  582.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  583.     wait for one_period;
  584.     s_wt_en <= '0';
  585.     
  586.     s_tmod <= conv_std_logic_vector(255,8);          -- "11111111"
  587.     s_tcon_tr0 <= '1';    
  588.     s_tcon_tr1 <= '1';
  589.     wait for one_period * 960;
  590.     s_tcon_tr0 <= '0';    
  591.     s_tcon_tr1 <= '0';
  592.     wait for one_period * 4;
  593.     
  594. -------------------------------------------------------------------------------
  595. -- set the two timer/counters in mode 3 as timers using interrupt inputs
  596. -------------------------------------------------------------------------------
  597.     -- Perform reloads of tmr/ctr registers
  598.     s_wt <= conv_std_logic_vector(0,2);         -- TL0
  599.     s_wt_en <= '1';
  600.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  601.     wait for one_period;
  602.     s_wt <= conv_std_logic_vector(1,2);         -- TL1
  603.     s_wt_en <= '1';
  604.     s_reload <= conv_std_logic_vector(252,8);   -- reload value
  605.     wait for one_period;
  606.     s_wt <= conv_std_logic_vector(2,2);         -- TH0
  607.     s_wt_en <= '1';
  608.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  609.     wait for one_period;
  610.     s_wt <= conv_std_logic_vector(3,2);         -- TH1
  611.     s_wt_en <= '1';
  612.     s_reload <= conv_std_logic_vector(253,8);   -- reload value
  613.     wait for one_period;
  614.     s_wt_en <= '0';
  615.     
  616.     s_tmod <= conv_std_logic_vector(187,8);          -- "10111011"
  617.     s_tcon_tr0 <= '1';    
  618.     s_tcon_tr1 <= '1';
  619.     wait for one_period * 960;
  620.     s_tcon_tr0 <= '0';    
  621.     s_tcon_tr1 <= '0';
  622.     wait for one_period * 4;
  623.     wait for one_period * 10;
  624.     assert FALSE report "END OF SIMULATION" severity failure;
  625.     
  626. -------------------------------------------------------------------------------
  627. -- END of test after ~1000 * one_period
  628. -------------------------------------------------------------------------------
  629. end process p_run;
  630. -- system clock definition
  631. p_clock:   process
  632.     
  633.    variable  v_loop1 :   integer;
  634.    
  635.    begin
  636.    clk <= '0';
  637.    wait for one_period / 2;
  638.    while true loop
  639.       clk <= not clk;
  640.       wait for one_period / 2;
  641.    end loop;
  642.    
  643. end process p_clock;
  644. p_tx:   process                       -- stimulate external inputs
  645.     
  646.    variable  v_loop1 :   integer;
  647.    
  648.    begin
  649.    s_t0 <= '0';
  650.    s_t1 <= '0';
  651.    wait for one_period / 4;
  652.    while true loop
  653.       s_t0 <= not s_t0;
  654.       s_t1 <= not s_t1;
  655.       
  656.       wait for one_period * 32;
  657.    end loop;
  658.    
  659. end process p_tx;
  660. p_intx:   process                       -- stimulate external inputs
  661.     
  662.    variable  v_loop1 :   integer;
  663.    
  664.    begin
  665.    s_int0 <= '0';
  666.    s_int1 <= '0';
  667.    wait for one_period / 4;
  668.    while true loop
  669.       s_int0 <= not s_int0;
  670.       s_int1 <= not s_int1;      
  671.       wait for one_period * 64;
  672.    end loop;
  673.    
  674. end process p_intx;
  675. p_description: process(s_tmod)
  676. begin
  677. case s_tmod(3 downto 0) is
  678.     when "0000" => tmr_ctr0 <= MODE0_timer;
  679.     when "1000" => tmr_ctr0 <= MODE0_timer_interrupt;
  680.     when "0100" => tmr_ctr0 <= MODE0_counter;
  681.     when "1100" => tmr_ctr0 <= MODE0_counter_interrupt;
  682.     when "0001" => tmr_ctr0 <= MODE1_timer;
  683.     when "1001" => tmr_ctr0 <= MODE1_timer_interrupt;
  684.     when "0101" => tmr_ctr0 <= MODE1_counter;
  685.     when "1101" => tmr_ctr0 <= MODE1_counter_interrupt;
  686.     when "0010" => tmr_ctr0 <= MODE2_timer;
  687.     when "1010" => tmr_ctr0 <= MODE2_timer_interrupt;
  688.     when "0110" => tmr_ctr0 <= MODE2_counter;
  689.     when "1110" => tmr_ctr0 <= MODE2_counter_interrupt;
  690.     when "0011" => tmr_ctr0 <= MODE3_timer;
  691.     when "1011" => tmr_ctr0 <= MODE3_timer_interrupt;
  692.     when "0111" => tmr_ctr0 <= MODE3_counter;
  693.     when "1111" => tmr_ctr0 <= MODE3_counter_interrupt;
  694.     when others => tmr_ctr0 <= SIMULATION_ERROR;
  695. end case;
  696. case s_tmod(7 downto 4) is
  697.     when "0000" => tmr_ctr1 <= MODE0_timer;
  698.     when "1000" => tmr_ctr1 <= MODE0_timer_interrupt;
  699.     when "0100" => tmr_ctr1 <= MODE0_counter;
  700.     when "1100" => tmr_ctr1 <= MODE0_counter_interrupt;
  701.     when "0001" => tmr_ctr1 <= MODE1_timer;
  702.     when "1001" => tmr_ctr1 <= MODE1_timer_interrupt;
  703.     when "0101" => tmr_ctr1 <= MODE1_counter;
  704.     when "1101" => tmr_ctr1 <= MODE1_counter_interrupt;
  705.     when "0010" => tmr_ctr1 <= MODE2_timer;
  706.     when "1010" => tmr_ctr1 <= MODE2_timer_interrupt;
  707.     when "0110" => tmr_ctr1 <= MODE2_counter;
  708.     when "1110" => tmr_ctr1 <= MODE2_counter_interrupt;
  709.     when "0011" => tmr_ctr1 <= MODE3_timer;
  710.     when "1011" => tmr_ctr1 <= MODE3_timer_interrupt;
  711.     when "0111" => tmr_ctr1 <= MODE3_counter;
  712.     when "1111" => tmr_ctr1 <= MODE3_counter_interrupt;
  713.     when others => tmr_ctr1 <= SIMULATION_ERROR;
  714. end case;
  715. end process p_description;
  716. end sim;