Thông báo

Collapse
No announcement yet.

em có thắc mắc về fsm moore, mọi ng giúp em với

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • em có thắc mắc về fsm moore, mọi ng giúp em với

    em đang làm 1 cái ví dụ về FSM moore thì gặp phải vấn đền như thế này, mạch trạng thái của em là tìm chuỗi 1011, nếu đúng thì đầu ra bằng 1 sai thì bằng 0, em viết code và test bằng ISE thì có cái hiện tượng là như thế này
    code ko có lệnh else trong mạch tổ hợp thái tiếp theo
    Code:
    ----------------------------------------------------------------------------------
    -- Company: 
    -- Engineer: 
    -- 
    -- Create Date:    14:59:47 06/22/2014 
    -- Design Name: 
    -- Module Name:    FSM_1011_moore - Behavioral 
    -- Project Name: 
    -- Target Devices: 
    -- Tool versions: 
    -- Description: 
    --
    -- Dependencies: 
    --
    -- Revision: 
    -- Revision 0.01 - File Created
    -- Additional Comments: 
    --
    ----------------------------------------------------------------------------------
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
    -- Uncomment the following library declaration if using
    -- arithmetic functions with Signed or Unsigned values
    --use IEEE.NUMERIC_STD.ALL;
    
    -- Uncomment the following library declaration if instantiating
    -- any Xilinx primitives in this code.
    --library UNISIM;
    --use UNISIM.VComponents.all;
    
    entity FSM_1011_moore is
     port ( clk : in std_logic;
            rst : in std_logic;
    		  data_in : in std_logic;
    		  data_out :out std_logic);
    end FSM_1011_moore;
    
    architecture Behavioral of FSM_1011_moore is
    type state_type is (d1,d10,d101,d1011,idel);
    signal current_state,next_state : state_type;
    signal y : std_logic;
    
    begin
    data_out<=y;
    -- moo tar thanh ghi trang thai
    process(clk)
     begin
      if rising_edge(clk) then
       if rst='1' then 
    	 current_state<=idel;
    	else
    	 current_state<=next_state;
    	end if;
      end if;
     end process;
    -- mo ta mach to hop gia tri dau ra
    process(current_state,clk)
     begin
      if current_state=d1011 then
       y<='1';
      else
       y<='0';
      end if;
     end process;
    -- mo ta mach to hop trang thai tiep theo
    process(current_state,data_in)
     begin
      next_state<=current_state;
      case current_state is
       when idel =>
    	 if data_in='1' then
    	  next_state<=d1;
    	  --else
    	 -- next_state<=idel;
    	 end if;
    	 when d1 =>
    	  if data_in='0' then
    	   next_state<=d10;
    		--else
    		--next_state<=d1;
    	  end if;
    	 when d10 =>
    	  if data_in='1' then
    	   next_state<=d101;
    		--else
    		--next_state<=idel;
    	  end if;
    	 when d101 => 
    	  if data_in='1' then
    	   next_state<=d1011;
    		--else
    		--next_state<=d10;
    	  end if;
    	 when d1011 =>
    	  if data_in='1' then
    	   next_state<=d1;
    		--else
    		--next_state<=d10;
    	  end if;
    	 when others =>
    	  next_state<=idel;
    	 end case;
    	 end process;
    	 
    	
    end Behavioral;
    thì giản đồ sau khi mô phỏng là hình ở trên (các bác thông cảm nhìn ở phía dưới có hình đấy ak)


    còn trong trường hợp có câu lệnh else trong vòng case
    Code:
    ----------------------------------------------------------------------------------
    -- Company: 
    -- Engineer: 
    -- 
    -- Create Date:    14:59:47 06/22/2014 
    -- Design Name: 
    -- Module Name:    FSM_1011_moore - Behavioral 
    -- Project Name: 
    -- Target Devices: 
    -- Tool versions: 
    -- Description: 
    --
    -- Dependencies: 
    --
    -- Revision: 
    -- Revision 0.01 - File Created
    -- Additional Comments: 
    --
    ----------------------------------------------------------------------------------
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    
    -- Uncomment the following library declaration if using
    -- arithmetic functions with Signed or Unsigned values
    --use IEEE.NUMERIC_STD.ALL;
    
    -- Uncomment the following library declaration if instantiating
    -- any Xilinx primitives in this code.
    --library UNISIM;
    --use UNISIM.VComponents.all;
    
    entity FSM_1011_moore is
     port ( clk : in std_logic;
            rst : in std_logic;
    		  data_in : in std_logic;
    		  data_out :out std_logic);
    end FSM_1011_moore;
    
    architecture Behavioral of FSM_1011_moore is
    type state_type is (d1,d10,d101,d1011,idel);
    signal current_state,next_state : state_type;
    signal y : std_logic;
    
    begin
    data_out<=y;
    -- moo tar thanh ghi trang thai
    process(clk)
     begin
      if rising_edge(clk) then
       if rst='1' then 
    	 current_state<=idel;
    	else
    	 current_state<=next_state;
    	end if;
      end if;
     end process;
    -- mo ta mach to hop gia tri dau ra
    process(current_state,clk)
     begin
      if current_state=d1011 then
       y<='1';
      else
       y<='0';
      end if;
     end process;
    -- mo ta mach to hop trang thai tiep theo
    process(current_state,data_in)
     begin
      next_state<=current_state;
      case current_state is
       when idel =>
    	 if data_in='1' then
    	  next_state<=d1;
    	  else
    	  next_state<=idel;
    	 end if;
    	 when d1 =>
    	  if data_in='0' then
    	   next_state<=d10;
    		else
    		next_state<=d1;
    	  end if;
    	 when d10 =>
    	  if data_in='1' then
    	   next_state<=d101;
    		else
    		next_state<=idel;
    	  end if;
    	 when d101 => 
    	  if data_in='1' then
    	   next_state<=d1011;
    		else
    		next_state<=d10;
    	  end if;
    	 when d1011 =>
    	  if data_in='1' then
    	   next_state<=d1;
    		else
    		next_state<=d10;
    	  end if;
    	 when others =>
    	  next_state<=idel;
    	 end case;
    	 end process;
    	 
    	
    end Behavioral;
    thì kết quả mô phỏng lại ra hình ở dưới

    em không hiểu là tại sao nó lại như vậy
    testbench cho cả 2 trg hợp là như nhau
    Code:
    --------------------------------------------------------------------------------
    -- Company: 
    -- Engineer:
    --
    -- Create Date:   15:17:48 06/22/2014
    -- Design Name:   
    -- Module Name:   E:/New folder/practice/FSM_1011/FSM_1011_tb.vhd
    -- Project Name:  FSM_1011
    -- Target Device:  
    -- Tool versions:  
    -- Description:   
    -- 
    -- VHDL Test Bench Created by ISE for module: FSM_1011_moore
    -- 
    -- Dependencies:
    -- 
    -- Revision:
    -- Revision 0.01 - File Created
    -- Additional Comments:
    --
    -- Notes: 
    -- This testbench has been automatically generated using types std_logic and
    -- std_logic_vector for the ports of the unit under test.  Xilinx recommends
    -- that these types always be used for the top-level I/O of a design in order
    -- to guarantee that the testbench will bind correctly to the post-implementation 
    -- simulation model.
    --------------------------------------------------------------------------------
    LIBRARY ieee;
    USE ieee.std_logic_1164.ALL;
     
    -- Uncomment the following library declaration if using
    -- arithmetic functions with Signed or Unsigned values
    --USE ieee.numeric_std.ALL;
     
    ENTITY FSM_1011_tb IS
    END FSM_1011_tb;
     
    ARCHITECTURE behavior OF FSM_1011_tb IS 
     
        -- Component Declaration for the Unit Under Test (UUT)
     
        COMPONENT FSM_1011_moore
        PORT(
             clk : IN  std_logic;
             rst : IN  std_logic;
             data_in : IN  std_logic;
             data_out : OUT  std_logic
            );
        END COMPONENT;
        
    
       --Inputs
       signal clk : std_logic := '0';
       signal rst : std_logic := '0';
       signal data_in : std_logic := '0';
    
     	--Outputs
       signal data_out : std_logic;
    
       -- Clock period definitions
       constant clk_period : time := 10 ns;
     
    BEGIN
     
    	-- Instantiate the Unit Under Test (UUT)
       uut: FSM_1011_moore PORT MAP (
              clk => clk,
              rst => rst,
              data_in => data_in,
              data_out => data_out
            );
    
       -- Clock process definitions
       clk_process :process
       begin
    		clk <= '0';
    		wait for clk_period/2;
    		clk <= '1';
    		wait for clk_period/2;
       end process;
     
    
       -- Stimulus process
       stim_proc: process
       begin		
          -- hold reset state for 100 ns.
          wait for 5 ns ;	
          data_in<='1';
    		wait for 10 ns;
    		data_in<='0';
    		wait for 10 ns;
    		data_in<='1';
    		wait for 10 ns;
    		data_in<='1';
    		wait for 10 ns;
    		data_in<='0';
    		wait for 10 ns;
    		data_in<='0';
    		wait for 10 ns;
          --wait;
          
       end process;
    
    END;
    còn đây là sơ đồ trạng thái của ví dụ em đang làm
    Attached Files
    Last edited by boyzzun; 22-06-2014, 18:25.

  • #2
    không hiểu sao không tải ảnh kia lên đc, em phải nén lại
    Attached Files

    Comment


    • #3
      Nguyên văn bởi boyzzun Xem bài viết
      không hiểu sao không tải ảnh kia lên đc, em phải nén lại
      Code bạn khác nhau thì nó phải ra khác nhau chứ sao

      always@()
      begin
      A <= B;
      if(data=1'b1)
      A <= C;
      end
      Khi data = 1 thì A = C; Nhưng nếu data=0 thì A sẽ là B.


      always@()
      begin
      A <= B;
      if(data=1'b1)
      A <= C;
      else
      A <= D;
      end

      Trường hợp này thì A là C hoặc D.

      Đây là khái niệm "sequential" trong block begin --> end... bạn search thêm sequential statement mà đọc

      Code này:

      begin
      A <= B;
      if(d==1)
      A <= C;
      end
      Khác với code này


      begin
      if(d==1)
      A <= C;
      A <= B;
      end

      Comment


      • #4
        Code:
        process(current_state,data_in)
         begin
          next_state<=current_state;
          case current_state is
           when idel =>
        	 if data_in='1' then
        	  next_state<=d1;
        	  else
        	  next_state<=idel;
        	 end if;
        	 when d1 =>
        	  if data_in='0' then
        	   next_state<=d10;
        		else
        		next_state<=d1;
        	  end if;
                  .
                  .
                  .
               end case;
           end process;
        em thấy nó có khác gì so với code này đâu
        Code:
        process(current_state,data_in)
         begin
          next_state<=current_state;
          case current_state is
           when idel =>
        	 if data_in='1' then
        	  next_state<=d1;
        	 end if;
        	 when d1 =>
        	  if data_in='0' then
        	   next_state<=d10;
        		end if;
        	 when d10 =>
        	  if data_in='1' then
        	   next_state<=d101;
        	  end if;

        Comment


        • #5
          tìm ra chưa bạn?

          Comment


          • #6
            Nguyên văn bởi jefflieu Xem bài viết
            tìm ra chưa bạn?
            vẫn chưa bác ak, gian nan quá nhở, lúc học thày cung không nói kỹ nên h toàn phải tự mò mẫm thế này. Em nghĩ thế này
            [code]
            process(current_state,data_in)
            begin
            next_state<=current_state;
            case current_state is
            when idel =>
            if data_in='1' then
            next_state<=d1;
            end if;
            [code]
            nếu data_in là '1' thì next_state sẽ chuyển sang trạng thái d1, còn nếu data_in không phải 1 thì next_state sẽ chuyển về current_state, trong trường hợp này là idel. Còn với đoạn code còn lại thì em không biết là nó bị mãu thuẫn gì mà khi kết quả mô phongr lại không ra đúng
            PS: em gửi code cho bác xem, kết quả mô phỏng cũng có trong đấy, xem ra là không dễ như em tưởng
            Attached Files

            Comment


            • #7
              Dude, mô phỏng đươc rồi tự dò đi. Code thế nào cũng khác nhau nên waveform mới khác nhau!

              Comment


              • #8
                Bạn mô phỏng lại và chụp cái input, current_state với next_state xem nào !!
                Add cai state sao cho nó hiện chũ lên waveform ấy cho dễ nhìn

                Comment


                • #9
                  Nguyên văn bởi jefflieu Xem bài viết
                  Bạn mô phỏng lại và chụp cái input, current_state với next_state xem nào !!
                  Add cai state sao cho nó hiện chũ lên waveform ấy cho dễ nhìn
                  bác nói chuẩn bác ak, show lên dễ nhìn hơn, mà cho em hỏi cái này cái là cái
                  type state_type is (d1,d10,d101,d1011,idel) viết vậy có đúng không hay phải để cái idel lên đầu, idel là trạng thái nghỉ ý

                  Comment


                  • #10
                    Bạn xem lúc chạy synthesis nó gán (encode) mấy cái state của bạn như thế nào.
                    Để đâu cũng được, nhưng giá trị của nó thay đổi chút ít.

                    Comment


                    • #11
                      em không tải ảnh lên đc, chả hiểu làm sao nữa, bác có mail không em gửi qua mail cho nó nhanh

                      Comment


                      • #12
                        Up lên đây đi!

                        Comment


                        • #13
                          Nguyên văn bởi jefflieu Xem bài viết
                          Up lên đây đi!
                          em up lên photobucket rồi mà nó vẫn báo lỗi,bác thông cảm vào trang này xem qua, đây là ảnh của cái code mà nó nhánh else http://www.mediafire.com/view/myfiles/#gnyxbmxxs6hds37
                          Last edited by boyzzun; 01-07-2014, 11:07.

                          Comment


                          • #14
                            Nguyên văn bởi boyzzun Xem bài viết
                            em up lên photobucket rồi mà nó vẫn báo lỗi,bác thông cảm vào trang này xem qua, đây là ảnh của cái code mà nó nhánh else Simple File Sharing and Storage.
                            when d10 =>
                            if data_in='1' then
                            next_state<=d101;
                            else
                            next_state<=idel;
                            end if;
                            when d101 =>
                            if data_in='1' then
                            next_state<=d1011;
                            else
                            next_state<=d10;
                            end if;
                            when d1011 =>
                            if data_in='1' then
                            next_state<=d1;
                            else
                            next_state<=d10;
                            end if;
                            Code của bạn khác nhau ở mấy cái state này mà!

                            Comment


                            • #15
                              Nguyên văn bởi jefflieu Xem bài viết
                              Code của bạn khác nhau ở mấy cái state này mà!
                              là sao hả bác, các trạng thái thay đổi alf em đặt theo đúng sở đồ FSM mà ???

                              Comment

                              Về tác giả

                              Collapse

                              boyzzun Tìm hiểu thêm về boyzzun

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X