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

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:                 Helmut Mayrhofer
  49. --
  50. --         Filename:               control_mem_rtl.vhd
  51. --
  52. --         Date of Creation:       Mon Aug  9 12:14:48 1999
  53. --
  54. --         Version:                $Revision: 1.7 $
  55. --
  56. --         Date of Latest Version: $Date: 2002/01/07 12:17:44 $
  57. --
  58. --
  59. --         Description: Describe all sequential funcitonality like read from
  60. --                      special function registers, observe interrupt sources,
  61. --                      write to special function registers, and read or write
  62. --                      to the bit addressable memory area.
  63. --
  64. --
  65. --
  66. --
  67. -------------------------------------------------------------------------------
  68. architecture rtl of control_mem is  
  69.  
  70.    type    t_gprbit is array (15 downto 0) of unsigned(7 downto 0); 
  71.    subtype muxint is integer range C_IMPL_N_TMR-1 downto 0;
  72.    signal s_help:        unsigned (7 downto 0);   -- general help-register 
  73.    signal s_help16:      unsigned (15 downto 0);  -- 16 bit help-register
  74.    signal s_helpb :      std_logic;               -- general help-bit 
  75.    signal s_ir:          unsigned (7 downto 0);   -- reg for saving the command
  76.    signal gprbit:        t_gprbit;         -- bitadressable general purpose RAM
  77.    signal s_r0_b0:  unsigned (7 downto 0);   -- Register R0 / Bank 0
  78.    signal s_r1_b0:  unsigned (7 downto 0);   -- Register R1 / Bank 0
  79.    signal s_r0_b1:  unsigned (7 downto 0);   -- Register R0 / Bank 1
  80.    signal s_r1_b1:  unsigned (7 downto 0);   -- Register R1 / Bank 1
  81.    signal s_r0_b2:  unsigned (7 downto 0);   -- Register R0 / Bank 2
  82.    signal s_r1_b2:  unsigned (7 downto 0);   -- Register R1 / Bank 2
  83.    signal s_r0_b3:  unsigned (7 downto 0);   -- Register R0 / Bank 3
  84.    signal s_r1_b3:  unsigned (7 downto 0);   -- Register R1 / Bank 3
  85.    signal s_reg_data:    unsigned (7 downto 0);   -- equals reg_data_o 
  86.    Signal state:         t_state;                 -- actual state 
  87.    signal s_command:     std_logic_vector (7 downto 0); 
  88.    signal s_pc_inc_en  : std_logic_vector (3 downto 0); 
  89.    signal s_regs_wr_en : std_logic_vector (2 downto 0); 
  90.    signal s_data_mux   : std_logic_vector (3 downto 0);
  91.    signal s_bdata_mux  : std_logic_vector (3 downto 0);
  92.    signal s_adr_mux    : std_logic_vector (3 downto 0);
  93.    signal s_adrx_mux   : std_logic_vector (1 downto 0);
  94.    signal s_help_en    : std_logic_vector (3 downto 0);
  95.    signal s_help16_en  : std_logic_vector (1 downto 0);
  96.    signal s_helpb_en   : std_logic;
  97.    signal s_intpre2_d : std_logic;
  98.    signal s_intpre2_en: std_logic;
  99.    signal s_intlow_d  : std_logic;
  100.    signal s_intlow_en : std_logic;
  101.    signal s_inthigh_d : std_logic;
  102.    signal s_inthigh_en: std_logic;
  103.    signal s_nextstate : t_state;              -- enable signal for state
  104.    signal s_bit_data :   std_logic; 
  105.    signal s_intpre:      std_logic;           -- an interrupt must start 
  106.    signal s_intpre2:     std_logic;           -- prepare for interrupt 
  107.    signal s_inthigh:     std_logic;           -- high priority int is running 
  108.    signal s_intlow:      std_logic;           -- low priority int is running 
  109.    signal s_int0_edge :  t_ext_l; 
  110.    signal s_int1_edge :  t_ext_l; 
  111.    signal s_tf0_edge :   t_tmr_l; 
  112.    signal s_tf1_edge :   t_tmr_l; 
  113.    signal s_ri_edge  :   t_siu_l; 
  114.    signal s_ti_edge  :   t_siu_l;
  115.    signal s_smodreg  :   t_siu_l;
  116.    signal s_tl0      :   t_tmr_us;
  117.    signal s_tl1      :   t_tmr_us;
  118.    signal s_th0      :   t_tmr_us;
  119.    signal s_th1      :   t_tmr_us;
  120.    signal s_sbufi    :   t_siu_us;
  121.    signal s_reload   :   t_tmr_us;
  122.    signal s_wt       :   t_tmr_us2;
  123.    
  124.    signal s_tf1 :        std_logic;
  125.    signal s_tf0 :        std_logic;
  126.    signal s_ie1 :        std_logic;
  127.    signal s_it1 :        std_logic;
  128.    signal s_ie0 :        std_logic;
  129.    signal s_it0 :        std_logic;   
  130.    
  131.    signal s_ri : std_logic;
  132.    signal s_ti : std_logic;
  133.    signal s_rb8 : std_logic;
  134.    signal s_tb8 : std_logic;
  135.    signal s_ren : std_logic;
  136.    signal s_sm2 : std_logic;
  137.    signal s_sm1 : std_logic;
  138.    signal s_sm0 : std_logic;
  139.    signal s_smod : std_logic;
  140.  
  141.    signal s_int0_h1 : t_ext_l;          -- help-bit for edge detection
  142.    signal s_int0_h2 : t_ext_l; 
  143.    signal s_int0_h3 : t_ext_l; 
  144.    signal s_int1_h1 : t_ext_l;
  145.    signal s_int1_h2 : t_ext_l; 
  146.    signal s_int1_h3 : t_ext_l; 
  147.    signal s_tf0_h1,s_tf0_h2 :         t_tmr_l; 
  148.    signal s_tf1_h1,s_tf1_h2 :         t_tmr_l; 
  149.    signal s_ri_h1,s_ri_h2 :           t_siu_l; 
  150.    signal s_ti_h1,s_ti_h2 :           t_siu_l; 
  151.  
  152.    signal s_tsel : muxint;
  153.    signal s_ssel : muxint;
  154.  
  155.    signal s_p :          std_logic; 
  156.    
  157.    signal s_p0 :         std_logic_vector(7 downto 0);
  158.    signal s_p1 :         std_logic_vector(7 downto 0);
  159.    signal s_p2 :         std_logic_vector(7 downto 0);
  160.    signal s_p3 :         std_logic_vector(7 downto 0);
  161.       
  162.    signal pc:            unsigned(15 downto 0);   -- program counter register
  163.    signal pc_comb:       unsigned(15 downto 0);   -- program counter
  164.    signal pc_plus1:      unsigned(15 downto 0);   -- program counter + 1
  165.    signal pc_plus2:      unsigned(15 downto 0);   -- program counter + 2
  166.    signal s_data    : unsigned(7 downto 0); 
  167.    signal s_adr     : unsigned(7 downto 0); 
  168.    signal s_preadr  : unsigned(7 downto 0); 
  169.    signal s_bdata   : std_logic; 
  170.    signal s_rr_adr  : unsigned (7 downto 0);
  171.    signal s_ri_adr  : std_logic_vector (7 downto 0);
  172.    signal s_ri_data : unsigned (7 downto 0);
  173.  
  174.   
  175.  -- 8051 standard special-function-register (SFR)
  176.  
  177.    signal p0:           unsigned(7 downto 0); 
  178.    signal sp:           unsigned(7 downto 0); 
  179.    signal dpl:          unsigned(7 downto 0); 
  180.    signal dph:          unsigned(7 downto 0); 
  181.    signal pcon:         unsigned(3 downto 0); 
  182.    signal tcon:         t_tmr_lv;
  183.    signal tmod:         t_tmr_us;
  184.    signal p1:           unsigned(7 downto 0); 
  185.    signal scon:         t_siu_lv; 
  186.    signal sbuf:         t_siu_us; 
  187.    signal p2:           unsigned(7 downto 0); 
  188.    signal ie:           std_logic_vector(7 downto 0); 
  189.    signal p3:           unsigned(7 downto 0); 
  190.    signal ip:           std_logic_vector(7 downto 0); 
  191.    signal psw:          std_logic_vector(7 downto 0); 
  192.    signal acc:          unsigned(7 downto 0); 
  193.    signal b:            unsigned(7 downto 0); 
  194.  
  195.  -- 8051 extended special-function-register
  196.  
  197.    signal tsel:         unsigned(7 downto 0);          -- select a Timer-Unit 
  198.    signal ssel:         unsigned(7 downto 0);          -- select a SIU-Unit 
  199.    alias CY : std_logic is psw(7); 
  200.    alias AC : std_logic is psw(6); 
  201.    alias OV : std_logic is psw(2); 
  202.    alias EA:  std_logic is ie(7); 
  203.    alias ES:  std_logic is ie(4); 
  204.    alias ET1: std_logic is ie(3); 
  205.    alias EX1: std_logic is ie(2); 
  206.    alias ET0: std_logic is ie(1); 
  207.    alias EX0: std_logic is ie(0); 
  208.    alias PS0: std_logic is ip(4); 
  209.    alias PT1: std_logic is ip(3); 
  210.    alias PX1: std_logic is ip(2); 
  211.    alias PT0: std_logic is ip(1); 
  212.    alias PX0: std_logic is ip(0); 
  213. begin 
  214.   -- some simple assignments 
  215.  
  216.   pc_o <= std_logic_vector(pc_comb);
  217.   pc_plus1 <= pc + conv_unsigned(1,1);
  218.   pc_plus2 <= pc + conv_unsigned(2,2);
  219.   ram_adr_o <= std_logic_vector(s_adr(6 downto 0)); 
  220.   reg_data_o <= std_logic_vector(s_reg_data); 
  221.   ram_data_o <= std_logic_vector(s_data);
  222.   acc_o <= std_logic_vector(acc); 
  223.   cy_o(1) <= cy; 
  224.   ov_o <= ov; 
  225.   cy_o(0) <= ac; 
  226.   
  227.   ie_o <= ie;
  228.   ip_o <= ip;
  229.   psw_o <= psw;
  230.   state_o <= state;
  231.   command_o <= s_command;
  232.   ri_o <= s_ri;
  233.   ti_o <= s_ti;
  234.   help_o <= std_logic_vector(s_help);
  235.   bit_data_o <= s_bit_data;
  236.   intpre_o <= s_intpre;
  237.   intpre2_o <= s_intpre2;
  238.   inthigh_o <= s_inthigh;
  239.   intlow_o <= s_intlow;
  240.   tf1_o <= s_tf1;
  241.   tf0_o <= s_tf0;
  242.   ie1_o <= s_ie1;
  243.   it1_o <= s_it1;
  244.   ie0_o <= s_ie0;
  245.   it0_o <= s_it0;
  246.   s_pc_inc_en <= pc_inc_en_i;   
  247.   s_nextstate <= nextstate_i;    
  248.   s_adr_mux <= adr_mux_i;     
  249.   s_adrx_mux <= adrx_mux_i;     
  250.   s_data_mux <= data_mux_i;    
  251.   s_bdata_mux <= bdata_mux_i;   
  252.   s_regs_wr_en <= regs_wr_en_i;  
  253.   s_help_en <= help_en_i;     
  254.   s_help16_en <= help16_en_i;   
  255.   s_helpb_en <= helpb_en_i;    
  256.   s_inthigh_en <= inthigh_en_i;  
  257.   s_intlow_en <=  intlow_en_i;   
  258.   s_intpre2_en <= intpre2_en_i;  
  259.   s_inthigh_d <=  inthigh_d_i;   
  260.   s_intlow_d <=   intlow_d_i;    
  261.   s_intpre2_d <=  intpre2_d_i;   
  262.   s_tsel <= conv_integer(tsel) when tsel < C_IMPL_N_TMR
  263.          else conv_integer(0);      -- selected timer unit is (not) implemented
  264.   s_ssel <= conv_integer(ssel) when ssel < C_IMPL_N_SIU
  265.          else conv_integer(0);      -- selected siu unit is (not) implemented  
  266.   
  267.   for_tmr:
  268.   for i in 0 to C_IMPL_N_TMR-1 generate
  269.     all_tcon_tr0_o(i) <= tcon(i)(4); 
  270.     all_tcon_tr1_o(i) <= tcon(i)(6);   
  271.     all_tmod_o((i*8)+7 downto i*8) <= std_logic_vector(tmod(i)); 
  272.     s_tl0(i) <= unsigned(all_tl0_i((i*8)+7 downto i*8));
  273.     s_tl1(i) <= unsigned(all_tl1_i((i*8)+7 downto i*8));
  274.     s_th0(i) <= unsigned(all_th0_i((i*8)+7 downto i*8));
  275.     s_th1(i) <= unsigned(all_th1_i((i*8)+7 downto i*8));
  276.     all_reload_o((i*8)+7 downto i*8) <= std_logic_vector(s_reload(i));
  277.     all_wt_o((i*2)+1 downto i*2) <= std_logic_vector(s_wt(i));
  278.   end generate for_tmr;
  279.   s_tf1 <= tcon(s_tsel)(7);
  280.   s_tf0 <= tcon(s_tsel)(5);
  281.   s_ie1 <= tcon(s_tsel)(3);
  282.   s_it1 <= tcon(s_tsel)(2);
  283.   s_ie0 <= tcon(s_tsel)(1);
  284.   s_it0 <= tcon(s_tsel)(0);
  285.   
  286.   for_siu:
  287.   for i in 0 to C_IMPL_N_SIU-1 generate
  288.     all_scon_o((6*i)+5) <= scon(i)(0);          -- RI
  289.     all_scon_o((6*i)+4) <= scon(i)(7);          -- SM0
  290.     all_scon_o((6*i)+3) <= scon(i)(6);          -- SM1
  291.     all_scon_o((6*i)+2) <= scon(i)(5);          -- SM2
  292.     all_scon_o((6*i)+1) <= scon(i)(4);          -- REN
  293.     all_scon_o(6*i) <= scon(i)(3);              -- TB8
  294.     all_smod_o(i) <= s_smodreg(i);              -- SMOD
  295.     all_sbuf_o((8*i)+7 downto 8*i) <= std_logic_vector(sbuf(i)); 
  296.     s_sbufi(i) <= unsigned(all_sbuf_i((i*8)+7 downto i*8));
  297.   end generate for_siu;
  298.   s_sm0 <= scon(s_ssel)(7);
  299.   s_sm1 <= scon(s_ssel)(6);
  300.   s_sm2 <= scon(s_ssel)(5);
  301.   s_ren <= scon(s_ssel)(4);
  302.   s_tb8 <= scon(s_ssel)(3);
  303.   s_rb8 <= all_scon_i((s_ssel*3)+2);
  304.   s_ti  <= scon(s_ssel)(1);
  305.   s_ri  <= scon(s_ssel)(0);
  306.   s_smod<= s_smodreg(s_ssel);
  307.      
  308.   p0_o <= std_logic_vector(p0); 
  309.   p1_o <= std_logic_vector(p1); 
  310.   p2_o <= std_logic_vector(p2); 
  311.   p3_o <= std_logic_vector(p3);
  312.  
  313.   s_p <= acc(7) xor acc(6) xor acc(5) xor acc(4) xor 
  314.          acc(3) xor acc(2) xor acc(1) xor acc(0); 
  315.                                     -- P should be set, if the count 
  316.                                     -- of 1 in the acc is even   
  317.  
  318.   s_command <= rom_data_i when state=FETCH 
  319.          else conv_std_logic_vector(s_ir,8); 
  320.   s_rr_adr <= unsigned((psw and "00011000") or (rom_data_i  
  321.               and "00000111"));     -- calculate registerdirect-adress
  322.              
  323.   s_ri_adr <= ((psw and "00011000") or (s_command(7 downto 0) and "00000001"));
  324.         
  325.   datax_o <= std_logic_vector(acc);
  326.   wrx_o <= wrx_mux_i;  
  327.       
  328. ------------------------------------------------------------------------------ 
  329. -- purpose: process to read SFR, bitadressable or normal RAM
  330. -- inputs:  s_adr,s_preadr,sp,dpl,dph,pcon,tcon,tmod,all_tl0_i,
  331. --          all_tl1_i,all_th0_i,all_th1_i,s_p0,s_p1,all_scon_i,all_sbuf_i,
  332. --          s_p2,ie,s_p3,ip,psw,acc,b,gprbit,ram_data_i
  333. -- outputs: s_reg_data, s_bit_data
  334. ------------------------------------------------------------------------------ 
  335.  
  336.   p_readram : process (s_preadr,s_p0,sp,dpl,dph,pcon,tcon,tmod,s_p1,scon,s_p2,
  337.                        ie,s_p3,ip,psw,acc,b,gprbit,ram_data_i,s_r0_b0,s_r1_b0,
  338.                        s_r0_b1,s_r1_b1,s_r0_b2,s_r1_b2,s_r0_b3,s_r1_b3,
  339.                        s_smod,s_sm0,s_sm1,s_sm2,s_ren,s_tb8,s_rb8,s_ti,s_ri,
  340.                        s_sbufi,s_th1,s_th0,s_ssel,s_tsel,s_tl1,s_tl0,
  341.        ssel,tsel) 
  342.   begin  
  343.     if s_preadr(7)='1' then 
  344.       case conv_integer(s_preadr) is         -- read one byte of a SFR  
  345.             when 16#80# => s_reg_data <= unsigned(s_p0);  
  346.             when 16#81# => s_reg_data <= sp; 
  347.             when 16#82# => s_reg_data <= dpl; 
  348.             when 16#83# => s_reg_data <= dph; 
  349.             when 16#87# => 
  350.               s_reg_data(7) <= s_smod;
  351.               s_reg_data(6 downto 4) <= "000";
  352.               s_reg_data(3 downto 0) <= pcon;
  353.             when 16#88# => s_reg_data <= unsigned(tcon(s_tsel));
  354.             when 16#89# => s_reg_data <= unsigned(tmod(s_tsel));
  355.             when 16#8A# => s_reg_data <= s_tl0(s_tsel);
  356.             when 16#8B# => s_reg_data <= s_tl1(s_tsel);
  357.             when 16#8C# => s_reg_data <= s_th0(s_tsel);
  358.             when 16#8D# => s_reg_data <= s_th1(s_tsel);
  359.             when 16#8E# => s_reg_data <= tsel;             
  360.             when 16#90# => s_reg_data <= unsigned(s_p1); 
  361.             when 16#98# => 
  362.               s_reg_data(0) <= s_ri;    -- from SCON register 
  363.               s_reg_data(1) <= s_ti;    -- from SCON register                
  364.               s_reg_data(2) <= s_rb8;   -- read extern input!!! 
  365.               s_reg_data(3) <= s_tb8;   
  366.               s_reg_data(4) <= s_ren;   
  367.               s_reg_data(5) <= s_sm2;   
  368.               s_reg_data(6) <= s_sm1;   
  369.               s_reg_data(7) <= s_sm0;   
  370.             when 16#99# => s_reg_data <= s_sbufi(s_ssel);
  371.             when 16#9A# => s_reg_data <= ssel; 
  372.             when 16#A0# => s_reg_data <= unsigned(s_p2); 
  373.             when 16#A8# => s_reg_data <= unsigned(ie);
  374.             when 16#B0# => s_reg_data <= unsigned(s_p3); 
  375.             when 16#B8# => s_reg_data <= unsigned(ip);
  376.             when 16#D0# => s_reg_data <= unsigned(psw);
  377.             when 16#E0# => s_reg_data <= acc; 
  378.             when 16#F0# => s_reg_data <= b;     
  379.             when others => s_reg_data <= conv_unsigned(0,8); 
  380.           end case; 
  381.                                  -- read one byte to bitadressable GPR 
  382.     elsif conv_std_logic_vector(s_preadr(7 downto 4),4)="0010" then   
  383.             s_reg_data <= gprbit(conv_integer(s_preadr(3 downto 0)));  
  384.              
  385.     elsif conv_std_logic_vector(s_preadr,8)="00000000" then
  386.             s_reg_data <= s_r0_b0;     -- read R0 / Bank 0
  387.     elsif conv_std_logic_vector(s_preadr,8)="00000001" then
  388.             s_reg_data <= s_r1_b0;     -- read R1 / Bank 0
  389.     elsif conv_std_logic_vector(s_preadr,8)="00001000" then
  390.             s_reg_data <= s_r0_b1;     -- read R0 / Bank 1
  391.     elsif conv_std_logic_vector(s_preadr,8)="00001001" then
  392.             s_reg_data <= s_r1_b1;     -- read R1 / Bank 1
  393.     elsif conv_std_logic_vector(s_preadr,8)="00010000" then
  394.             s_reg_data <= s_r0_b2;     -- read R0 / Bank 2
  395.     elsif conv_std_logic_vector(s_preadr,8)="00010001" then
  396.             s_reg_data <= s_r1_b2;     -- read R1 / Bank 2
  397.     elsif conv_std_logic_vector(s_preadr,8)="00011000" then
  398.             s_reg_data <= s_r0_b3;     -- read R0 / Bank 3
  399.     elsif conv_std_logic_vector(s_preadr,8)="00011001" then
  400.             s_reg_data <= s_r1_b3;     -- read R1 / Bank 3
  401.      
  402.     else                               -- read on general purpose RAM 
  403.             s_reg_data <= unsigned(ram_data_i); 
  404.     end if; 
  405.     if s_preadr(7)='1' then 
  406.       case s_preadr(6 downto 3) is    -- read only one bit from a SFR 
  407.         when "0000" => s_bit_data <= s_p0(conv_integer(s_preadr(2 downto 0))); 
  408.         when "0001" => 
  409.           s_bit_data <= tcon(s_tsel)(conv_integer(s_preadr(2 downto 0))); 
  410.         when "0010" => s_bit_data <= s_p1(conv_integer(s_preadr(2 downto 0))); 
  411.         when "0011" => 
  412.           if conv_integer(s_preadr(2 downto 0))=2 then 
  413.             s_bit_data <= s_rb8; 
  414.           else 
  415.             s_bit_data <= scon(s_ssel)(conv_integer(s_preadr(2 downto 0))); 
  416.           end if; 
  417.         when "0100" => s_bit_data <= s_p2(conv_integer(s_preadr(2 downto 0))); 
  418.         when "0101" => s_bit_data <= ie(conv_integer(s_preadr(2 downto 0))); 
  419.         when "0110" => s_bit_data <= s_p3(conv_integer(s_preadr(2 downto 0))); 
  420.         when "0111" => s_bit_data <= ip(conv_integer(s_preadr(2 downto 0))); 
  421.         when "1010" => s_bit_data <= psw(conv_integer(s_preadr(2 downto 0))); 
  422.         when "1100" => s_bit_data <= acc(conv_integer(s_preadr(2 downto 0))); 
  423.         when "1110" => s_bit_data <= b(conv_integer(s_preadr(2 downto 0))); 
  424.         when others => s_bit_data <= '0'; 
  425.       end case; 
  426.     else                               -- read one bit from bitadressable GP 
  427.             s_bit_data <= gprbit(conv_integer(s_preadr(6 downto 3))) 
  428.                           (conv_integer(s_preadr(2 downto 0)));  
  429.     end if;           
  430.   end process p_readram; 
  431. ------------------------------------------------------------------------------ 
  432. -- detect the rising/falling edge of interupt-sources
  433. ------------------------------------------------------------------------------ 
  434. for_intext_edge:
  435.   for i in 0 to C_IMPL_N_EXT-1 generate
  436.     -- falling edge of int0_i
  437.     s_int0_edge(i) <= not s_int0_h2(i) and s_int0_h3(i);
  438.     -- falling edge of int1_i
  439.     s_int1_edge(i) <= not s_int1_h2(i) and s_int1_h3(i);
  440.   end generate for_intext_edge;
  441.     
  442. for_tf_edge:       
  443.   for i in 0 to C_IMPL_N_TMR-1 generate
  444.     -- on rising edge of tf0_i
  445.     s_tf0_edge(i) <= s_tf0_h1(i) and not s_tf0_h2(i);
  446.     -- on rising edge of tf1_i
  447.     s_tf1_edge(i) <= s_tf1_h1(i) and not s_tf1_h2(i);
  448.   end generate for_tf_edge;
  449.     
  450. for_siu_edge:       
  451.   for i in 0 to C_IMPL_N_SIU-1 generate
  452.     -- on rising edge of RI
  453.     s_ri_edge(i) <= s_ri_h1(i) and not s_ri_h2(i);
  454.     -- on rising edge of TI
  455.     s_ti_edge(i) <= s_ti_h1(i) and not s_ti_h2(i);
  456.   end generate for_siu_edge;   
  457.  
  458. ------------------------------------------------------------------------------ 
  459. -- purpose: write some help-regs for detecting the falling/rising edge
  460. --          of interupt-sources
  461. -- inputs:  clk,reset,int0_i,int1_i,all_tf0_i,all_tf1_i,all_scon_i,
  462. --          s_tf0_h1,s_tf1_h1,s_ri_h1,s_ti_h1 
  463. -- outputs: s_int0_h1,s_int0_h2,s_int0_h3,s_int1_h1,s_int1_h2,s_int1_h3,
  464. --          s_tf0_h1,s_tf0_h2
  465. --          s_tf1_h1,s_tf1_h2,s_ri_h1,s_ri_h2,s_ti_h1,s_ti_h2
  466. ------------------------------------------------------------------------------ 
  467.     
  468.   iep: process (clk,reset) 
  469.  
  470.   begin  -- process iep 
  471.     
  472.     -- activities triggered by asynchronous reset 
  473.     if reset = '1' then 
  474.       s_int0_h1 <= (others => '1'); 
  475.       s_int0_h2 <= (others => '1'); 
  476.       s_int0_h3 <= (others => '1'); 
  477.       s_int1_h1 <= (others => '1'); 
  478.       s_int1_h2 <= (others => '1'); 
  479.       s_int1_h3 <= (others => '1'); 
  480.       s_tf0_h1 <= (others => '0'); 
  481.       s_tf0_h2 <= (others => '0'); 
  482.       s_tf1_h1 <= (others => '0'); 
  483.       s_tf1_h2 <= (others => '0'); 
  484.       s_ri_h1 <= (others => '0'); 
  485.       s_ri_h2 <= (others => '0'); 
  486.       s_ti_h1 <= (others => '0'); 
  487.       s_ti_h2 <= (others => '0'); 
  488.     -- activities triggered by rising edge of clock 
  489.     elsif clk'event and clk = '1' then 
  490.       for i in 0 to C_IMPL_N_EXT-1 loop
  491.         s_int0_h1(i) <= int0_i(i);              -- external INT0 
  492.         s_int0_h2(i) <= s_int0_h1(i); 
  493.         s_int0_h3(i) <= s_int0_h2(i); 
  494.         s_int1_h1(i) <= int1_i(i);              -- external INT1 
  495.         s_int1_h2(i) <= s_int1_h1(i);
  496.         s_int1_h3(i) <= s_int1_h2(i);
  497.       end loop; 
  498.       for i in 0 to C_IMPL_N_TMR-1 loop
  499.         s_tf0_h1(i) <= all_tf0_i(i);          -- TF0 flags 
  500.         s_tf0_h2(i) <= s_tf0_h1(i); 
  501.         s_tf1_h1(i) <= all_tf1_i(i);          -- TF1 flags 
  502.         s_tf1_h2(i) <= s_tf1_h1(i);      
  503.         -- all_xxx is a std_logic_vector, s_xxx is a array of std_logic !!!
  504.       end loop;
  505.       for i in 0 to C_IMPL_N_SIU-1 loop
  506.         s_ri_h1(i) <= all_scon_i(i*3);        -- RI flag
  507.         s_ri_h2(i) <= s_ri_h1(i); 
  508.         s_ti_h1(i) <= all_scon_i((i*3)+1);    -- TI flag 
  509.         s_ti_h2(i) <= s_ti_h1(i);      
  510.         -- all_xxx is a std_logic_vector, s_xxx is a array of std_logic !!!
  511.       end loop;
  512.     end if; 
  513.   end process iep; 
  514.  
  515. ------------------------------------------------------------------------------ 
  516. -- purpose: check the interupt-sources and start an interupt if necessary
  517. -- inputs:  ie,ip,scon,tcon,s_inthigh,s_intlow,s_ti,s_ri,s_ie0,
  518. --          s_ie1,s_tf0,s_tf1
  519. -- outputs: s_intpre
  520. ------------------------------------------------------------------------------ 
  521.  
  522.   intpre : process (ie,ip,scon,tcon,s_inthigh,s_intlow,s_ti,s_ri,s_ie0,
  523.                     s_ie1,s_tf0,s_tf1) 
  524.   begin   
  525.     if (EA='1' and (EX0='1' or ET0='1' or EX1='1' or ET1='1' or ES='1')) then 
  526.       if s_inthigh='1' then       -- interrupt with high priority is running 
  527.         s_intpre <= '0';           
  528.       elsif s_intlow='1' then     -- interrupt with low priority is running 
  529.         if ((PX0 and EX0 and s_ie0) or 
  530.             (PT0 and ET0 and s_tf0) or 
  531.             (PX1 and EX1 and s_ie1) or 
  532.             (PT1 and ET1 and s_tf1) or 
  533.             (PS0 and ES and (s_ri or s_ti)))='1' then 
  534.           s_intpre <= '1';        -- a second interrupt must start 
  535.         else                      
  536.           s_intpre <= '0'; 
  537.         end if; 
  538.       else                        -- no interrupt is running 
  539.         if ((EX0 and s_ie0) or 
  540.             (ET0 and s_tf0) or
  541.             (EX1 and s_ie1) or
  542.             (ET1 and s_tf1) or
  543.             (ES and (s_ri or s_ti)))='1' then 
  544.           s_intpre <= '1';        -- an interrupt must start 
  545.         else 
  546.           s_intpre <= '0'; 
  547.         end if; 
  548.       end if; 
  549.     else                          -- no interrupt must be carry out 
  550.       s_intpre <= '0'; 
  551.     end if;     
  552.   end process intpre; 
  553. ------------------------------------------------------------------------------ 
  554. -- purpose: this are the main-multiplexer for reading and writing regs
  555. -- inputs:  s_data_mux,pc,aludata_i,s_reg_data,rom_data_i,acc,
  556. --          s_bdata_mux,s_bit_data,psw,new_cy_i,s_helpb,sp,s_rr_adr,
  557. --          s_ri_data,s_help,s_adr_mux,s_adr,s_regs_wr_en,pc_plus2,
  558. --          s_help16,s_ri_adr,s_r0_b0,s_r1_b0,s_r0_b1,s_r1_b1,
  559. --          s_r0_b2,s_r1_b2,s_r0_b3,s_r1_b3
  560. -- outputs: s_data,s_bdata,s_adr,s_ri_data,ram_wr_o
  561. ------------------------------------------------------------------------------ 
  562.  
  563.   p_multiplexer : process (s_data_mux,pc,aludata_i,s_reg_data,rom_data_i,acc,
  564.                      s_bdata_mux,s_bit_data,psw,new_cy_i,s_helpb,sp,s_rr_adr,
  565.                      s_ri_data,s_help,s_adr_mux,s_adr,s_regs_wr_en,pc_plus2,
  566.                      s_help16,s_ri_adr,s_r0_b0,s_r1_b0,s_r0_b1,s_r1_b1,
  567.                      s_r0_b2,s_r1_b2,s_r0_b3,s_r1_b3,s_adrx_mux,dph,dpl,
  568.      datax_i) 
  569.   begin
  570.     case s_data_mux is
  571.       when "0000" => s_data <= conv_unsigned(0,8);
  572.       when "0001" => s_data <= pc(7 downto 0);
  573.       when "0010" => s_data <= pc(15 downto 8);
  574.       when "0011" => s_data <= unsigned(aludata_i);
  575.       when "0100" => s_data <= s_reg_data;
  576.       when "0101" => s_data <= unsigned(rom_data_i);
  577.       when "0110" => s_data <= acc;
  578.       when "0111" => 
  579.         s_data(7 downto 4) <= acc(3 downto 0);
  580.         s_data(3 downto 0) <= acc(7 downto 4);
  581.       when "1001" => 
  582.         s_data(7 downto 4) <= s_reg_data(7 downto 4);
  583.         s_data(3 downto 0) <= s_help(3 downto 0);
  584.       when "1010" => 
  585.         s_data(7 downto 4) <= acc(7 downto 4);
  586.         s_data(3 downto 0) <= s_reg_data(3 downto 0);
  587.       when "1100" => s_data <= s_help16(7 downto 0);
  588.       when "1101" => s_data <= s_help16(15 downto 8);
  589.       when "1110" => s_data <= pc_plus2(7 downto 0);
  590.       when "1111" => s_data <= unsigned(datax_i);
  591.       when others => s_data <= conv_unsigned(0,8);
  592.     end case;
  593.     case s_bdata_mux is
  594.       when "0000" => s_bdata <= '0';
  595.       when "0001" => s_bdata <= s_bit_data and cy;
  596.       when "0010" => s_bdata <= not(s_bit_data and cy);
  597.       when "0011" => s_bdata <= new_cy_i(1);
  598.       when "0100" => s_bdata <= s_helpb;
  599.       when "0101" => s_bdata <= not cy;
  600.       when "0110" => s_bdata <= not s_bit_data;
  601.       when "0111" => s_bdata <= s_bit_data;
  602.       when "1000" => s_bdata <= cy;
  603.       when "1001" => s_bdata <= s_bit_data or cy;
  604.       when "1010" => s_bdata <= not(s_bit_data or cy);
  605.       when "1011" => s_bdata <= '1';
  606.       when others => s_bdata <= '0';
  607.     end case;
  608.     case s_adr_mux is
  609.       when "0000" => s_adr <= conv_unsigned(0,8);
  610.       when "0001" => s_adr <= conv_unsigned(16#89#,8); 
  611.       when "0010" => s_adr <= conv_unsigned(16#8D#,8); 
  612.       when "0011" => s_adr <= conv_unsigned(16#8B#,8);
  613.       when "0100" => s_adr <= conv_unsigned(16#8F#,8); 
  614.       when "0101" => s_adr <= sp;
  615.       when "0110" => s_adr <= s_rr_adr;
  616.       when "0111" => s_adr <= s_ri_data;
  617.       when "1000" => s_adr <= unsigned(rom_data_i);
  618.       when "1001" => s_adr <= s_reg_data;
  619.       when "1010" => s_adr <= s_help ;
  620.       when "1011" => s_adr <= conv_unsigned(16#D7#,8); 
  621.       when "1100" => s_adr <= conv_unsigned(16#F0#,8);
  622.       when "1101" => s_adr <= conv_unsigned(16#82#,8); 
  623.       when "1110" => s_adr <= conv_unsigned(16#83#,8); 
  624.       when "1111" => s_adr <= sp + conv_unsigned(1,1); 
  625.       when others => s_adr <= conv_unsigned(0,8);
  626.     end case;
  627.     case s_adrx_mux is
  628.       when "00" => adrx_o <= (others => '0');
  629.       when "01" => 
  630.         adrx_o(15 downto 8) <= std_logic_vector(dph); 
  631.         adrx_o(7 downto 0) <= std_logic_vector(dpl); 
  632.       when "10" => 
  633.         adrx_o(15 downto 8) <= (others => '0'); 
  634.         adrx_o(7 downto 0) <= std_logic_vector(s_ri_data); 
  635.       when others => adrx_o <= (others => '0');
  636.     end case;
  637.           
  638.     case s_ri_adr is
  639.       when "00000000" => s_ri_data <= s_r0_b0;    
  640.       when "00000001" => s_ri_data <= s_r1_b0;    
  641.       when "00001000" => s_ri_data <= s_r0_b1;    
  642.       when "00001001" => s_ri_data <= s_r1_b1;    
  643.       when "00010000" => s_ri_data <= s_r0_b2;    
  644.       when "00010001" => s_ri_data <= s_r1_b2;    
  645.       when "00011000" => s_ri_data <= s_r0_b3;    
  646.       when "00011001" => s_ri_data <= s_r1_b3;
  647.       when others => s_ri_data <= conv_unsigned(0,8);
  648.     end case;   
  649.     if ((s_regs_wr_en="100") or (s_regs_wr_en="101")) then    -- write one byte
  650.       if ((s_adr(7)='1') or                                   -- SFR
  651.         (conv_std_logic_vector(s_adr(7 downto 4),4)="0010")   -- bitadressable
  652.         or ((std_logic_vector(s_adr) AND "11100110") = "00000000"))   -- R0,R1
  653.       then
  654.          ram_wr_o <= '0';
  655.       else
  656.         ram_wr_o <= '1';                -- to RAM-block
  657.       end if;
  658.     else
  659.       ram_wr_o <= '0';
  660.     end if;
  661.   end process p_multiplexer; 
  662. ------------------------------------------------------------------------------ 
  663. -- purpose: writes internal registers, on which the user have no 
  664. --          direct access
  665. -- inputs:  reset,clk,s_nextstate,state,s_help_en,
  666. --          rom_data_i,aludata_i,s_reg_data,s_rr_adr,new_cy_i
  667. -- outputs: state,s_ir,s_help,s_help16,s_helpb,s_intpre2,s_intlow,
  668. --          s_inthigh,s_preadr
  669. ------------------------------------------------------------------------------ 
  670.  
  671.   p_wr_internal_reg : process (reset,clk)
  672.   begin
  673.     if reset='1' then 
  674.       state <= STARTUP; 
  675.       s_ir <= conv_unsigned(0,8); 
  676.       s_help <= conv_unsigned(0,8);
  677.       s_help16 <= conv_unsigned(0,16);
  678.       s_helpb <= '0';
  679.       s_intpre2 <= '0';
  680.       s_intlow <= '0';
  681.       s_inthigh <= '0';
  682.       s_preadr <= conv_unsigned(0,8);
  683.       pc <= conv_unsigned(0,16); 
  684.       s_p0 <= "11111111";
  685.       s_p1 <= "11111111";
  686.       s_p2 <= "11111111";
  687.       s_p3 <= "11111111";
  688.     else
  689.       if Rising_Edge(clk) then  
  690.         state <= s_nextstate;                        -- update current state
  691.         if state=FETCH then 
  692.           s_ir <= unsigned(rom_data_i);              -- save OP-Code in IR 
  693.         end if; 
  694.         
  695.         case s_help_en is
  696.           when "0000" => NULL;
  697.           when "0001" => s_help <= unsigned(rom_data_i);
  698.           when "0010" => s_help <= unsigned(aludata_i);
  699.           when "0011" => s_help <= s_reg_data;
  700.           when "0100" => s_help <= s_rr_adr;
  701.           when "0101" => s_help <= conv_unsigned(16#03#,8);
  702.           when "0110" => s_help <= conv_unsigned(16#0B#,8);
  703.           when "0111" => s_help <= conv_unsigned(16#13#,8); 
  704.           when "1000" => s_help <= conv_unsigned(16#1B#,8);
  705.           when "1001" => s_help <= conv_unsigned(16#23#,8);
  706.           when "1010" => s_help <= acc;
  707.           when others => NULL;
  708.         end case;
  709.     
  710.         case s_help16_en is
  711.           when "00" => NULL;
  712.           when "01" => s_help16 <= pc + conv_unsigned(3,2);
  713.           when "10" => s_help16 <= pc_plus2;
  714.           when "11" => s_help16 <= pc_plus1;
  715.           when others => NULL;
  716.         end case;
  717.         case s_helpb_en is
  718.           when '0' => NULL;
  719.           when '1' => s_helpb <= new_cy_i(1);
  720.           when others => NULL;
  721.         end case;
  722.         if s_intpre2_en='1' then           -- help-reg for s_intpre
  723.           s_intpre2 <= s_intpre2_d;
  724.         else
  725.           NULL;
  726.         end if;
  727.         if s_intlow_en='1' then
  728.           s_intlow <= s_intlow_d;
  729.         else
  730.           NULL;
  731.         end if;
  732.         if s_inthigh_en='1' then
  733.           s_inthigh <= s_inthigh_d;
  734.         else
  735.           NULL;
  736.         end if;
  737.         s_preadr <= s_adr;
  738.         pc <= pc_comb;               -- write pc-register
  739. s_p0 <= p0_i;
  740. s_p1 <= p1_i;
  741. s_p2 <= p2_i;
  742. s_p3 <= p3_i;
  743.       end if;
  744.     end if;
  745.   end process p_wr_internal_reg; 
  746. ------------------------------------------------------------------------------ 
  747. -- purpose: calculate the next PC-adress 
  748. -- inputs:  s_pc_inc_en,pc_plus1,rom_data_i,s_intpre2,s_help,s_command,
  749. --          s_help16,s_ir,dph,dpl,acc,s_reg_data,pc
  750. -- outputs: pc_comb
  751. ------------------------------------------------------------------------------ 
  752.  
  753.   p_pc : process (s_pc_inc_en,pc_plus1,rom_data_i,s_help,
  754.                   s_help16,s_ir,dph,dpl,acc,s_reg_data,pc) 
  755.   variable v_dptr: unsigned(15 downto 0);
  756.   begin
  757.     v_dptr(15 downto 8) := dph;
  758.     v_dptr(7 downto 0) := dpl;
  759.     case s_pc_inc_en is 
  760.       when "0001" =>                  -- increment PC 
  761.         pc_comb <= pc_plus1; 
  762.       when "0010" =>                  -- for relativ jumps and calls 
  763.         pc_comb <= conv_unsigned(pc_plus1 + signed(rom_data_i),16);  
  764.       when "0011" =>                  -- load interrupt vectoradress
  765.         pc_comb(15 downto 8) <= conv_unsigned(0,8);
  766.         pc_comb(7 downto 0) <= s_help; 
  767.       when "0100" =>                  -- ACALL and AJMP
  768.         pc_comb(15 downto 11) <= s_help16(15 downto 11);
  769.         pc_comb(10 downto 8) <= s_ir(7 downto 5);
  770.         pc_comb(7 downto 0) <= unsigned(rom_data_i);
  771.       when "0101" =>                  -- JMP_A_DPTR, MOVC_A_ATDPTR
  772.         pc_comb <= v_dptr + conv_unsigned(acc,8); 
  773.       when "0110" =>                  -- MOVC
  774.         pc_comb <= s_help16;
  775.       when "0111" =>                  -- LJMP, LCALL
  776.         pc_comb(15 downto 8) <= s_help;
  777.         pc_comb(7 downto 0) <= unsigned(rom_data_i);
  778.       when "1000" =>                  -- RET, RETI
  779.         pc_comb(15 downto 8) <= s_help;
  780.         pc_comb(7 downto 0) <= s_reg_data;
  781.       when "1001" =>                  -- MOVC_A_ATPC
  782.         pc_comb <= pc_plus1 + conv_unsigned(acc,8);
  783.       when others => pc_comb <= pc;
  784.     end case;
  785.   end process p_pc;
  786.   
  787. ------------------------------------------------------------------------------ 
  788. -- purpose: write RAM, SFR or bitadressable Registers
  789. -- inputs:  reset,clk
  790. -- outputs: SFR, gprbit
  791. ------------------------------------------------------------------------------ 
  792.  
  793.   p_write_ram : process (reset,clk) 
  794.   begin
  795.     if reset='1' then 
  796.       ram_en_o <= '0'; 
  797.       gprbit(0) <= conv_unsigned(0,8);                                        
  798.       gprbit(1) <= conv_unsigned(0,8);                                        
  799.       gprbit(2) <= conv_unsigned(0,8);                                        
  800.       gprbit(3) <= conv_unsigned(0,8);                                        
  801.       gprbit(4) <= conv_unsigned(0,8);                                        
  802.       gprbit(5) <= conv_unsigned(0,8);                                        
  803.       gprbit(6) <= conv_unsigned(0,8);                                        
  804.       gprbit(7) <= conv_unsigned(0,8);                                        
  805.       gprbit(8) <= conv_unsigned(0,8);                                        
  806.       gprbit(9) <= conv_unsigned(0,8);                                        
  807.       gprbit(10) <= conv_unsigned(0,8);                                        
  808.       gprbit(11) <= conv_unsigned(0,8);                                        
  809.       gprbit(12) <= conv_unsigned(0,8);                                        
  810.       gprbit(13) <= conv_unsigned(0,8);                                        
  811.       gprbit(14) <= conv_unsigned(0,8);                                        
  812.       gprbit(15) <= conv_unsigned(0,8);
  813.       s_r0_b0 <= conv_unsigned(0,8);
  814.       s_r1_b0 <= conv_unsigned(0,8);
  815.       s_r0_b1 <= conv_unsigned(0,8);
  816.       s_r1_b1 <= conv_unsigned(0,8);
  817.       s_r0_b2 <= conv_unsigned(0,8);
  818.       s_r1_b2 <= conv_unsigned(0,8);
  819.       s_r0_b3 <= conv_unsigned(0,8);
  820.       s_r1_b3 <= conv_unsigned(0,8);
  821.       p0 <= conv_unsigned(255,8);                            
  822.       sp <= conv_unsigned(7,8);    
  823.       dpl <= conv_unsigned(0,8);                           
  824.       dph <= conv_unsigned(0,8);                           
  825.       pcon <= conv_unsigned(0,4);                          
  826.       tcon <= (others => (others => '0'));                          
  827.       tmod <= (others => (others => '0'));                          
  828.       tsel <= conv_unsigned(0,8);                          
  829.       p1 <= conv_unsigned(255,8);                            
  830.       scon <= (others => (others => '0'));                           
  831.       s_smodreg <= (others => '0');
  832.       sbuf <= (others => (others => '0'));
  833.       ssel <= conv_unsigned(0,8);                          
  834.       p2 <= conv_unsigned(255,8);                            
  835.       ie <= conv_std_logic_vector(0,8);                            
  836.       p3 <= conv_unsigned(255,8);                            
  837.       ip <= conv_std_logic_vector(0,8);                            
  838.       psw <= conv_std_logic_vector(0,8);  
  839.       acc <= conv_unsigned(0,8);                           
  840.       b <= conv_unsigned(0,8); 
  841.       s_reload <= (others => (others => '0'));
  842.       all_wt_en_o <= (others => '0'); 
  843.       s_wt <= (others => (others => '0')); 
  844.       all_trans_o <= (others => '0');
  845.     else 
  846.       ram_en_o <= '1'; 
  847.       if Rising_Edge(clk) then  
  848.         all_wt_en_o <= ( others => '0' );              -- default values 
  849.         all_trans_o <= ( others => '0' ); 
  850.         psw(0) <= s_p; 
  851.         for i in 0 to C_IMPL_N_TMR-1 loop
  852.           tcon(i)(3) <= tcon(i)(3) or ((tcon(i)(2) and s_int1_edge(i)) or 
  853.                         (not tcon(i)(2) and not s_int1_h2(i)));
  854.           tcon(i)(1) <= tcon(i)(1) or ((tcon(i)(0) and s_int0_edge(i)) or 
  855.                         (not tcon(i)(0) and not s_int0_h2(i)));
  856.           tcon(i)(5) <= tcon(i)(5) or s_tf0_edge(i);
  857.           tcon(i)(7) <= tcon(i)(7) or s_tf1_edge(i);
  858.         end loop;
  859.         -- update TF1, TF0 and IE1, IE0 in dependance on the IT flags 
  860.         for i in 0 to C_IMPL_N_SIU-1 loop
  861.           scon(i)(0) <= scon(i)(0) or s_ri_edge(i);
  862.           scon(i)(1) <= scon(i)(1) or s_ti_edge(i);
  863.         end loop;
  864.         case s_regs_wr_en is 
  865.           when "001" =>                 -- inc or dec SP
  866.             case s_command is 
  867.               when RET | RETI => 
  868.                 sp <= sp - conv_unsigned(1,1); 
  869.               when others => 
  870.                 sp <= sp + conv_unsigned(1,1); 
  871.               end case; 
  872.           when "010" =>                 -- write to ACC
  873.             acc <= s_data; 
  874.           when "011" =>                 -- write to ACC and PSW
  875.             acc <= s_data; 
  876.             psw(7) <= new_cy_i(1);
  877.             psw(6) <= new_cy_i(0);
  878.             psw(2) <= new_ov_i;
  879.           when "100" | "101" =>
  880.             case s_regs_wr_en is                  -- sp register
  881.               when "100" => if conv_integer(s_adr)=16#81# then 
  882.                               sp <= s_data; 
  883.                             end if;
  884.               when "101" => if s_command = POP then 
  885.                               sp <= sp - conv_unsigned(1,1); 
  886.                             else 
  887.                               sp <= sp + conv_unsigned(1,1); 
  888.                             end if; 
  889.               when others => NULL;
  890.             end case;
  891.             
  892.             if s_adr(7)='1' then 
  893.               case conv_integer(s_adr) is         -- write one byte of a SFR  
  894.               when 16#80# => p0 <= s_data;                
  895.               when 16#82# => dpl <= s_data; 
  896.               when 16#83# => dph <= s_data; 
  897.               when 16#87# => 
  898.                 pcon <= s_data(3 downto 0); 
  899.                 s_smodreg(s_ssel) <= s_data(7);
  900.               when 16#88# => tcon(s_tsel) <= std_logic_vector(s_data);
  901.               when 16#89# => tmod(s_tsel) <= s_data;
  902.               when 16#8A# => 
  903.                   s_reload(s_tsel) <= s_data;  -- tl0 
  904.                   s_wt(s_tsel) <= "00"; 
  905.                   all_wt_en_o(s_tsel) <= '1'; 
  906.               when 16#8B# => 
  907.                   s_reload(s_tsel) <= s_data;  -- tl1
  908.                   s_wt(s_tsel) <= "01"; 
  909.                   all_wt_en_o(s_tsel) <= '1'; 
  910.               when 16#8C# => 
  911.                   s_reload(s_tsel) <= s_data;  -- th0 
  912.                   s_wt(s_tsel) <= "10"; 
  913.                   all_wt_en_o(s_tsel) <= '1'; 
  914.               when 16#8D# => 
  915.                   s_reload(s_tsel) <= s_data;  -- th1 
  916.                   s_wt(s_tsel) <= "11"; 
  917.                   all_wt_en_o(s_tsel) <= '1'; 
  918.               when 16#8E# => tsel <= s_data; 
  919.               when 16#90# => p1 <= s_data; 
  920.               when 16#98# => scon(s_ssel) <= std_logic_vector(s_data);
  921.               when 16#99# => 
  922.                 sbuf(s_ssel) <= s_data;
  923.                 all_trans_o(s_ssel) <= '1'; 
  924.               when 16#9A# => ssel <= s_data; 
  925.               when 16#A0# => p2 <= s_data; 
  926.               when 16#A8# => ie <= conv_std_logic_vector(s_data,8); 
  927.               when 16#B0# => p3 <= s_data; 
  928.               when 16#B8# => ip <= conv_std_logic_vector(s_data,8); 
  929.               when 16#D0# =>  
  930.                 psw(7 downto 1) <= conv_std_logic_vector(s_data(7 downto 1),7);
  931.               when 16#E0# => acc <= s_data; 
  932.               when 16#F0# => b <= s_data;     
  933.               when others => NULL; 
  934.               end case; 
  935.                                    -- write one byte to bitadressable GPR 
  936.             elsif conv_std_logic_vector(s_adr(7 downto 4),4)="0010" then   
  937.               gprbit(conv_integer(s_adr(3 downto 0))) <= s_data; 
  938.             elsif conv_std_logic_vector(s_adr,8)="00000000" then
  939.               s_r0_b0 <= s_data;         -- write R0 / Bank 0
  940.             elsif conv_std_logic_vector(s_adr,8)="00000001" then
  941.               s_r1_b0 <= s_data;         -- write R1 / Bank 0
  942.             elsif conv_std_logic_vector(s_adr,8)="00001000" then
  943.               s_r0_b1 <= s_data;         -- write R0 / Bank 1
  944.             elsif conv_std_logic_vector(s_adr,8)="00001001" then
  945.               s_r1_b1 <= s_data;         -- write R1 / Bank 1
  946.             elsif conv_std_logic_vector(s_adr,8)="00010000" then
  947.               s_r0_b2 <= s_data;         -- write R0 / Bank 2
  948.             elsif conv_std_logic_vector(s_adr,8)="00010001" then
  949.               s_r1_b2 <= s_data;         -- write R1 / Bank 2
  950.             elsif conv_std_logic_vector(s_adr,8)="00011000" then
  951.               s_r0_b3 <= s_data;         -- write R0 / Bank 3
  952.             elsif conv_std_logic_vector(s_adr,8)="00011001" then
  953.               s_r1_b3 <= s_data;         -- write R1 / Bank 3
  954.             else                               -- write on general purpose RAM 
  955.               NULL;
  956.             end if; 
  957.           when "110" => 
  958.             case s_command is
  959.               when ANL_C_BIT | 
  960.                    ANL_C_NBIT | 
  961.                    MOV_C_BIT | 
  962.                    ORL_C_BIT | 
  963.                    ORL_C_NBIT => psw(7) <= s_bdata;               -- write CY
  964.               when others =>
  965.               if s_adr(7)='1' then 
  966.                 case s_adr(6 downto 3) is  -- write only one bit of an SFR 
  967.                   when "0000" => 
  968.                     p0(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  969.                   when "0001" => 
  970.                     tcon(s_tsel)(conv_integer(s_adr(2 downto 0))) <= s_bdata;
  971.                   when "0010" => 
  972.                     p1(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  973.                   when "0011" => 
  974.                     scon(s_ssel)(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  975.                   when "0100" => 
  976.                     p2(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  977.                   when "0101" => 
  978.                     ie(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  979.                   when "0110" => 
  980.                     p3(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  981.                   when "0111" => 
  982.                     ip(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  983.                   when "1010" =>  
  984.                     case s_adr(2 downto 0) is 
  985.                       when "000" => NULL; 
  986.                       when "001" => psw(1) <= s_bdata;
  987.                       when "010" => psw(2) <= s_bdata;
  988.                       when "011" => psw(3) <= s_bdata;
  989.                       when "100" => psw(4) <= s_bdata;
  990.                       when "101" => psw(5) <= s_bdata;
  991.                       when "110" => psw(6) <= s_bdata;
  992.                       when "111" => psw(7) <= s_bdata;
  993.                       when others => NULL; 
  994.                     end case; 
  995.                   when "1100" => 
  996.                     acc(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  997.                   when "1110" => 
  998.                     b(conv_integer(s_adr(2 downto 0))) <= s_bdata; 
  999.                   when others => NULL; 
  1000.                 end case; 
  1001.               else                  -- write one bit to bitadressable GP 
  1002.                 gprbit(conv_integer(s_adr(6 downto 3))) 
  1003.                       (conv_integer(s_adr(2 downto 0))) <= s_bdata;  
  1004.               end if; 
  1005.             end case;
  1006.           when "111" => 
  1007.             case s_command is 
  1008.               when DA_A | RLC_A | RRC_A =>     -- write ACC, CY 
  1009.                 acc <= s_data; 
  1010.                 psw(7) <= new_cy_i(1);
  1011.               when DIV_AB | MUL_AB =>          -- write ACC, B, CY, OV 
  1012.                 acc <= s_data; 
  1013.                 b <= unsigned(aludatb_i); 
  1014.                 psw(7) <= '0';
  1015.                 psw(2) <= new_ov_i;
  1016.               when others => NULL; 
  1017.             end case; 
  1018.           when others => NULL;
  1019.         end case; 
  1020.       end if;
  1021.     end if; 
  1022.   end process p_write_ram; 
  1023. end rtl;  
  1024.