2013-12-08 46 views
0

我做了這個計數器,我相信它應該可以工作,但是我的矢量波形文件卻說不然。 y只是顯示爲先發球員4位數這是沒有意義的爲什麼不會這個VHDL計數器計數

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity counter is generic (
    startnum : natural := 0; 
    N : natural := 16 
); port ( 
    --Inputs 
    EN  : in std_logic; 
    synchr : in std_logic; 
    asyncr : in std_logic; 
    dir  : in std_logic; -- 0 for count down 1 for count up. 
    clk  : in std_logic; 
    --Outputs 
    Y  : out natural range startnum to n-1 
); 
end entity; 

architecture counter_v1 of counter is 
    signal cntconst : integer; 
begin 
    process (dir)    --dir in sensitivity list as when this changes we want this process to run. 
    begin 
     if (dir = '0') then 
      cntconst <= -1;     --this will count down when added onto to the counter value 
     end if; 
     if (dir = '1') then 
      cntconst <= 1; 
     end if; 
    end process; 

    process (asyncr, clk) 
     variable countvar : integer range startnum to n-1;--I tried to just use y but for some reason it won't allow that. 
    begin 
     if (en = '0') then 
     else 
      if (asyncr = '1') then 
       countvar := 0; 
      else 
      --if (clk = '1') then 
       --if (synchr = '1') then 
        --countvar := 0; 
       --end if; 
      --end if; 
      end if; 
      if (cntconst < n-1) then 
       if (dir = '1') then 
        countvar := countvar + cntconst; 
       end if; 
      end if; 
      if (cntconst > startnum) then 
       if (dir = '0') then 
        countvar := countvar + cntconst; 
       end if; 
      end if; 
     end if; 
     y <= cntconst; 
    end process; 
end counter_v1; 

任何幫助將是非常美妙......我在一個總損失在這一點上 謝謝。

回答

3

您錯過了rising_edge(clk)的檢查,您的同步過程可以簡化。嘗試:

architecture counter_v1 of counter is 
    signal y_int: natural range y'range; 
begin 
    y <= y_int; 

    process (asyncr, clk) 
    begin 
     if(asyncr = '1') then 
      y_int < = 0; 
     elsif(rising_edge(clk)) then 
      if(en = '1') then 
       if(dir = '1') then 
        if(y_int < y_int'high) then 
         y_int < = y_int + 1; 
        end if; 
       else 
        if(y_int > y_int'low) then 
         y_int <= y_int - 1; 
        end if; 
       end if; 
      end if; 
     end if; 
    end process; 
end architecture; 

我做了一些改動,以使代碼的行爲更像是一個FPGA邏輯單元:

  • 刪除同步復位:通常情況下,你只需要一個類型的重置
  • 感動en檢查裏面rising_edge(clk)檢查:en通常是一個時鐘使能,所以它不應該影響異步復位
+0

這是更整潔,更容易遵循!出於某種原因,它給我一個編譯錯誤,雖然錯誤(10500):Counter.vhd(39)附近的文本「<」的VHDL語法錯誤;期待「(」,或「'」或「。」 我真的不明白爲什麼......任何想法? – Andeeh

+0

@Andeeh哎呀!我的代碼試圖從'out'端口讀取。修復,我沒有VHDL編譯器,所以希望沒有更多的問題。 – godel9

3

你有de將Y定爲0到15的自然範圍。這將很適合4位!

2

注意的是,在原始代碼,輸出Y基於推動:

y <= cntconst; 

其中cntconst僅由輸入dir導出並看起來像一個內部方向指示,並且因此不是countvar即應該是反制狀態。由於cntconst是整數範圍且可以是-1,其中Y僅爲自然範圍,所以會存在範圍違規。