Thông báo

Collapse
No announcement yet.

state machine

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

  • state machine

    HTML Code:
    library ieee ;
    use ieee.std_logic_1164.all ;
    -----------------------------
    entity state_circuit is
    port ( clk1 : in std_logic ;
    	   key : in std_logic_vector( 2 downto 0 );
    	   outp: out std_logic  ) ;
    end state_circuit ;
    ---------
    architecture behav of state_circuit is
    type state is ( AA, BB , CC , DD ) ;
    signal pr_state, nx_state : state ;
    signal rate , rt : integer ;
    begin
    	process(pr_state , key)
        begin
    		case pr_state is
    		when AA=>
    		outp <= '1' ;
    			if(key(1)='0') then
    				nx_state <= BB;
    			elsif(key(2)='0') then
    				nx_state <= CC;
    			else nx_state <= DD;
    			end if;
    			rate<=16;
    		when BB=>        ------trang thai tang
    		outp <= '1' ;
    			if(key(1)='0') then
    				nx_state <= BB;
    			elsif(key(2)='0') then
    				nx_state <= CC;
    			else nx_state <= DD;
    			END IF;
    			if(rt<128) then rate<=rt*2;
    			else rate<=rt;
    			end if;
    		when CC=>		 -------trang thai giam
    		outp <= '1' ;
    			if(key(1)='0') then
    				nx_state<= BB;
    			elsif(key(2)='0') then
    				nx_state <= CC;
    			ELSE nx_state <= DD;
    			end if;
    			if(rt>1) then rate<=rt/2;
    			else rate<=rt;
    			end if;
    		when DD=>		 -------trang thai giam
    		outp <= '1' ;
    			if(key(1)='0') then
    				nx_state <= BB;
    			elsif(key(2)='0') then
    				nx_state <= CC;
    			ELSE nx_state <= DD;
    			end if;
    			RATE<=RT;
    		end case ;
    	end process;
    	process( key,clk1 )
        begin
    		if(key(0)='0') then
    			pr_state <=AA;
    		elsif(clk1'event and clk1='1') then
    				pr_state <= nx_state;
    				RT<=rate;
    		end if;
    	end process;
    end behav;
    mình ko hiểu tại sao đoạn code này ko tạo ra được sơ đồ cấu trúc state machine.Nhiều bài mình đều viết theo cấu trúc này và đều được.mong các pro giúp mình.
    Attached Files

  • #2
    Theo tôi nghĩ là tại vì bạn dùng key(0) để vô state đầu tiên nhưng bạn cũng lại dùng nó trong sensitivity của nx_state process. Bạn nên tách key(0) ra riêng để nó không ảnh hưởng tới nx_state process. Tôi tạm chữa code của bạn như sau:

    Code:
    library ieee ;
    use ieee.std_logic_1164.all ;
    -----------------------------
    entity state_circuit is
    port ( clk1 : in std_logic ;
                    key0 : in std_logic;
    	   key : in std_logic_vector( 2 downto 1 );
    	   outp: out std_logic  ) ;
    end state_circuit ;
    ---------
    architecture behav of state_circuit is
    type state is ( AA, BB , CC , DD ) ;
    signal pr_state, nx_state : state ;
    signal rate , rt : integer ;
    begin
    	process(pr_state , key)
        begin
    		case pr_state is
    		when AA=>
    		outp <= '1' ;
    			if(key(1)='0') then
    				nx_state <= BB;
    			elsif(key(2)='0') then
    				nx_state <= CC;
    			else nx_state <= DD;
    			end if;
    			rate<=16;
    		when BB=>        ------trang thai tang
    		outp <= '1' ;
    			if(key(1)='0') then
    				nx_state <= BB;
    			elsif(key(2)='0') then
    				nx_state <= CC;
    			else nx_state <= DD;
    			END IF;
    			if(rt<128) then rate<=rt*2;
    			else rate<=rt;
    			end if;
    		when CC=>		 -------trang thai giam
    		outp <= '1' ;
    			if(key(1)='0') then
    				nx_state<= BB;
    			elsif(key(2)='0') then
    				nx_state <= CC;
    			ELSE nx_state <= DD;
    			end if;
    			if(rt>1) then rate<=rt/2;
    			else rate<=rt;
    			end if;
    		when DD=>		 -------trang thai giam
    		outp <= '1' ;
    			if(key(1)='0') then
    				nx_state <= BB;
    			elsif(key(2)='0') then
    				nx_state <= CC;
    			ELSE nx_state <= DD;
    			end if;
    			RATE<=RT;
    		end case ;
    	end process;
    	process( key0,clk1 )
        begin
    		if(key0='0') then
    			pr_state <=AA;
    		elsif(clk1'event and clk1='1') then
    				pr_state <= nx_state;
    				RT<=rate;
    		end if;
    	end process;
    end behav;
    Chúc một ngày vui vẻ
    Tony
    email : dientu_vip@yahoo.com

    Comment


    • #3
      tình hình là vẫn không được bạn ah.
      Nhưng nếu mình thay đổi đoạn code dưới 1 chút thì sẽ được
      process( key0,clk1 )
      begin
      if(key0='0') then
      pr_state <=AA;
      elsif(clk1'event and clk1='1') then
      if ( clk1 = '1' ) then
      pr_state <= nx_state;
      RT<=rate;
      end if;
      end if ;
      end process;
      end behav;
      và mình ko hiểu tại sao nó lại được nữa .Bạn nào biết chỉ giùm mình xem nó đúng và sai ở chỗ nào với ((((
      Attached Files

      Comment


      • #4
        chào bạn nam_bkfet,

        Ko có thời gian xem kỹ lắm nhưng mình nghĩ đây ko phải là lỗi syntax mà lỗi semantic, do giá trị của nx_state ở các state đều giống i chang nhau ở các state BB CC DD nên khi synthesis thì quartus optimize lại ko còn state nào hết thui!!!

        Comment


        • #5
          vậy liệu khi thực hiện thì nó có thực hiện đúng ý đồ của người viết ko nhỉ ??????

          Comment


          • #6
            chào bạn nam_bkfet

            Quartus hỗ trợ cả functional và timing simulation lun mà, chạy ,một phát là biết ngay Mình nghĩ synthesis đúng do Quartus cũng tool xịn mà đâu dễ sai được, mạch chạy sai chủ yếu là do mình viết code sai thôi. Hok biết bài toán cụ thể của bạn làm gì nhưng thấy cái FSM ngộ quá!

            Comment


            • #7
              Nguyên văn bởi nam_bkfet Xem bài viết
              tình hình là vẫn không được bạn ah.
              Nhưng nếu mình thay đổi đoạn code dưới 1 chút thì sẽ được

              và mình ko hiểu tại sao nó lại được nữa .Bạn nào biết chỉ giùm mình xem nó đúng và sai ở chỗ nào với ((((
              Theo nhận xét của tôi thì Quartus có lỗi ở điểm này. Bạn nên dùng simulation khác thử xem.
              Chúc một ngày vui vẻ
              Tony
              email : dientu_vip@yahoo.com

              Comment


              • #8
                Hehe thật tình mà nói thì cũng không biết sai gì.
                1) Bạn mô phỏng thử
                2) Bạn dùng RTL viewer coi thử mạch của bạn tổng hợp ra gì
                3) Dùng tiếp Technology Map viewer coi thử Quartus tổng hợp mạch của bạn ra như thế nào
                4) Không loại trừ trường hợp Quartus bị lỗi

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X