2017-04-25 3 views
1

두 가지 파일 VHDL 프로젝트가있어서 초보자가 어려움을 겪고 있습니다.VHDL (Xilinx toolchain) "배열 트리밍"으로 scuppered되었습니다.

기본 직렬 포트 모듈 (송신 전용) 모듈을 구동하기 위해 시스템 클럭을 사용하고 30 비트 클럭 분배기 (그 중 비 연속 비트 수가 적음)를 사용합니다. 주기적으로 8 비트 문자.

합성 과정에서 필수적인 신호 중 많은 부분이 옵티 마이저에 의해 제거되는 것으로 보입니다. 예상하지 못했던 것입니다.

최상위 파일 "Glue.vhd"...

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

entity Glue is 
    port(
     clk : in std_logic; 
     tx : out std_logic; 
     LED : out std_logic_vector(1 downto 0) 
     ); 
end entity Glue; 

architecture behavioural of Glue is 
    signal divider : unsigned(29 downto 0); 
begin 
    LED(1) <= '0'; 

    ser_tx : entity SerialTX 
    port map (
      baud_clk => divider(12), 
      byte_to_transmit => std_ulogic_vector(divider(29 downto 22)), 
      poke => divider(20), 
      busy => LED(0), 
      serial_out => tx 
      ); 

    clocker : process(clk) 
    begin 
     IF(rising_edge(clk)) then 
      divider <= divider + 1; 
     END IF; 
    end process clocker; 
end architecture behavioural; 

SerialTX.vhd 합성에서

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.numeric_std.all; 

entity SerialTX is 
    port (
     baud_clk   : in std_logic; 
     byte_to_transmit : in std_ulogic_vector(7 downto 0); --the byte that we want to transmit 
     poke    : in std_logic;      --a rising edge causes the byte to be sent out 
     busy    : out std_logic;      --wait for this to go low before transmiting more data 
     serial_out  : out std_logic      --the RS232 serial signal 
     ); 
end SerialTX; 

architecture behavioural of SerialTX is 
    signal bit_buf    : unsigned(9 downto 0); --(STOP bit) & (8 data bits) & (START bit) 
    signal internal_busy   : std_logic; 
    shared variable bit_counter : integer range 0 to 10; 
begin 
    busy <= internal_busy; 

    busy_handler : process(poke) is 
    begin 
     if(rising_edge(poke)) then 
      internal_busy <= '1'; 
     end if; 
     if(bit_counter = 0) then 
      internal_busy <= '0'; 
     end if; 
    end process busy_handler; 

    do_transmit : process(baud_clk) is 
    begin 
     if(rising_edge(baud_clk)) then 
      if((internal_busy = '1') and (bit_counter = 0)) then 
       bit_counter := 10; 
       bit_buf <= unsigned('1' & byte_to_transmit & '0'); 
      end if; 

      serial_out <= bit_buf(0); 
      bit_buf <= bit_buf srl 1; 
      bit_counter := bit_counter - 1; 
     end if; 
    end process do_transmit; 
end behavioural; 

경고를 (오류가 당신을 신경 쓰지) 프로세스는 다음과 같습니다.

WARNING:Xst:647 - Input <byte_to_transmit> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved. 
WARNING:Xst:1710 - FF/Latch <bit_buf_9> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_8> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_7> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_6> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_5> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_4> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_3> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_2> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_1> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_0> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <serial_out> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:2404 - FFs/Latches <bit_buf<9:0>> (without init value) have a constant value of 0 in block <SerialTX>. 
WARNING:Xst:1710 - FF/Latch <serial_out> (without init value) has a constant value of 0 in block <SerialTX>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:2677 - Node <divider_21> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_22> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_23> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_24> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_25> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_26> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_27> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_28> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_29> of sequential type is unconnected in block <Glue>. 
WARNING:Route:455 - CLK Net:divider<20> may have excessive skew because  0 CLK pins and 1 NON_CLK pins failed to route using a CLK template. 
WARNING:Route:455 - CLK Net:divider<12> may have excessive skew because  0 CLK pins and 1 NON_CLK pins failed to route using a CLK template. 

소스 코드의 연결을 추적 한 결과 실수를 발견 할 수 없습니다. 과제에서 다루지 않은 일부 모서리/코너 사례가 누락되었다는 느낌을받습니다.

