Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 2.66 KB | None | 0 0
  1. -- extended FSM version of the gcd evaluator, synthesizable with a few
  2. -- adjustments
  3. library IEEE;
  4. use IEEE.STD_LOGIC_1164.all,ieee.numeric_std.all;
  5.  
  6. entity gcd_efsm is
  7.      port(
  8.          start : in STD_LOGIC;
  9.          clk : in STD_LOGIC;
  10.          a : in STD_LOGIC_VECTOR(7 downto 0);
  11.          b : in STD_LOGIC_VECTOR(7 downto 0);
  12.          err : out STD_LOGIC;
  13.          dr : out STD_LOGIC;
  14.          gcd : out STD_LOGIC_VECTOR(7 downto 0)
  15.          );
  16. end gcd_efsm;
  17.  
  18. -- Mealy machine
  19. -- a,b should be steady at start, any change after start is ignored
  20. -- the error and the data redy signal are provided for one clock cycle
  21. architecture behav of gcd_efsm is
  22. type states is (idle,check,test1,test2,sub1,sub2,output,err_state);
  23. signal curr_state,next_state: states;
  24. begin
  25. -- next state and output logic
  26.   p0: process(curr_state,start,a,b)
  27.   constant zero:unsigned(7 downto 0):=(others=>'0');
  28.   variable vara,varb: unsigned(7 downto 0);
  29.   begin
  30.       case curr_state is
  31.           when idle =>
  32.               if (start='1') then
  33.                 next_state <= check;
  34.                 vara:=unsigned(a);
  35.                 varb:=unsigned(b);
  36.               end if;
  37.               dr <= '0' after 1 ns;
  38.               err <= '0' after 1 ns;
  39.           when check =>
  40.               if (vara=zero) or (varb=zero) or (is_x(a)) or (is_x(b)) then
  41.                 next_state <= err_state;
  42.                         gcd <= (others=>'0');
  43.               else
  44.                 next_state <= test1;
  45.               end if;
  46.                 dr <= '0' after 1 ns;
  47.                 err <= '0' after 1 ns;
  48.           when test1 =>
  49.               if (vara = varb) then
  50.                 next_state <= output;
  51.               else
  52.                 next_state <= test2;
  53.               end if;
  54.               dr <= '0' after 1 ns;
  55.               err <= '0' after 1 ns;
  56.           when test2 =>
  57.               if (vara > varb) then
  58.                 next_state <= sub1;
  59.               else
  60.                 next_state <= sub2;
  61.               end if;
  62.               dr <= '0' after 1 ns;
  63.               err <= '0' after 1 ns;
  64.            when sub1 =>
  65.                next_state <= test1;
  66.                vara:=vara-varb;
  67.                dr <= '0' after 1 ns;
  68.                err <= '0' after 1 ns;
  69.            when sub2 =>
  70.                next_state <= test1;
  71.                varb:=varb-vara;
  72.                dr <= '0' after 1 ns;
  73.                err <= '0' after 1 ns;
  74.            when output =>
  75.               next_state <= idle;
  76.               dr <= '1' after 1 ns;
  77.               err <= '0' after 1 ns;
  78.               gcd <= std_logic_vector(vara);
  79.                    when err_state =>
  80.                        next_state <= idle;
  81.                        dr <= '0';
  82.                        err <= '1';
  83.                    -- useful when encoding
  84.             when others =>
  85.                 next_state <= idle;
  86.                 dr <= '0' after 1 ns;
  87.                 err <= '1' after 1 ns;
  88.         end case;
  89.  
  90.   end process p0;
  91.  
  92. -- state update
  93.   p1: process(clk)
  94.       begin
  95.         if (rising_edge(clk)) then
  96.             curr_state <= next_state;
  97.       end if;
  98.       end process p1;
  99.  
  100.  
  101. end architecture behav;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement