Implementacja maszyny stanów w VHDL z użyciem Quartus 5.1 i EPM7128
Re: Quartus 5.1, EPM7128 (długawe...)
--------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY Test_IO IS
PORT( clk : IN STD_LOGIC;
rst : IN STD_LOGIC;
Din : IN STD_LOGIC_VECTOR(1 downto 0);
Dout : OUT STD_LOGIC_VECTOR(3 downto 0)
);
END Test_IO;
ARCHITECTURE Test_IO_architecture OF Test_IO IS
TYPE t_state IS ( s0, s1, s2, s3 );
SIGNAL state, state_nx: t_state;
BEGIN
PROCESS ( clk, rst )
BEGIN
IF rst = '0' THEN
state <= s0; -- resetowanie ukladu / start maszyny
ELSIF ( clk'EVENT and clk = '1' ) THEN
state <=
PROCESS ( state, Din )
VARIABLE tmp1: STD_LOGIC_VECTOR(1 downto 0);
VARIABLE tmp2: STD_LOGIC_VECTOR(1 downto 0);
BEGIN
CASE state IS
WHEN s0 =>
state_nx <= s1;
WHEN s1 => -- przepisanie 1-ej czesci adresu
tmp1 := Din;
state_nx <= s2;
WHEN s2 => -- przepisanie 2-ej czesci adresu
tmp2 := Din;
state_nx <= s3;
WHEN s3 => -- przepisanie czesci adresu na wyjscie
Dout <= tmp1 & tmp2;
state_nx <= s3;
END CASE;
END PROCESS;
END Test_IO_architecture;
-----------------------------------------
Na symulacji wygląda wszystko bardzo ładnie, ale zastanawia mnie
warning:
"Info: Found combinational loop of 1 nodes".
Poniżej wybrana część z komilacji projektu:
-----------------------------------------
Info:
*****************************************************************
Info: Running Quartus II Fitter
Info: Version 5.1 Build 213 01/19/2006 Service Pack 1 SJ Web Edition
Info: Processing started: Thu Feb 23 17:00:56 2006
Info: Command: quartus_fit --read_settings_files=off
--write_settings_files=off Test1 -c Test1
Info: Selected device EPM7128SLC84-15 for design "Test1"
Info: Quart
Czy mam się tym przejmować - o co chodzi z grubsza wiem - ale nie mam
pomysłu na wyeliminowanie przyczyny.
Pozdrawiam,
Grzegorz Kępiński
========
Path: news-archive.ic
From: "JA" <j_andrWYTNIJTO_at_nospam_freenet.de>
Subject: Re: Quartus 5.1, EPM7128 (długawe...)
Date: 24 Feb 2006 17:00:29 +0100
"Grzegorz Kępiński":
Mam następujący problem:
zobacz w quartus rtl view [tools] czy dostales to, czego oczekujesz;
moim zdaniem sa tu pewne niezgrabnosci, asynchroniczny reset,
rejestry jako latche i stany s1-s3 jako latch-enable;
trudnosci przy pierwszym uzywaniu hdl biora sie stad [miedzy innymi],
ze konstrukcje przydatne w modelowaniu/symulacji wykorzystuje
sie takze do syntezy;
ja akurat znam vhdl jedynie z widzenia, wiec moja poprawka
moze wygladac topornie z punktu widzenia skladni, ale daje
po syntezie obrazek, jaki chyba realizuje to, co opisales
na pocza
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY test_io IS
PORT(
clk : IN STD_LOGIC;
rst : IN STD_LOGIC;
Din : IN STD_LOGIC_VECTOR(1 downto 0);
Dout : OUT STD_LOGIC_VECTOR(3 downto 0)
);
END Test_IO;
ARCHITECTURE Test_IO_architecture OF Test_IO IS
TYPE t_state IS ( s0, s1, s2, s3 );
SIGNAL state, state_nx: t_state;
signal tmp1: STD_LOGIC_VECTOR(1 downto 0);
signal tmp2: STD_LOGIC_VECTOR(1 downto 0);
signal D: STD_LOGIC_VECTOR(3 downto 0);
BEGIN
PROCESS ( clk, rst )
BEGIN
IF rst = '0' THEN
state <= s0; -- resetowanie ukladu / start maszyny
ELSIF ( clk'EVENT and clk = '1' ) THEN
state <= state_nx; -- przejscie do nastepnego stanu maszyny
ELSE
state <= state;
END IF;
END PROCESS;
PROCESS ( state, Din )
-- VARIABLE tmp1: STD_LOGIC_VECTOR(1 downto 0);
-- VARIABLE tmp2: STD_LOGIC_VECTOR(1 downto 0);
BEGIN
CASE state IS
WHEN s0 =>
state_nx <= s1;
WHEN s1 =>
-- tmp1 := Din;
state_nx <= s2;
WHEN s2 =>
-- tmp2 := Din;
state_nx <= s3;
WHEN s3 =>
-- Dout <= tmp1 & tmp2;
state_nx <= s3;
END CASE;
END PROCESS;
process (clk)
begin
if ( clk'E