"(초기화 값 없음)"으로 표시된 항목 기본값을 사용하지 않음으로써 교정하려고했습니다. "블록으로 연결되지 않은"것으로 표시된 것들은 어리둥절 해합니다.

신디사이저를 만족 시키려면 어떻게해야합니까?

+0

사용하지 않는 비트가 다듬어 져 있습니다. 문제가 무엇입니까? 그것은 시뮬레이션에서했던 것과 똑같은 일을 할 것이고, 거기에서 제대로 작동 할 것입니다, 그렇죠? –

+0

@BrianDrummond, 훌륭한 질문입니다. 어떻게해야할지 생각하면 대답하겠습니다. :) – Wossname

+2

귀하의 접착제는 ser_tex 구성 요소 인스턴스화에서 SerialTX 엔터티의 가시성이 부족합니다. 직접 볼 수는 없습니다. 고전적인 치료법은 선택된 이름 인'entity work.SerialTX - 선택된 이름을 만들기위한 접두사 접두어 '로 SerialTX를 볼 수있게하는 것입니다. 그것은 표시되지 않은 초기 경고에서 밝혀야합니다. SerialTX를 연결하지 않으면 드라이브 만 제거됩니다. Brian은별로 미묘하지는 않지만, 신디사이저는 일반적으로 기능 코드가 제공 될 것으로 기대합니다. 관계없는 괄호의 일부를 저장하면 실제로 필요할 때를 알 수 없습니다. – user1155120

답변

3

FPGA를 합성하고로드 할 때 왜 작동하지 않는지 추측하는 것보다 더 쉽습니다. 디자인을 시뮬레이션 할 수 있습니다. 또한 simpler으로 만들 수 있습니다.

10 비트의 bit_buf 시프트 레지스터가 있기 때문에 bit_counter를 제거 할 수 있습니다.

이것이 작동하는 방식은 '비어있는'것으로 인식되는 기본 패턴을 설정하고 해당 패턴은 bit_buf를 이동 한 결과로 구성된다는 것입니다.

'0'의 '왼쪽'시프트로 시프트 아웃의 아티팩트 이외의 패턴은 발생하지 않습니다. 시프트 레지스터는 '0'을 시프트하고 정지 비트가 가장 오른쪽 위치 ("0000000001")에 멈 춥니 다. 오른쪽에있는 '1'은 송신 대기 표시를 유지합니다.

유휴 패턴의 아이디어는 srl을 사용하여 원래 디자인을 디버깅하는 동안 '0'으로 채워진 채로 남습니다. 점진적으로 변화하는 양은 '학습'하면서 왜 그렇게 설계 했는가하는 법은 금지되어 있습니다. 첫 번째 원칙을 살펴보고 그에 기반한 구현을 설명합니다.

처음으로 디자인을 시뮬레이트하려면 증가분이 나올 수 있도록 나누기의 초기 값을 포함하고 Poke와 byte_to_transmit에 대한 디바이더 탭 오프를 이동하여 시뮬레이션 시간을 40ms 근처로 줄 이도록 변경하십시오 다음을 위해.

SerialTx의 인스턴스 생성은 선택된 이름을 사용하며, 시뮬레이터는 때때로 합성 도구에 제공되는 것처럼 암시 적으로 use work.all; 컨텍스트 항목을 포함하지 않습니다.

추가 테스트 벤치와 디자인의 최대 마크, bit_counter없이 :

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

entity SerialTX is 
    port (
     baud_clk:   in std_logic; 
     byte_to_transmit: in std_logic_vector(7 downto 0); -- before -2008 
     poke:    in std_logic; 
     busy:    out std_logic; 
     serial_out:  out std_logic 
    ); 
end entity SerialTX; 

architecture foo of SerialTX is 
    -- signal bit_buf:   unsigned(9 downto 0); 
    constant BB_IDLE:  std_logic_vector (9 downto 0) := "0000000001"; 
    signal bit_buf:   std_logic_vector (9 downto 0) := BB_IDLE; 
    -- signal internal_busy: std_logic; 
    signal poke_reg:  std_logic_vector (0 to 2) := "000"; 
    signal start_tx:  std_logic; 

    -- shared variable bit_counter: integer range 0 to 10; 
begin 
    -- busy <= internal_busy; 
