2016-07-23 22 views
0

Ich habe Probleme herauszufinden, warum ich Probleme mit meiner Uhr enable Timer in einem UART-Controller bekomme. Der Zähler ist cntR. Es sollte das Zählen von Null zu starten, nachdem eine Bedingung erfüllt ist, aber es beginnt bei Null und schaltet dann auf eine Zufallszahl anstelle von 0 auf 1 erhöht wird hier der Prozess Code, wo etwas Schlimmes passiert:VHDL Altera Qartus Zufallsdaten im vorzeichenlosen Register nach (andere => 0) + 1

process(reset, clock) 
begin 
    if reset = '1' then 
     cntR <= (others => '0'); 
    elsif rising_edge(clock) then 
     if rcv_reg = r_idle and rxd = '1' then 
      cntR <= (others => '0'); 
     else 
      if cntR = DIVVALUE then 
       cntR <= (others => '0'); 
      else 
       cntR <= cntR + 1; 
      end if; 
     end if; 
    end if; 
end process; 

hier sind Erklärungen (wahrscheinlich nicht so wichtig):

entity SART is 
generic(
    INCLK : natural := 50000000; 
    BAUDRATE : natural := 9600; 
    CNT_WIDTH : natural := 14 
); 
port(
    clock : in std_logic; 
    reset : in std_logic; 
    send : in std_logic; 
    rxd : in std_logic; 
    data_in : in std_logic_vector(7 downto 0); 
    data_ready : out std_logic; 
    clear_to_send : out std_logic; 
    txd : out std_logic; 
    data_out : out std_logic_vector(7 downto 0) 
); 
end SART; 

-- Receiver FSM states 
type RCV_STATE_TYPE is (
    r_idle, 
    r_start, 
    r_data1,r_data2,r_data3,r_data4,r_data5,r_data6,r_data7,r_data8, 
    r_stop1 
); 
signal rcv_reg, rcv_next : RCV_STATE_TYPE; 
signal cntR : unsigned(CNT_WIDTH-1 downto 0); 

das ist, was ich von Signal Tap erhalten:

enter image description here

Für die aufnehmen, verwende ich Altera Quartus 13.0.0 und einen DE0-Nano mit einem Cyclone IV FPGA.

Vielen Dank im Voraus für Ihre Eingabe.

+0

Ihr Signal Tap Wellenform zeigt weder die Signale, die ein Reset verursachen, noch die Uhr. Ich war neugierig auf den Reset. Siehe [SART - transmisja szeregowa z wykorzystaniem RS ...] (http://rawski.zpt.tele.pw.edu.pl/pl/system/files/Projekt_simpleUART (kolor) .pdf) und [kod vhdl] (http : //burza.hapay.pl/code/uart.vhd) haben so aufwändige Reset-Bedingungen. Ich nehme es cntR wird verwendet, um Baud Sample RXD zu zentrieren. Sie scheinen ein Problem mit der Taktrate und der Setup- oder Haltezeit zu haben. Die DIVVALUE-Deklaration ist nicht sichtbar, kann die cntR-Breite reduziert werden? Ihre Uhr ist 50 Mhz im Gegensatz zu 25. – user1155120

+0

Dies ist ein Hardware-Debugging und keine spezielle Software-Frage. Erwägen Sie es in [Elektrotechnik Stack Exchange] (https://electronics.stackexchange.com/questions/tagged/vhdl). – user1155120

+0

Vielen Dank für Ihren Kommentar. Wie Sie wahrscheinlich herausgefunden haben, benutzte ich die Präsentation in Ihrem ersten Link, um einen UART-Controller zu schreiben. Ich bekomme nach einem Reset einen Ruhezustand und einen Nullzähler. –

Antwort

0

Ich habe es geschafft, dieses Problem zu beheben. Es stellte sich heraus, dass ich keine SDC-Datei im Projekt hatte und daher der TimeQuest Timing Analyzer-Bericht anzeigte, dass meine maximale Taktfrequenz 10-mal höher ist, als wenn ich die SDC-Datei hatte. Nach dem Schreiben einer SDC-Datei mit nur Clock-Deklarationen erhielt ich von TimeQuest eine maximale Taktfrequenz von ca. 7 MHz. Ich habe eine PLL generiert um eine 5 MHz Frequenz zu bekommen und jetzt läuft alles einwandfrei.