我有VHDL實現可以在板上工作,它檢測到序列01110,並且會產生一個2個時鐘計數的標誌。它還檢測重疊序列,以及011101110將兩次提升標誌。VHDL狀態機測試臺 - 在機器上工作,但不能在模擬機上工作
我檢查了我的實施與板上的邏輯分析儀,我相當有信心,它的工作原理。我在電路板上以10 kHz的頻率重複序列0111,它有一個100 MHz的時鐘,我用預分頻器將它的頻率調整到10 kHz。
我的問題是,嘗試使用模擬重新建立一個類似的情景時,我沒有得到任何輸出,從邏輯分析儀預計
試驗檯代號
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity test_FSM_prac4 is
-- Port ();
end test_FSM_prac4;
architecture Behavioral of test_FSM_prac4 is
component FSM_prac4 is
port (
inputSignal : in STD_LOGIC;
pushButton : in STD_LOGIC;
clk100mhz : in STD_LOGIC;
logic_analyzer : out STD_LOGIC_VECTOR (7 downto 0);
LEDs: out STD_LOGIC
); end component;
signal inputSignal : std_logic := '0';
signal pushButton: std_logic := '0';
signal clk100mhz: std_logic := '0';
signal logic_analyzer: std_logic_vector(7 downto 0);
signal LEDs : std_logic;
begin
uut : FSM_prac4 port map(
inputSignal => inputSignal,
pushButton => pushButton,
clk100mhz => clk100mhz,
logic_analyzer => logic_analyzer,
LEDs => LEDs
);
--generate clock 100mhz
clock_tic: process begin
loop
clk100mhz <= '0';
wait for 5ns;
clk100mhz <= '1';
wait for 5ns;
end loop;
end process;
input_changes: process begin
loop
inputSignal <= '0';
wait for 100us;
inputSignal <= '1';
wait for 100us;
inputSignal <= '1';
wait for 100us;
inputSignal <= '1';
wait for 100us;
end loop;
end process;
end Behavioral;
要顯示地圖平邏輯分析儀
logic_analyzer(0) <= masterReset;
logic_analyzer(1) <= newClock -- 10Khz Clock;
logic_analyzer(2) <= outputZ;
--FSM States
logic_analyzer(3) <= '1' when y = A ELSE '0';
logic_analyzer(4) <= '1' when y = B ELSE '0';
logic_analyzer(5) <= '1' when y = C ELSE '0';
logic_analyzer(6) <= '1' when y = D ELSE '0';
logic_analyzer(7) <= '1' when y = E ELSE '0';
如果有人可以直接向我在做什麼錯在測試平臺上,以及如何複製得到類似的結果作爲第一個圖像,因爲它表明,在模擬中,它始終保持在國家一併且新時鐘不翻轉意味着clk100mhz
在某種程度上沒有連接,但我無法弄清楚原因。
任何幫助是極大的讚賞,感謝你們
編輯:
我寫了一個簡單的程序來測試我的標時鐘
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity scaler_clk is
Port (
pushButton : in std_logic;
indicator : out std_logic;
clk100mhz : in STD_LOGIC;
clk10khz: out STD_LOGIC
);
end scaler_clk;
architecture Behavioral of scaler_clk is
signal clockScalers : std_logic_vector (12 downto 0):= (others => '0') ;
signal prescaler: std_logic_vector(12 downto 0) := "1001110001000";
signal newClock: std_logic := '0';
signal masterReset : std_logic;
begin
clk10khz <= newClock;
masterReset <= pushButton;
process (clk100mhz,masterReset) begin
if(masterReset <= '1') then <--- error occurs here
clockScalers <= "0000000000000";
newClock <= '0';
indicator <= '1';
elsif (clk100mhz'event and clk100mhz = '1')then
indicator <= '0';
clockScalers <= clockScalers + 1;
if(clockScalers > prescaler) then
newClock <= not newClock;
clockScalers <= (others => '0');
end if;
end if;
end process;
end Behavioral;
測試臺代碼
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity test_scaler_clk is
-- Port ();
end test_scaler_clk;
architecture Behavioral of test_scaler_clk is
component scaler_clk Port (
pushButton : in std_logic;
indicator : out std_logic;
--input clock
clk100mhz : in STD_LOGIC;
clk10khz: out STD_LOGIC
);end component;
signal clk100mhz: std_logic := '0';
signal clk10khz : std_logic;
signal pushButton: std_logic;
signal indicator : std_logic;
begin
uut: scaler_clk port map(
pushButton => pushButton,
indicator => indicator,
clk100mhz => clk100mhz,
clk10khz => clk10khz
);
pushButton <= '0';
clock_tic: process begin
loop
clk100mhz <= '0';
wait for 5ns;
clk100mhz <= '1';
wait for 5ns;
end loop;
end process;
end Behavioral;
即使雖然我將pushButton設置爲'0',但它仍然觸發masterReset
,任何人都知道爲什麼,這就是爲什麼10 kHz時鐘不工作
明顯的不同:日誌顯示時鐘和刺激的速度相同,但在結核病中它們的速率不同。現在我們不知道組件的內部,因此我們無法進一步追蹤這種差異。 –
是的,在板上我有一個100MHz的輸入時鐘,我把它縮小到10khz的輸出,然後反映在邏輯分析儀(1)上,我使用10khz時鐘作爲我的fsm –
我試圖模擬相同的事情在測試臺上通過產生100mhz時鐘。它應該顯示在TB上的邏輯分析儀(1)上一個10khz時鐘,但它沒有顯示。我想知道是因爲我的synthex還是我錯過了一些東西 –