poke_filt: 
    process (baud_clk) -- translate poke to baud_clk domain 
    begin 
     if rising_edge (baud_clk) then 
      poke_reg <= poke & poke_reg (0 to 1); 
     end if; 
    end process; 

    -- front edge of poke in baud_clk_domain: 
    start_tx <= poke_reg(0) and poke_reg(1) and not poke_reg(2); 

-- busy_handler: 
--  process (poke) is 
--  begin 
--   if rising_edge (poke) then 
--    internal_busy <= '1'; 
--   end if; 
--   if bit_counter = 0 then 
--    internal_busy <= '0'; 
--   end if; 
--  end process busy_handler; 

busy_handler: 
    process (baud_clk) 
    begin 
     if rising_edge (baud_clk) then 
      if start_tx = '1' and bit_buf = BB_IDLE then 
       busy <= '1'; 
      elsif bit_buf = BB_IDLE then 
       busy <= '0'; 
      end if; 
     end if; 
    end process; 

do_transmit: 
    process (baud_clk) 
    begin 
     if rising_edge(baud_clk) then 
      if start_tx = '1' and bit_buf = BB_IDLE then 
       bit_buf <= '1' & byte_to_transmit & '0'; 
      elsif bit_buf /= BB_IDLE then 
       -- bit_buf <= bit_buf srl 1; 
       -- srl UNDEFINED in package std_logic_1164 
       bit_buf <= '0' & bit_buf(9 downto 1); -- shift right one 
      end if;         -- zero fill 
     end if; 
    end process; 

-- do_transmit: 
--  process (baud_clk) 
--  begin 
--   if rising_edge(baud_clk) then 
--    if internal_busy = '1' and bit_counter = 0 then 
--     bit_counter := 10; 
--     bit_buf <= unsigned ('1' & byte_to_transmit & '0'); 
--    end if; 
--    serial_out <= bit_buf(0); 
--    bit_buf <= bit_buf srl 1; 
--    bit_counter := bit_counter - 1; 
--   end if; 
--  end process do_transmit; 

    serial_out <= bit_buf(0); -- ADDED, no 11th flip flop 

end architecture; 

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

entity Glue is 
    port (
     clk: in std_logic; 
     tx: out std_logic; 
     LED: out std_logic_vector(1 downto 0) 
    ); 
end entity Glue; 

architecture behavioural of Glue is 
    signal divider: unsigned(29 downto 0) := (others => '0'); -- init val 
begin 
    LED(1) <= '0'; 

ser_tx: 
    entity work.SerialTX -- ADDED work prefix to make selected name 
     port map (
      baud_clk => divider(12), 
     -- byte_to_transmit => std_ulogic_vector(divider(29 downto 22)), 
      byte_to_transmit => std_logic_vector(divider(25 downto 18)), 
      poke => divider(17), -- WAS divider(20), for simulation 
      busy => LED(0), 
      serial_out => tx 
     ); 
clocker: 
    process (clk) 
    begin 
     if rising_edge(clk) then 
      divider <= divider + 1; 
     end if; 
    end process clocker; 
end architecture behavioural; 

library ieee; 
use ieee.std_logic_1164.all; 

entity glue_tb is 
end entity; 

architecture fum of glue_tb is 
    signal clk:  std_logic := '0'; 
    signal tx:  std_logic; 
    signal led:  std_logic_vector(1 downto 0); 
begin 
DUT: 
    entity work.glue 
     port map (
      clk => clk, 
      tx => tx, 
      led => led 
     ); 
CLOCK: 
    process 
    begin 
     wait for 10 ns; 
     clk <= not clk; 
     if now > 40 ms then 
      wait; 
     end if; 
    end process; 
end architecture; 

40 ms 동안 실행하면 제공 :

glue_tb_40ms.png

닫기를 byte_to_transmit 값 05까지 :

glue_tb_05.png

srl이 std_logic_1164 패키지에서 제공되지 않고 std_ulogic_vector를 사용하여 대체되었으므로 std_logic_vector가 -2008의 부속 유형이되었습니다.

poke

는 baud_clk 영역으로 여과하고, 단일 클록주기 이벤트를 생성하는 세트 아이들 패턴이 다시 bit_buf에서 검출 될 때 연속적으로 '0'을 '1'로 internal_busy.

