我試圖設計一個兩位數的計數器,計數在00和99之間以循環的方式向上和向下。然而,無論我嘗試什麼,我都無法使十位數字與第一位數字保持同步。我的成績,現在給我這樣的東西:級聯計數器的十進制數字增量太晚
08 - > 09 - > 00 - > 11 ... 18 - > 19 - > 10 - > 21
和
21 - > 20 - > 29 - > 18 ... 11 - > 10 - > 19 - > 08
由此看來,第一個數字的溢出延遲達到十位數。我嘗試了幾件事來嘗試解決這個問題。提供任何有利結果的唯一方法是添加一個額外的if語句,以便儘早將溢出狀態發送給一個狀態,但這只是一個表面修復。如果我在第一個數字是8或0的時候停下了計數器,並再次啓動它,我會回到以前的同樣的問題。
我也嘗試製作一個額外的「同步器」模塊,我想也許我可以設置它,所以即使它們不同步,它們也會顯示爲好像它們是同步的,但它沒有改變一切。
我一直在努力解決這個問題超過兩個星期,我在我的智慧結束。
這是我的代碼櫃檯和同步器,如果有人想檢查出來,任何和所有的幫助表示讚賞。
**我使用VHDL,與Vivado 2015.2
計數器模塊爲單個數字編程Zybo Digilent公司董事會,溢出成爲使十年位數。
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use ieee.numeric_std.all;
entity counter is
generic(N : positive := 4);
port(
AR : in STD_LOGIC;
clk : in STD_LOGIC;
ld : in STD_LOGIC;
en : in STD_LOGIC;
up_dn : in STD_LOGIC;
D : in STD_LOGIC_VECTOR(N - 1 downto 0);
overflow : out STD_LOGIC;
Q : out STD_LOGIC_VECTOR(N - 1 downto 0);
sync_in : in STD_LOGIC;
sync_out : out STD_LOGIC
);
end counter;
architecture counter of counter is
signal Qt : std_logic_vector(N - 1 downto 0);
signal OvrFlw : std_logic;
signal sync : std_logic;
begin
process(clk, AR)
begin
if (AR = '1') then
Qt <= (others => '0');
OvrFlw <= '0';
sync <= sync_in;
elsif (clk = '1' and clk'event) then
if ld = '1' then
Qt <= D;
sync <= sync_in;
elsif en = '1' then
if up_dn = '0' then -- if counting down
if (unsigned(Qt) = 0) then
Qt <= "1001";--(others => '1');
OvrFlw <= '1';
sync <= sync_in and en;
--elsif (unsigned(Qt) = 1) then
-- Qt <= std_logic_vector(unsigned(Qt) - 1);
-- OvrFlw <= '1';
else
Qt <= std_logic_vector(unsigned(Qt) - 1);
OvrFlw <= '0';
sync <= sync_in and en;
end if;
else -- if counting up
if (unsigned(Qt) = 2**N-7) then
Qt <= (others => '0');
OvrFlw <= '1';
sync <= sync_in and en;
--elsif (unsigned(Qt) = 2**N-8) then
-- Qt <= std_logic_vector(unsigned(Qt) + 1);
-- OvrFlw <= '1';
else
Qt <= std_logic_vector(unsigned(Qt) + 1);
OvrFlw <= '0';
sync <= sync_in and en;
end if;
end if;
end if;
end if;
end process;
sync_out <= sync;
Q <= Qt;
overflow <= OvrFlw;
end counter;
下面是我試圖放在一起的同步器的代碼。不知道它是否真的相關,但我想我會把它放在以防萬一。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Synchronizer is
generic(N : positive := 4);
Port (
MSB_Sync : in STD_LOGIC;
LSB_Sync : in STD_LOGIC;
MSB_Q : in STD_LOGIC_VECTOR(N-1 downto 0);
LSB_Q : in STD_LOGIC_VECTOR(N-1 downto 0);
MSB_Out : out STD_LOGIC_VECTOR(N-1 downto 0);
LSB_Out : out STD_LOGIC_VECTOR(N-1 downto 0));
end Synchronizer;
architecture Behavioral of Synchronizer is
begin
process (MSB_Sync, LSB_Sync)
begin
if ((MSB_Sync and LSB_Sync) = '1') then
MSB_Out <= MSB_Q;
LSB_Out <= LSB_Q;
end if;
end process;
end Behavioral;
什麼是if(無符號(Qt)= 2 ** N-7)那麼當N設置爲4以外時,應該這樣做? –