source: PROJECT_CORE_MPI/CORE_MPI/BRANCHES/v0.04/Ex0_Fsm.vhd

Last change on this file was 15, checked in by rolagamo, 12 years ago
File size: 6.7 KB
Line 
1----------------------------------------------------------------------------------
2-- Company:
3-- Engineer: GAMOM
4--
5-- Create Date:    05:37:34 03/06/2012
6-- Design Name:
7-- Module Name:    Ex0_Fsm - Behavioral
8-- Project Name:
9-- Target Devices:
10-- Tool versions:
11-- Description: Fournit le temps en µs depuis l'initialisation de la bibliothèque
12--
13-- Dependencies:
14--
15-- Revision:
16-- Revision 0.01 - File Created
17-- Additional Comments:
18--
19----------------------------------------------------------------------------------
20library IEEE;
21use IEEE.STD_LOGIC_1164.ALL;
22library NocLib ;
23
24--use NocLib.CoreTypes.all;
25-- Uncomment the following library declaration if using
26-- arithmetic functions with Signed or Unsigned values
27use IEEE.NUMERIC_STD.ALL;
28
29-- Uncomment the following library declaration if instantiating
30-- any Xilinx primitives in this code.
31--library UNISIM;
32--use UNISIM.VComponents.all;
33
34entity Ex0_Fsm is
35    Port ( Initialized : in  STD_LOGIC;
36           
37           Instruction : in  STD_LOGIC_VECTOR (7 downto 0);
38                          instruction_en: in STD_LOGIC; --ceci n'est pas nécessaire dans ce module
39                                                                                                        -- car le module fonctionne en permanence.
40           clk : in  STD_LOGIC;
41           reset : in  STD_LOGIC;
42           ClkRate : in  STD_LOGIC_VECTOR; --la fréquence de l'horloge en Mhz
43                        uTimeResult : out  STD_LOGIC_VECTOR; 
44                        TickResult : out STD_LOGIC_VECTOR;
45                        OvFus : out STD_Logic:='0'
46                          );
47end Ex0_Fsm;
48
49architecture Behavioral of Ex0_Fsm is
50 
51 --Use descriptive names for the states, like st1_reset, st2_search
52   type state_type is (Init,COunt,UsOut,OverFlow); 
53   signal state, next_state : state_type; 
54   --Declare internal signals for all outputs of the state-machine
55   signal Tick_Count: std_logic_vector(31 downto 0):=(others=>'0');
56        signal Time_Ucount :std_logic_vector(31 downto 0):=(others=>'0');
57        signal OvF,Ovf_us,ovF_i,zero :std_logic;   -- overflow flag
58   signal ClkR_Count : std_logic_vector(ClkRate'high downto ClkRate'low):=(others=>'0');
59        signal en : std_logic:='1';
60        --other outputs
61begin
62utime_PROC: process (clk)
63   begin
64      if (rising_edge(clk)) then
65         if (reset = '1') or Initialized='0' then
66            state <= init;
67          --  Time_UCount<= (others=>'0');
68                        --      Tick_Count <=(others=>'0');
69         else
70            state <= next_state;
71                        TickResult<= Tick_Count;
72                        uTimeResult <=Time_ucount;
73                        OvF<=OvF_i;
74                        OvfUs<=Ovf_us;
75           -- <output> <= <output>_i;
76         -- assign other outputs to internal signals
77         end if;       
78      end if;
79   end process;
80 
81   --MOORE State-Machine - Outputs based on state only
82   OUTPUT_DECODE: process (state)
83   FUNCTION incr_vec(s1:std_logic_vector;en:std_logic) return std_logic_vector is 
84                  --this function increments a std_logic_vector type by '1'
85        VARIABLE V : std_logic_vector(s1'high downto s1'low) ; 
86        VARIABLE tb : std_logic_vector(s1'high downto s1'low); 
87        BEGIN 
88        tb(s1'low) := en; 
89        V := s1; 
90        for i in (V'low + 1) to V'high loop 
91            tb(i) := V(i - 1) and tb(i -1); 
92        end loop; 
93        for i in V'low to V'high loop 
94            if(tb(i) = '1') then 
95                V(i) := not(V(i)); 
96            end if; 
97        end loop; 
98        return V; 
99        end incr_vec; -- end function
100
101
102FUNCTION  dcr_vec(s1:std_logic_vector;en:std_logic) return std_logic_vector is 
103                  --this function decrements a std_logic_vector type by '1'
104        VARIABLE V : std_logic_vector(s1'high downto s1'low) ; 
105        VARIABLE tb : std_logic_vector(s1'high downto s1'low); 
106        BEGIN 
107        tb(s1'low) := not(en); 
108        V := s1; 
109        for i in (V'low + 1) to V'high loop 
110            tb(i) := V(i - 1) or tb(i -1); 
111        end loop; 
112        for i in V'low to V'high loop 
113            if(tb(i) = '0') then 
114                V(i) := not(V(i)); 
115            end if; 
116        end loop; 
117        return V; 
118        end dcr_vec; -- end function
119FUNCTION all_ones(s1:std_logic_vector) return std_logic is 
120                  --this function tells if all bits of a vector are '1'
121                  --return value Z is '1', then vector has all 1 bits
122        --VARIABLE V : std_logic_vector(s1'high downto s1'low) ;
123        VARIABLE Z : std_logic; 
124        BEGIN 
125        Z := s1(s1'low); 
126        FOR i IN (s1'low+1) to s1'high LOOP 
127            Z := Z AND s1(i); 
128        END LOOP; 
129        RETURN Z; 
130        END all_ones; -- end function
131FUNCTION all_zeros(s1:std_logic_vector) return std_logic is 
132                  --this function tells if all bits of a vector are '0'
133                  --return value Z if '1', then vector has all 0 bits
134        --VARIABLE V : std_logic_vector(s1'high downto s1'low) ;
135        VARIABLE Z : std_logic; 
136        BEGIN 
137        Z := '0'; 
138        FOR i IN (s1'low) to s1'high LOOP 
139            Z := Z OR s1(i); 
140        END LOOP; 
141        RETURN not(Z); 
142        END all_zeros; -- end function
143
144        begin
145      --insert statements to decode internal output signals
146      --below is simple example
147      case state is
148                When Init =>
149                        Clkr_Count<=ClkRate;  --initialiser le décompte
150                        Time_uCount<=( others =>'0'); -- mettre à 0 le compteur des µS
151                        Tick_Count<=(others =>'0');  --mettre à 0 les ticks
152                When Count =>
153                  Tick_count<=incr_vec(Tick_Count,en);
154                  ClkR_Count<=dcr_vec(Clkr_Count,en); --compteur de µs
155                  zero<=all_zeros(ClkR_Count);   --
156                  OvF_i<=All_ones(Tick_count);   --
157                when UsOut =>
158                        Time_Ucount<=incr_vec(time_ucount,en);
159                        Clkr_Count<=ClkRate;
160                        Tick_count<=incr_vec(Tick_Count,en);
161                        OvF_i<=All_ones(Tick_count);
162                        zero<='0';
163         OvF_us<=All_ones(Time_Ucount);
164      when OverFlow =>
165         Tick_count<=incr_vec(Tick_Count,en); --compteur de tick
166                  ClkR_Count<=dcr_vec(Clkr_Count,en);
167                        OvF_us<=All_ones(Time_Ucount);
168                   OvF_i<=All_ones(Tick_count); 
169     end case;
170   end process;
171 
172   NEXT_STATE_DECODE: process (state, Initialized, zero, OvF)
173   begin
174      --declare default state for next_state to avoid latches
175      next_state <= state;  --default is to stay in current state
176      --insert statements to decode next_state
177      --below is a simple example
178      case (state) is
179         when Init =>
180            if Initialized = '1' then
181                                   
182               next_state <= count;
183            end if;
184         when Count =>
185            if Zero = '0'  then
186               next_state <= Count;
187                                elsif Zero = '1'  then
188                                        next_state <=Usout;
189                       
190            end if;
191         when UsOut =>
192                                If OvF='0'  then
193                                        next_state <= count;
194                                elsif OvF='1' then
195                                        next_state <= OverFlow;
196                                end if;
197                        When OverFlow =>
198                                        next_state<=Count;
199--         when others =>
200--            next_state <= Init;
201      end case;     
202   end process;
203
204
205end Behavioral;
206
Note: See TracBrowser for help on using the repository browser.