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

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_siu_sim.vhd
  51. --
  52. --         Date of Creation:       Mon Aug  9 12:14:48 1999
  53. --
  54. --         Version:                $Revision: 1.5 $
  55. --
  56. --         Date of Latest Version: $Date: 2002/01/07 12:16:57 $
  57. --
  58. --
  59. --         Description: Module level testbench for the serial interface 
  60. --                      unit.
  61. --
  62. --
  63. --
  64. --
  65. -------------------------------------------------------------------------------
  66. architecture sim of tb_mc8051_siu is
  67.   signal clk     : std_logic;     --< system clock
  68.   signal reset   : std_logic;     --< system reset
  69.   signal s_tf    : std_logic;     --< timer1 overflow flag
  70.   signal s_trans : std_logic;     --< 1 activates transm.
  71.   signal s_rxd   : std_logic;     --< serial data input
  72.   signal s_scon  : std_logic_vector(5 downto 0);  --< from SFR register
  73.      --< bits 7 to 3
  74.   signal s_sbuf  : std_logic_vector(7 downto 0);  --< data for transm.
  75.   signal s_smod  : std_logic;     --< low(0)/high baudrate
  76.   signal s_sbuf_out : std_logic_vector(7 downto 0);  --< received data 
  77.   signal s_scon_out : std_logic_vector(2 downto 0);  --< to SFR register 
  78.         --< bits 0 to 2
  79.   signal s_rxd_out  : std_logic;        --< mode0 data output
  80.   signal s_txd_out  : std_logic;        --< serial data output
  81.       
  82.   signal clk_p     : std_logic;       --< system clock
  83.   signal s_tf_p    : std_logic;       --< timer1 overflow flag
  84.   signal s_trans_p : std_logic;       --< 1 activates transm.
  85.   signal s_rxd_p   : std_logic;       --< serial data input
  86.   signal s_rxd0_p  : std_logic;       --< serial data input
  87.   signal s_rxd1_p  : std_logic;       --< serial data input
  88.   signal s_rxd2_p  : std_logic;       --< serial data input
  89.   signal s_rxd3_p  : std_logic;       --< serial data input
  90.   signal s_scon_p  : std_logic_vector(5 downto 0);  --< from SFR register
  91.        --< bits 7 to 3
  92.   signal s_sbuf_p  : std_logic_vector(7 downto 0);  --< data for transm.
  93.   signal s_smod_p  : std_logic;       --< low(0)/high baudrate
  94.   signal s_sbuf_out_p : std_logic_vector(7 downto 0);  --< received data 
  95.   signal s_scon_out_p : std_logic_vector(2 downto 0);  --< to SFR register 
  96.           --< bits 0 to 2
  97.   signal s_rxdwr      : std_logic;                     --< rxd direction signal
  98.   signal s_rxdwr_p    : std_logic;                     --< rxd direction signal
  99.   signal s_rxd_out_p  : std_logic;          --< mode0 data output
  100.   signal s_txd_out_p  : std_logic;          --< serial data output
  101.     
  102.   signal s_serialdata     : std_logic;
  103.   
  104. begin
  105.   s_serialdata <= s_txd_out when s_scon(4 downto 3) /= "00" else s_rxd_out;
  106.   
  107.   i_mc8051_siu_active : mc8051_siu
  108.     port map (clk     => clk,
  109.               reset   => reset,
  110.               tf_i    => s_tf,
  111.               trans_i => s_trans,
  112.               rxd_i   => s_rxd,
  113.               scon_i  => s_scon,
  114.               sbuf_i  => s_sbuf,
  115.               smod_i  => s_smod,
  116.               sbuf_o  => s_sbuf_out,
  117.               scon_o  => s_scon_out,
  118.               rxdwr_o => s_rxdwr,
  119.               rxd_o   => s_rxd_out,
  120.               txd_o   => s_txd_out);
  121.   
  122.   i_mc8051_siu_passive : mc8051_siu
  123.     port map (clk     => clk_p,
  124.               reset   => reset,
  125.               tf_i    => s_tf_p,
  126.               trans_i => s_trans_p,
  127.               rxd_i   => s_serialdata,
  128.               scon_i  => s_scon_p,
  129.               sbuf_i  => s_sbuf_p,
  130.               smod_i  => s_smod_p,
  131.               sbuf_o  => s_sbuf_out_p,
  132.               scon_o  => s_scon_out_p,
  133.               rxdwr_o => s_rxdwr_p,
  134.               rxd_o   => s_rxd_out_p,
  135.               txd_o   => s_txd_out_p);
  136. -------------------------------------------------------------------------------
  137. -- Perform simple selfchecking test for the four operating modes.
  138. -------------------------------------------------------------------------------
  139.     p_run : process
  140.     begin
  141.       -------------------------------------------------------------------------
  142.       -- set start values and perform reset
  143.       -------------------------------------------------------------------------
  144.       s_rxd <=  '0';
  145.       s_smod  <= '0';
  146.       s_trans <= '0';
  147.       s_sbuf  <= conv_std_logic_vector(0, 8);
  148.       s_scon  <= conv_std_logic_vector(0, 6);
  149.       s_smod_p  <= '0';
  150.       s_trans_p <= '0';
  151.       s_sbuf_p  <= conv_std_logic_vector(0, 8);
  152.       s_scon_p  <= conv_std_logic_vector(0, 6);
  153.       reset   <= '1';
  154.       wait for one_period + one_period/2 + 5 ns;
  155.       reset   <= '0';
  156.       wait for one_period * 4;
  157.       -------------------------------------------------------------------------
  158.       -- Testing MODE 0
  159.       -------------------------------------------------------------------------
  160.       s_scon <= conv_std_logic_vector(0, 6);     -- 000000
  161.       s_sbuf  <= conv_std_logic_vector(170, 8);  -- 10101010
  162.       s_scon_p <= conv_std_logic_vector(2, 6);   -- 000010
  163.       s_sbuf_p <= conv_std_logic_vector(170, 8); -- 10101010
  164.       s_trans <= '1';    -- start transmission
  165.       wait for one_period * 1;
  166.       s_trans <= '0';
  167.       wait until s_scon_out_p(0) = '1';
  168.       s_scon_p <= conv_std_logic_vector(0, 6);   -- 000000
  169.       assert s_sbuf_out_p = "10101010"
  170. report "FALSE DATA RECEIVED IN MODE 0! DATA SENT: AAh"
  171. severity failure;
  172.       wait for one_period * 600;
  173.       s_scon  <= conv_std_logic_vector(0, 6);    -- 000000
  174.       s_sbuf  <= conv_std_logic_vector(85, 8);   -- 01010101
  175.       s_scon_p <= conv_std_logic_vector(2, 6);   -- 000010
  176.       s_sbuf_p <= conv_std_logic_vector(16#55#, 8);  -- 01010101
  177.       s_trans <= '1';    -- start transmission
  178.       wait for one_period * 1;
  179.       s_trans <= '0';
  180.       wait until s_scon_out_p(0) = '1';
  181.       s_scon_p <= conv_std_logic_vector(0, 6);   -- 000000
  182.       assert s_sbuf_out_p = "01010101"
  183. report "FALSE DATA RECEIVED IN MODE 0! DATA SENT: 55h"
  184. severity failure;
  185.       wait for one_period * 600;
  186.       -------------------------------------------------------------------------
  187.       -- Testing MODE 1
  188.       -------------------------------------------------------------------------
  189.       s_smod <= '1';
  190.       s_scon  <= conv_std_logic_vector(48, 6);   -- 110000  MODE 1 + RI=1
  191.       s_sbuf  <= conv_std_logic_vector(170, 8);  -- 10101010
  192.       s_smod_p <= '1';
  193.       s_scon_p <= conv_std_logic_vector(18, 6);  -- 010010  MODE 1 + RI=0
  194.       s_sbuf_p <= conv_std_logic_vector(170, 8); -- 10101010
  195.       s_trans <= '1';    -- start transmission
  196.       wait for one_period * 1;
  197.       s_trans <= '0';
  198.       wait until s_scon_out_p(0) = '1';
  199.       assert s_sbuf_out_p = "10101010"
  200. report "FALSE DATA RECEIVED IN MODE 1! DATA SENT: AAh"
  201. severity failure;
  202.       wait for one_period * 600;
  203.       s_sbuf  <= conv_std_logic_vector(85, 8);   -- 01010101
  204.       s_trans <= '1';    -- start transmission
  205.       wait for one_period * 1;
  206.       s_trans <= '0';
  207.       wait until s_scon_out_p(0) = '1';
  208.       assert s_sbuf_out_p = "01010101"
  209. report "FALSE DATA RECEIVED IN MODE 1! DATA SENT: 55h"
  210. severity failure;
  211.       wait for one_period * 600;
  212.       -------------------------------------------------------------------------
  213.       -- Testing MODE 2
  214.       -------------------------------------------------------------------------
  215.       s_smod <= '1';
  216.       s_scon  <= conv_std_logic_vector(8, 6);    -- 001000  MODE 2
  217.       s_sbuf  <= conv_std_logic_vector(171, 8);  -- 10101011
  218.       s_smod_p <= '1';
  219.       s_scon_p <= conv_std_logic_vector(10, 6);  -- 001010  MODE 2 + REN=1
  220.       s_sbuf_p <= conv_std_logic_vector(171, 8); -- 10101011
  221.       s_trans <= '1';    -- start transmission
  222.       wait for one_period * 1;
  223.       s_trans <= '0';
  224.       wait until s_scon_out_p(0) = '1';
  225.       assert s_sbuf_out_p = "10101011"
  226. report "FALSE DATA RECEIVED IN MODE 2! DATA SENT: ABh"
  227. severity failure;
  228.       wait for one_period * 400;
  229.       s_sbuf  <= conv_std_logic_vector(86, 8);   -- 01010110
  230.       s_trans <= '1';    -- start transmission
  231.       wait for one_period * 1;
  232.       s_trans <= '0';
  233.       wait until s_scon_out_p(0) = '1';
  234.       assert s_sbuf_out_p = "01010110"
  235. report "FALSE DATA RECEIVED IN MODE 2! DATA SENT: 56h"
  236. severity failure;
  237.       wait for one_period * 400;
  238.       -------------------------------------------------------------------------
  239.       -- Testing MODE 3
  240.       -------------------------------------------------------------------------
  241.       s_scon <= conv_std_logic_vector(16#78#, 6);   -- 111000  MODE 3 + RI=1
  242.       s_sbuf  <= conv_std_logic_vector(16#BE#, 8);  -- 10111110
  243.       s_scon_p <= conv_std_logic_vector(16#1A#, 6); -- 011010  MODE 3 + REN=1
  244.       s_trans <= '1';       -- start transmission
  245.       wait for one_period * 1;
  246.       s_trans <= '0';
  247.       wait until s_scon_out_p(0) = '1';
  248.       assert s_sbuf_out_p = "10111110"
  249. report "FALSE DATA RECEIVED IN MODE 3! DATA SENT: BEh"
  250. severity failure;
  251.       wait for one_period * 4000;
  252.       s_sbuf  <= conv_std_logic_vector(16#55#, 8);  -- 01010101
  253.       s_smod  <= '0';
  254.       s_smod_p <= '0';
  255.       s_trans <= '1';       -- start transmission
  256.       wait for one_period * 1;
  257.       s_trans <= '0';
  258.       wait until s_scon_out_p(0) = '1';
  259.       assert s_sbuf_out_p = "01010101"
  260. report "FALSE DATA RECEIVED IN MODE 3! DATA SENT: 55h"
  261. severity failure;
  262.       wait for one_period * 4000;
  263.       s_smod  <= '1';
  264.       s_scon  <= conv_std_logic_vector(26, 6);   -- 011010 start reception
  265.       wait for one_period * 7560;
  266.       -------------------------------------------------------------------------
  267.       -- END of test 
  268.       -------------------------------------------------------------------------
  269.       wait for one_period * 10;
  270.       assert false report "SIMULATION ENDED WITHOUT ERROR!!" severity failure;
  271.     end process p_run;
  272. -------------------------------------------------------------------------------
  273. -------------------------------------------------------------------------------
  274. -- System clock definition
  275. -------------------------------------------------------------------------------
  276.       clk_p <= clk after 37 ns;
  277.       p_clock : process
  278.         variable v_loop1 : integer;
  279.       begin
  280.         clk <= '0';
  281.         wait for one_period / 2;
  282.         while true loop
  283.           clk <= not clk;
  284.           wait for one_period / 2;
  285.         end loop;
  286.       end process p_clock;
  287. -------------------------------------------------------------------------------
  288. -------------------------------------------------------------------------------
  289. -- Generate timer1 overflow flag
  290. -------------------------------------------------------------------------------
  291.     s_tf_p <= s_tf after 200 ns;
  292.     p_tf : process
  293.       variable v_loop1 : integer;
  294.     begin
  295.       s_tf <= '0';
  296.       wait for one_period + one_period / 2 + 5 ns;
  297.       if s_scon(4 downto 3) = conv_std_logic_vector(2, 2) then  -- Mode 1
  298.         while true loop
  299.           s_tf <= not s_tf;
  300.           wait for one_period * 20;
  301.         end loop;
  302.       else
  303.         s_tf <= '0';
  304.       end if;
  305.     end process p_tf;
  306. -------------------------------------------------------------------------------
  307. end sim;