참고 busy은 10 클록 (시작 비트, 8 데이터 비트 및 정지 비트)에 대해 '1'이며 serial_out에 대한 11 번째 플립 플랍이 삭제되었습니다.

이것은 ghdl 사용하여 시뮬레이션 된 바이너리는 here을 다운로드 할 수 있습니다. 파형 디스플레이는 gtkwave입니다. 둘 다 GPL에 따라 라이센스가 부여됩니다. 메모리, 레지스터 및 래치, 합성에 유용한 언어의 서브 세트의 일부 -

VHDL 언어 순서 논리 추론을위한 구조의 특정 집합을 가진다.적합한 VHDL의 상위 집합 또는 하위 집합은 일반적으로 대상 플랫폼 실리콘에 기반한 제한을 포함하는 합성 공급 업체에서 지원합니다. 적격성 및 지원되는 구성은 합성 업체 문서에서 찾을 수 있습니다. VHDL 언어 자체는 IEEE Std 1076-2008에 정의되어 있지만 보편적 인 지원은 -1993 또는 -2002 개정판에서만 발견됩니다.

공유 변수에 대한 독점 액세스를 보장하고 결과적으로 합성에 적합하지 않게되는 공유 변수는 메소드를 통해 액세스 할 수있는 보호 된 유형이되었습니다.

은 바로 3 비트 poke_reg 시스템이 제대로 감지 할 수있는 포크 높은 펄스 지속 시간은 순서대로 3 baud_clk 가장자리보다 더해야한다는 의미라고 생각 I에 있습니까? 포크 신호를 에지 트리거로 만들 수 있습니까? - Wossname 22 시간 전

scary_jeff 's method가 찌를 위해 작동보다 짧은 또는 세 baud_clk 간격으로 동일한 이벤트를 (전송).

SerialTx에서 busy (internal_busy)를 사용하지 않고 실제 전송 중에 baud_clk 기간 (bauds) 간격 만 처리합니다.

이 (두 플립의 XOR 퍼) 안전하고 찌 (전송)의 상승 에지 사이의 전체 구간 작동 비지 신호 internal_busy 끝 생성 할 수있다 :

architecture fum of SerialTX is 
    constant BB_IDLE:  std_logic_vector (9 downto 0) := "0000000001"; 
    signal bit_buf:   std_logic_vector (9 downto 0) := BB_IDLE; 
    signal poke_event:  std_logic := '0'; -- Added 
    signal internal_busy: std_logic := '0'; -- Re-Added 
    signal poke_reg:  std_logic_vector (0 to 1) := "00"; 
    signal start_tx:  std_logic; 
    signal end_event:  std_logic := '0'; -- Added 
begin 

    busy <= poke_event xor end_event; -- ADDED, was FF output 

pokeevent: 
    process (poke) 
    begin 
     if rising_edge(poke) then 
      poke_event <= not poke_event; 
     end if; 
    end process; 
poke_edge: 
    process (baud_clk) -- translate poke to baud_clk domain 
    begin 
     if rising_edge (baud_clk) then 
      poke_reg <= poke_event & poke_reg (0); 
     end if; 
    end process; 

    -- front edge of poke in baud_clk_domain: 
    start_tx <= poke_reg(0) xor poke_reg(1); -- CHANGED, when not equal 

endevent: 
    process (baud_clk) 
    begin 
     if rising_edge (baud_clk) then 
      if internal_busy = '1' and bit_buf = BB_IDLE then 
       end_event <= not end_event; 
      end if; 
     end if; 
    end process; 

busy_handler: -- CHANGED 
    process (baud_clk) 
    begin 
     if rising_edge (baud_clk) then 
      if start_tx = '1' and bit_buf = BB_IDLE then 
       internal_busy <= '1'; 
      elsif bit_buf = BB_IDLE then 
       internal_busy <= '0'; 
      end if; 
     end if; 
    end process; 

do_transmit: 
    process (baud_clk) 
    begin 
     if rising_edge(baud_clk) then 
      if start_tx = '1' and bit_buf = BB_IDLE then 
       bit_buf <= '1' & byte_to_transmit & '0'; 
      elsif bit_buf /= BB_IDLE then 
       bit_buf <= '0' & bit_buf(9 downto 1); 
      end if; 
     end if; 
    end process; 

    serial_out <= bit_buf(0); 

end architecture; 

을 이는 범 다음 internal_busy 신호 없음의 후방 에지가 발생할 때 (또는 전송하지 않을 경우에 bit_buf 아이들 패턴을 구별하는)을 결정하는데 사용된다

glue_tb_short_poke_long_busy.png

참고있다. 찌 신호 찌의 폭을 증명하기 위해 접착제를 수정하여 단축 된

(전송)

임의적 일 수

architecture behavioural of Glue is 
    signal divider: unsigned(29 downto 0) := (others => '0'); -- init val 
    signal poke: std_logic := '0'; -- ADDED 
begin 
    LED(1) <= '0'; 

    poke <= divider(17), '0' after 10 us; -- ADDED 
ser_tx: 
    entity work.SerialTX -- ADDED work prefix to make selected name 
     port map (
      baud_clk => divider(12), 
      -- byte_to_transmit => std_ulogic_vector(divider(29 downto 22)), 
      byte_to_transmit => std_logic_vector(divider(25 downto 18)),-- sim 
      poke => poke, -- WAS divider(20), for simulation 
      busy => LED(0), 
      serial_out => tx 
     ); 

는 (NO, 새로운 신호 찌에 SINGLESHOT 나타내는 그 복합 파형 합성 아니다 가능).

+0

GHDL을 사용해 보겠습니다. 팁 주셔서 감사합니다. – Wossname

+0

당신의 3 비트 poke_reg 시스템이 올바르게 검출되기 위해서는 poke high pulse duration이 3 baud_clk edge보다 길어야한다는 것을 의미한다고 생각하십니까? 포크 신호를 에지 트리거로 만들 수 있습니까? – Wossname

+0

나는 나의 방법이 레지스터의 최소 클럭 펄스 폭까지 어떤 길이의'send' 펄스에 대해서 잘 작동 함을 확신한다. 그렇지 않다면, 왜? –

5

user1155120은 라이브러리를 지정하거나 구성 요소 바인딩을 지정해야한다는 점에서 옳은 반면, 도구는 로직이 최적화되는 곳이기 때문에 올바른 엔티티를 찾았습니다.

것부터 먼저, 함께

use IEEE.numeric_std.all; 
use ieee.std_logic_unsigned.all; 

를 사용하지 마십시오. 레거시 코드로 작업 할 때를 제외하고는 numeric_std를 사용해야합니다. 당신은 당신의 카운터 변수를 초기화하지 않고 그것을 잘 계산하지 않습니다

  • :

    진짜 문제는 두 가지입니다.

  • 입력 데이터가 병렬로드 시프트 레지스터에 입력되지 않으므로 트리밍됩니다.

카운터에서 어떤 값으로 시작 하시겠습니까? IIRC에서는 초기화되지 않은 정수 유형이 해당 범위에서 가장 낮은 유효 값을 갖습니다. 그러나 어쨌든 시작을 명시 적으로 만드는 것이 좋습니다. 그러나 실제로는 FPGA에 정수가 없습니다. 단지 춥고 단단한 플립 플롭입니다. 0에서 10의 범위는 적어도 4 비트를 사용하므로 4 개의 플립 플롭을 사용합니다. 그러나 0에서 "-1"로 이동하면 언더 플로우가 발생하여 예상 한 10 개 대신 15 개로 줄 바꿈됩니다. internal_busy은 플립 플롭이지만 초기화되지 않았습니다. 실제로는 비동기 적으로 재설정 된 bit_counter이기 때문에 의도했다.이 비동기식 리셋 자체는 문제가되며 의도 한 바가 거의 없습니다.

busy_handler : process(poke) is -- <-- wrong sensitivity list 
begin 
    if(rising_edge(poke)) then 
     internal_busy <= '1'; 
    end if; 
    if(bit_counter = 0) then -- <-- not clocked 
     internal_busy <= '0'; 
    end if; 
end process busy_handler; 

클럭 및 조합 코드가 혼합되어 있습니다. internal_busy이 하드웨어에서 병렬로 실행되지만 시뮬레이션 도구는 변경 사항이 poke 인 경우에만 업데이트를 표시하기 때문에 시뮬레이션이 꺼집니다. (- 당신이 어떤을주지 않았다 자일링스 도구 가정 값!)이 논리없이

