Verilog ile D-LATCH oluşturamıyorum

Başlatan strom, 24 Şubat 2016, 14:08:09

strom

Herkese iyi günler.
Verilog ile FPGA board'u üzerinde D-LATCH oluşutrmaya çalışıyorum. Amacım D-LATCH'in Enable ve input(D) bacaklarını board üzerinde bulunan switchlere yönlendirmek ve çalışmasını test etmekti. Amacım çok basit bir gözlem yapmaktı ama ne yazıkki yapamadım. Çalışmalarımı vivado üzerinde yapıyordum ve sürekli hata almaya başladım.

Öncelikle D-LATCH'ı kapılarla kendim oluşuturmaya çalıştım. Bunun için aşağıdaki kodu yazdım ve sentezlemeye çalıştım.

module DLATCH(Q, D, E);
    output Q;
    input D, E;
    
    wire W1, W2, W3, W4;
    
not 
    (W1, D);
    
and
    (W2, W1, E),
    (W3, E, D);
    
xor
    (Q, W2, W4),
    (W4, Q, W3);
    
endmodule


Bu kod tarafından üretilen şematik doğru ancak karta yüklemek için bitstream oluştur dedğimde " Combinatorial Loop - 1 LUT cells form a combinatorial loop. This can create a race condition." hatasını veriyor. Bir kapının çıkışına diğer kapının girişine bağladığım için bu hatayı veriyor ama ztn D-LATCH yapmanın yolu bu. Race condition ztn Latch yapısının doğasında var. Race condition FPGA'ye fiziksel bir hasar verir mi? Anlamadığım başka bir hata mı yapıyorum?

Hadi bu durumu geçtim. Aşağıdaki kod ile D-LATCH oluşturmayı denedim. Bu sayede kendi D-LATCH yapısını kullanacaktı derleyici;

  
   module  D_latch (output reg Q,  input  enable, D);
    always  @ (enable, D)
    if  (enable) Q <= D; 
   endmodule   


Bunda da enable bacağını FPGA'in clock için ayrılmış bacağına bağlamadığım için hata verdi. Halbuki benim amacım enable'ı switch'e bağlayıp o şekilde değişimleri görmekti. Anladığım kadarıyla bu hatayı vermesini engelleybiliyormuşum ayarlardan ama benim merak ettiğim eğer bu şekilde çalıştırırsam FPGA'ye fiziksel olarak zarar verir miyim? Clock hattını filan bozarmıyım? İç yapısını hiç bilmiyorum FPGA'yin. O yüzden internetten okduuklarımdan tatmin edici bir sonuç çıkaramadım kendim için

MC_Skywalker

#1
Alldığın hata mesajını paylaşırmısın. Basys3 kullanıyorsan Atrix7 XC7A35T-1'in clock girişi W5 pininde ve 100Mhz.
Syntysize ettikten sonra pin planner ile pin ataması yapman gerekli ve pinler LVCMOS33 tipinde seçmelisin. Pin atamasından sonra yeniden implement gerekli zaten vivado uyarıyor.

strom

Hocam kapılarla latch oluşturduğumda verdiği hata
ERROR: [DRC 23-20] Rule violation (LUTLP-1) Combinatorial Loop - 1 LUT cells form a combinatorial loop. This can create a race condition. 
Timing analysis may not be accurate. The preferred resolution is to modify the design to remove combinatorial logic loops. 
To allow bitstream creation for designs with combinatorial logic loops (not recommended), use this command: set_property SEVERITY {Warning} [get_drc_checks LUTLP-1]. 
NOTE: When using the Vivado Runs infrastructure (e.g. launch_runs Tcl command), add this command to a .tcl file and add that file as a pre-hook for write_bitstream step for the implementation run. Q_OBUF_inst_i_2.

Uyarıda dediği gibi .xdc uzantılı bir dosyaya "set_property SEVERITY {Warning} [get_drc_checks LUTLP-1]" kodunu eklediğimde sadece uyarı vererek derlemyi yapıyor. Ancak FPGA'ye fiziksel bir zararı olabilir mi emin olmadığımdan yüklemiyorum. Fiziksel olarak bir zarar verir mi böyle bir yapı.

   module  D_latch (output reg Q,  input  enable, D);
    always  @ (enable, D)
    if  (enable) Q <= D; 
   endmodule   


