woofer46 0 29 апреля, 2016 Опубликовано 29 апреля, 2016 (изменено) · Жалоба Добрый день, пытаюсь запустить юарт передатчик. Есть файл верхнего уровня - запускает юарт каждые 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 Проверяю я не только логическим анализатором, но и контроллером (если пришедшее число не равно 24, то выдать его) Изменено 29 апреля, 2016 пользователем woofer46 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
likeasm 0 29 апреля, 2016 Опубликовано 29 апреля, 2016 · Жалоба 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 множество, возьмите готовый и разберите как работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 29 апреля, 2016 Опубликовано 29 апреля, 2016 · Жалоба Странно вы формируете en. Перепишите передатчик конечным автоматом. Примеров UART множество, возьмите готовый и разберите как работает. До этого я использовал конечный автомат, на циклоне 3, но на flex он не заработал, после подачи питания первые 30 секунд работает, потом выключается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 29 апреля, 2016 Опубликовано 29 апреля, 2016 · Жалоба До этого я использовал конечный автомат, на циклоне 3, но на flex он не заработал, после подачи питания первые 30 секунд работает, потом выключается Асинхронное проектирование - плохо... Автомат переходит в состояние, которое не определено... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 29 апреля, 2016 Опубликовано 29 апреля, 2016 · Жалоба Асинхронное проектирование - плохо... Автомат переходит в состояние, которое не определено... Почему асинхронное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jackov 1 29 апреля, 2016 Опубликовано 29 апреля, 2016 (изменено) · Жалоба always @ (negedge uart_busy or posedge clk_uart) Вот это тоже не хорошо. Изменено 29 апреля, 2016 пользователем Jackov Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
woofer46 0 29 апреля, 2016 Опубликовано 29 апреля, 2016 · Жалоба Вот это тоже не хорошо. Как лучше сделать счетчик со сбросом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 29 апреля, 2016 Опубликовано 29 апреля, 2016 · Жалоба Почему асинхронное? Почитайте про пересечение клоковых доменов... Входные асинхронные сигналы обрабатываете по CDC прежде чем подавать на автомат? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
likeasm 0 29 апреля, 2016 Опубликовано 29 апреля, 2016 · Жалоба Как лучше сделать счетчик со сбросом? Счетчик с синхронным сбросом и разрешением частоты, взято из лампочки xilinx. reg [<upper>:0] <reg_name>; always @(posedge <clock>) if (<reset>) <reg_name> <= 0; else if (<clock_enable>) <reg_name> <= <reg_name> + 1'b1; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться