शुभ दिन, मैंने निम्नलिखित इकाई लिखी है:

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


entity ADCinterface is    
generic (
    adc_id : std_logic_vector(1 downto 0):="00";            -- Holds the ID of the ADC its assigned to; for data reference
    word_size : natural := 32;                              -- Size of the transmission word in bit (overeall)
    crc_length : natural :=8                                -- Size/Length of the crc
);
port(   
    --internal Ports
    clkin:      in   std_logic;                             -- Module main Clock
    n_reset:    in   std_logic;                             -- Module reset
    adc_clkin:  in   std_logic;                             -- ADC sample clock input
    spi_clkin:  in   std_logic;                             -- SPI master clock input
    ack_buffer: in   std_logic;                             -- Signals that the buffer has been copied and can be overwritten
    paket_ID:   out  std_logic_vector(5 downto 0);          -- write the paket ID, a consecutive number 
    spi_data:   out  std_logic_vector(word_size-1 downto 0);-- Holds the data received from the adc
    data_buffer:out  std_logic_vector(word_size-1 downto 0);-- holds the data for the paket manager
    word_valid: out  std_logic;                             -- Signals data available to the internal paket manager

    --External ports 
    data_in:    in   std_logic;                             -- SPI data input
    ndrdy:      in   std_logic;                             -- Frame Sync pin (alias nDRDY) input from the ADC
    data_out:   out  std_logic;                             -- SPI data output
    start_adc:  out  std_logic;                             -- Enables the ADC
    adc_clk:    out  std_logic;                             -- ADC sampling clk out
    spi_clkout: out  std_logic                              -- SPI master clock out     
); 
end ADCinterface;

architecture ADCinterface_arch of ADCinterface is

    signal receive_word         : bit := '0';       --enables the receive process
    signal adc_data_ready       : std_logic := '0';     --holds the captured falling edge on ndrdy

begin
    adc_data_ready <= ndrdy;

    ADCinterface : process (clkin)

    begin

    if (rising_edge(clkin) and n_reset='0') then
        receive_word        <= '0';             --stop any active transmission

    elsif (rising_edge(clkin) and adc_data_ready='1') then
        receive_word <= '1';    --start / enable the data transmission
    end if;

    end process ADCinterface;
end ADCinterface_arch; 

जो त्रुटि के साथ तालमेल बिठाने में विफल रहता है:

त्रुटि - रेखा (65): कथन संश्लेषित नहीं है क्योंकि यह NOT(घड़ी-किनारे) स्थिति के तहत अपना मान नहीं रखता है। वीएचडीएल-1242

पंक्ति 65 अंतिम "अंत अगर;" के अनुरूप है बयान।

जब मैं अब बदलता हूँ

if (rising_edge(clkin) and n_reset='0') then

प्रति

if (n_reset='0') then

यह बिना किसी त्रुटि के संश्लेषण को पूरा करता है। मैं संश्लेषण के लिए एलएसई के साथ लैटिस डायमंड वी 3.11.2.446 का उपयोग करता हूं।

मैं नहीं देख सकता कि यह परिवर्तन कैसे कुछ भी बदलता है, क्या कोई मुझे यह समझने में मदद कर सकता है कि यहां क्या हो रहा है? मैं उम्मीद करता हूं कि उत्पादित तर्क दोनों ही मामलों में एक गैर-घड़ी-किनारे की स्थिति के तहत अपना मूल्य धारण करने में सक्षम होगा ...

अग्रिम में धन्यवाद

0
J.Doe 5 अप्रैल 2020, 17:15
सिंक रीसेट के लिए रीसेट को घड़ी की स्थिति के अंदर रखें।
 – 
Tricky
5 अप्रैल 2020, 19:07

2 जवाब

समस्या यह है कि आप दो बार राइजिंग_एज का उपयोग कर रहे हैं और संश्लेषण उपकरण नहीं जानता कि क्या करना है क्योंकि यह संश्लेषित नहीं है

if (rising_edge(clkin) and n_reset='0') then
    receive_word        <= '0';             --stop any active transmission

elsif (rising_edge(clkin) and adc_data_ready='1') then
    receive_word <= '1';    --start / enable the data transmission
end if;

में बदलने का प्रयास करें:

if (rising_edge(clkin))
    if (n_reset='0') then
        receive_word        <= '0';             --stop any active transmission
    elsif (adc_data_ready='1') then
        receive_word <= '1';    --start / enable the data transmission
    end if;
end if;
3
pink-o 6 अप्रैल 2020, 15:02

सिंथेसिस टूल यह पता लगाने के लिए कुछ कोड पैटर्न ढूंढते हैं कि किस प्रकार के तर्क का अनुमान लगाया जाए। इस प्रकार, यहाँ तक कि के बीच कोई स्पष्ट (तार्किक) अंतर नहीं है

if rising_edge(clk) and n_reset = '0' then

तथा

if rising_edge(clk) then
    if n_reset = '0' then

आपका संश्लेषण उपकरण केवल बाद वाले को ही पहचान सकता है। आपके मैनुअल में एक खंड (शायद "अनुशंसित एचडीएल कोडिंग शैली" या इसी तरह का नाम) होना चाहिए जो बताता है कि वांछित कार्यान्वयन का अनुमान लगाने के लिए वीएचडीएल सिंटैक्स की क्या आवश्यकता है।

2
mfro 5 अप्रैल 2020, 20:27