Bu kod ile derleme yaptığımda ise şu hatayı veriyor;

[Place 30-574] Poor placement for routing between an IO pin and BUFG. If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .xdc file to demote this message to a WARNING. However, the use of this override is highly discouraged. These examples can be used directly in the .xdc file to override this clock rule.
	< set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets E_IBUF] >

	E_IBUF_inst (IBUF.O) is locked to IOB_X0Y12
	 and E_IBUF_BUFG_inst (BUFG.I) is provisionally placed by clockplacer on BUFGCTRL_X0Y0


Evet normalde clk bağlanmış bir hat var development boardda ama ben Enable bacağını kart üzerindeki switch'e bağlamak istiyorum. Latch'ın Enable bacağını clock'a bağlamak zorunda değilim ki. Bir sorun olmaması lazımdı.
Normalde Enable bacağı için şu şekilde bir tanımlamam mevcut farklı bir .xdc dosyası içerisnde

set_property PACKAGE_PIN V16 [get_ports enable]					
	set_property IOSTANDARD LVCMOS33 [get_ports enable]


Yine hata mesajında belirtilen "set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets E_IBUF] " kodu .xdc uzantılı dosyaya eklediğimde yine hatasız derliyor ama FPGA'ye fiziksel bir zarar vermeyeceğimden emin olmadığım için yüklemiyorum.

Acaba tüm bu hata mesajları fiziksel olarak hasar verebileceğinden mi veriyor yoksa potansiyel bug'ları engellemek için mi koymulşlar emin olamadım.

MC_Skywalker

#3
Eve geçtiğimde bir deneme ben yapayım.  Verilıg bilmiyorum VHDL ile yapar buraya projeyi upload ederim.

aldığın clock hatasını bende aldım. çözümü hatırlayınca yazarım.

strom

Hocam projeye ekleyeceğin bir .xdc uzantılı dosyaya "set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets E_IBUF] " kodunu ekleyince hatayı uyarıya dönüştürüp derliyor. Asıl korkum bu şekilde derlenmiş kodun yüklenmesi FPGA'in fiziksel yapsına zarar verir mi? Ne gibi sorunlar ortaya çıkar?

MC_Skywalker

#5
Sorun aslında şu bizim kullanığımız karttaki sw lerin FPGA içinde bağlı bulunduğu IO blok'una clk uygulamak gerekiyor. Tasarımımızda clk olmadığı için vivado bize atamanmış clk kulkanma diyor dakat bunu xdc içine
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets E_IBUF] eklediğimde error devam ediyor. Xilinx sitesinde detaylı çözüm vardır bakmak gerek işe gidiyorum pek bakma fırsatım olmayacak.



Edit
sıkıntısız çalışıyor.
VHDL kodu
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity DlatchTop is
    Port ( D : in STD_LOGIC;
           E : in STD_LOGIC;
           Q : out STD_LOGIC;
           Qdeğil : out STD_LOGIC);
end DlatchTop;

architecture Behavioral of DlatchTop is

begin
    process (D, E) begin
            if (E ='1') then
                Q <= D;
                Qdeğil <= not(D);
            end if;
end process;
end Behavioral;


xdc içeriği aşağıdaki gibi
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets E_IBUF]
set_property IOSTANDARD LVCMOS33 [get_ports D]
set_property IOSTANDARD LVCMOS33 [get_ports E]
set_property IOSTANDARD LVCMOS33 [get_ports Q]
set_property IOSTANDARD LVCMOS33 [get_ports Qdeğil]
set_property PACKAGE_PIN E19 [get_ports Qdeğil]
set_property PACKAGE_PIN U16 [get_ports Q]
set_property PACKAGE_PIN V17 [get_ports D]
set_property PACKAGE_PIN V16 [get_ports E]
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 33 [current_design]
set_property CONFIG_MODE SPIx4 [current_design]