Перейти к содержанию
    

UART flex10k50RC240-4

Добрый день, пытаюсь запустить юарт передатчик.

Есть файл верхнего уровня - запускает юарт каждые 15 тактов.

На вход модуля трансивера подаю константу - 24.

Проблема в том что периодически бывают сбои (пропадает бит в середине) в отправляемых данных (скриншот), в чем ошибка или проблема?

Спасибо!

Top:

module i2sToUart(                   
    clk_uart,
    uart_tx
    );
input wire    clk_uart;
output wire  uart_tx;


wire Reset;                  
wire run_uart_command;

Reset    b2v_inst1(
    .clk(clk_uart),    
    .nReset(Reset));   // reset out

    reg run;               // Run UART
    reg [3:0] cnt1;
    always @ (negedge Reset or posedge clk_uart)
    begin
        if(!Reset)
        begin
            cnt1<=1'b0;
            run<=1'b0;
        end
        else
        begin
            cnt1<=cnt1+1'b1;
            if(cnt1<4'd4)
                run<=1'b1;
            else
            begin
                run<=1'b0;
            end
        end
    end
    assign run_uart_command = run;

        uart b2v_inst3(
    .nReset(Reset),
    .clk_uart(clk_uart),           
    .run_in(run_uart_command),
    .data_in(8'd24),
    .out_tx(uart_tx)
    );
endmodule

 

uart:

 

module uart
(
input nReset,
input clk_uart,            
input run_in,              // start transmitting
input wire [7:0] data_in,  // data to transmit
output out_tx              // serial Tx line

);

reg[9:0] data;
reg uart_busy;
reg[1:0] srun_in;
reg [3:0] cnt;

always @ (posedge clk_uart)
begin
    srun_in[1:0]={srun_in[0],run_in};
end

assign en1=srun_in[1]&&!uart_busy;      //enable for read data_in

always @ (negedge nReset or posedge clk_uart)
begin
    if(!nReset)
    begin
        data<=10'b1111111111;
        uart_busy<=0;
    end
    else
    begin
        if(en1)
        begin
            data[9:0]<={1'b1,data_in[7:0],1'b0};  // start+data+stop
            uart_busy<=1;
        end
        else if(uart_busy&&(cnt<9))               // while 10bit
        begin
            data[9:0]<={1'b1,data[9:1]};          // shift
            uart_busy<=1;
        end
        else
        begin
            uart_busy<=0;
        end
    end
end
always @ (negedge uart_busy or posedge clk_uart)
begin
    if(!uart_busy)
    begin
        cnt<=0;
    end
    else
    begin
        cnt<=cnt+1'b1;
    end
end
assign out_tx=data[0];
endmodule

 

post-86990-1461933503_thumb.jpg

post-86990-1461933554_thumb.jpg

post-86990-1461933672_thumb.jpg

post-86990-1461933678_thumb.jpg

 

Проверяю я не только логическим анализатором, но и контроллером (если пришедшее число не равно 24, то выдать его)

post-86990-1461934662_thumb.jpg

Изменено пользователем woofer46

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

always @ (posedge clk_uart)

begin

srun_in[1:0]={srun_in[0],run_in};

end

 

assign en1=srun_in[1]&&!uart_busy; //enable for read data_in

Странно вы формируете en.

Перепишите передатчик конечным автоматом. Примеров UART множество, возьмите готовый и разберите как работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно вы формируете en.

Перепишите передатчик конечным автоматом. Примеров UART множество, возьмите готовый и разберите как работает.

До этого я использовал конечный автомат, на циклоне 3, но на flex он не заработал, после подачи питания первые 30 секунд работает, потом выключается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

До этого я использовал конечный автомат, на циклоне 3, но на flex он не заработал, после подачи питания первые 30 секунд работает, потом выключается

Асинхронное проектирование - плохо...

Автомат переходит в состояние, которое не определено...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Асинхронное проектирование - плохо...

Автомат переходит в состояние, которое не определено...

Почему асинхронное?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

always @ (negedge uart_busy or posedge clk_uart)

Вот это тоже не хорошо.

Изменено пользователем Jackov

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему асинхронное?

Почитайте про пересечение клоковых доменов...

Входные асинхронные сигналы обрабатываете по CDC прежде чем подавать на автомат?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как лучше сделать счетчик со сбросом?

Счетчик с синхронным сбросом и разрешением частоты, взято из лампочки xilinx.

 

reg [<upper>:0] <reg_name>;

 

always @(posedge <clock>)

if (<reset>)

<reg_name> <= 0;

else if (<clock_enable>)

<reg_name> <= <reg_name> + 1'b1;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...