-- can never happen, because bit_counter = 0 means internal_busy is forced to '0' 
if((internal_busy = '1') and (bit_counter = 0)) then 
    bit_counter := 10; 
    bit_buf <= unsigned('1' & byte_to_transmit & '0'); 
end if; 

, bit_buf은 참으로 9'h000 될 것입니다. 이것은 다음 줄이 당신에게 시도 할 것입니다 :

WARNING:Xst:1710 - FF/Latch <bit_buf_9> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_8> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_7> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_6> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_5> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_4> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_3> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_2> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_1> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1895 - Due to other FF/Latch trimming, FF/Latch <bit_buf_0> (without init value) has a constant value of 0 in block <ser_tx>. This FF/Latch will be trimmed during the optimization process. 
WARNING:Xst:1710 - FF/Latch <serial_out> (without init value) has a constant value of 0 in block <SerialTX>. This FF/Latch will be trimmed during the optimization process. 
  1. bit_buf_9 끊임없이 0이고 하드 제로 (논리 또는 직물)로 대체됩니다. 따라서 플립 플롭은 불필요하며 트림 될 수 있습니다.
  2. bit_buf_{8..0}은 다른 플립 플롭 (여기서는 bit_buf_9)과 동일하다고 판명되었습니다. 그러나 플립 플롭이 다듬어 져 있으므로 플립 플립도 잘립니다.
  3. bit_buf_9serial_out 피드도 트리밍됩니다.

다음은 오류 메시지의 나머지 :

WARNING:Xst:647 - Input <byte_to_transmit> is never used. This port will be preserved and left unconnected if it belongs to a top-level block or it belongs to a sub-block and the hierarchy of this sub-block is preserved. 
WARNING:Xst:2677 - Node <divider_21> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_22> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_23> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_24> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_25> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_26> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_27> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_28> of sequential type is unconnected in block <Glue>. 
WARNING:Xst:2677 - Node <divider_29> of sequential type is unconnected in block <Glue>. 
  1. byte_to_transmit 미사용이고 최상위 블록의 일부는, 그것이 유지되지 않을 것이다.
  2. divider(29 downto 22)byte_to_transmit에 연결됩니다. 그 포트는 제거 될 것이므로, 마지막으로 사용 된 플립 플롭 뒤의 모든 플립 플립 플롭, divider(20)을 최적화 할 수 있습니다.

시계 경고 :

WARNING:Route:455 - CLK Net:divider<20> may have excessive skew because  0 CLK pins and 1 NON_CLK pins failed to route using a CLK template. 
WARNING:Route:455 - CLK Net:divider<12> may have excessive skew because  0 CLK pins and 1 NON_CLK pins failed to route using a CLK template. 
  1. divider(20)divider(12)는 시계로 사용됩니다.
  2. divider(20)divider(12)은 논리 : LUT 및 하나 이상의 슬라이스 내부의 플립 플롭에서 생성됩니다. FPGA에 따라 클럭 라우팅 리소스로 피드백 될 수있는 몇 가지가 있습니다.
  3. 귀하의 경우 도구는 이러한 신호를 클럭 라우팅 리소스에 라우팅하는 방법을 찾지 못했고 논리 신호용으로 일반적으로 예약 된 리소스를 사용해야하므로 스큐가 과도해질 수 있습니다.

    clk_en_p: process (clk) is 
    begin 
    
    if (rising_edge(clk)) then 
        if (clk_en = '1') then 
         my_signal <= assignment; 
        end if; 
    end if; 
    end process clk_en_p; 
    

    모두 모두, 당신은 작성해야 : 시계 대신 할 수 있습니다로

이 클럭 오류는 pokebaud_clk를 사용하여 일반적인 시계 두 모듈에 대한 clk과 2를 사용 1. 방지 할 수 있습니다 Brian Drummond가 제안한 것처럼 합성 이전에 테스트 벤치와 디자인을 시뮬레이션하십시오.

구현을 작성하기 전에 테스트 벤치의 일부를 작성하는 것이 종종 도움이됩니다. 구성 요소의 인터페이스와 실제로 작성하기 전에 어떻게 반응하는지 예상해야하기 때문입니다.

+0

나는 다시 기본 원칙으로 돌아가서 다시 시작해야합니다, 전 완전히이 언어의 많은 오해가있다. 메시지를 자세히 분석해 주셔서 감사합니다. – Wossname