Модуль Uart и оп - PullRequest
       15

Модуль Uart и оп

0 голосов
/ 02 мая 2018

Я хочу зажечь светодиоды соответственно в fpga (Nexys 2) с помощью Verilog, но я не синхронизировал между bluetooth (hc-06) и fpga. Например: я посылаю 255 (1111 1111) со своего телефона и светодиодный индикатор 4. Он должен был зажечь все 8 светодиодов.

Я сомневаюсь, что проблема в том, что я неправильно установил скорость передачи (скорость передачи по умолчанию - 9600).

Мой код Verilog размещен ниже.

Часть скорости передачи:

    module baud_rate_gen(input wire clk_50m,
         output wire rxclk_en,
         output wire txclk_en);

parameter RX_ACC_MAX = 50000000 / (9600 * 10);
parameter TX_ACC_MAX = 50000000 / 9600;
parameter RX_ACC_WIDTH = 9;//$clog2(RX_ACC_MAX);
parameter TX_ACC_WIDTH = 8;//$clog2(TX_ACC_MAX);
reg [RX_ACC_WIDTH - 1:0] rx_acc = 0;
reg [TX_ACC_WIDTH - 1:0] tx_acc = 0;

assign rxclk_en = (rx_acc == 5'd0);
assign txclk_en = (tx_acc == 9'd0);

always @(posedge clk_50m) begin
if (rx_acc == RX_ACC_MAX[RX_ACC_WIDTH - 1:0])
    rx_acc <= 0;
else
    rx_acc <= rx_acc + 5'b1;
end

always @(posedge clk_50m) begin
if (tx_acc == TX_ACC_MAX[TX_ACC_WIDTH - 1:0])
    tx_acc <= 0;
else
    tx_acc <= tx_acc + 9'b1;
end

endmodule

Часть передатчика и приемника скопирована с

https://github.com/jamieiles/uart/blob/master/receiver.v https://github.com/jamieiles/uart/blob/master/transmitter.v

Часть файла ucf:

NET "dout<0>"  LOC = "J14"; # Bank = 1, Pin name = IO_L14N_1/A3/RHCLK7, Type = RHCLK/DUAL, Sch name = JD10/LD0
NET "dout<1>"  LOC = "J15"; # Bank = 1, Pin name = IO_L14P_1/A4/RHCLK6, Type = RHCLK/DUAL, Sch name = JD9/LD1
NET "dout<2>"  LOC = "K15"; # Bank = 1, Pin name = IO_L12P_1/A8/RHCLK2, Type = RHCLK/DUAL, Sch name = JD8/LD2
NET "dout<3>"  LOC = "K14"; # Bank = 1, Pin name = IO_L12N_1/A7/RHCLK3/TRDY1, Type = RHCLK/DUAL, Sch name = JD7/LD3
NET "dout<4>"  LOC = "E17"; # Bank = 1, Pin name = IO, Type = I/O, Sch name = LD4? s3e500 only
NET "dout<5>"  LOC = "P15"; # Bank = 1, Pin name = IO, Type = I/O, Sch name = LD5? s3e500 only
NET "dout<6>"  LOC = "F4";  # Bank = 3, Pin name = IO, Type = I/O, Sch name = LD6? s3e500 only
NET "dout<7>"  LOC = "R4";  # Bank = 3, Pin name = IO/VREF_3, Type = VREF, Sch name = LD7? s3e500 only

Часть разъемов:

NET "tX" LOC = "L17"; # Bank = 1, Pin name = IO_L10N_1/VREF_1, Type = VREF, Sch name = JA3
NET "rx" LOC = "M15"; # Bank = 1, Pin name = IO_L07P_1, Type = I/O, Sch name = JA4

модуль uart_top:

module uart(input wire [7:0] din,
    input wire wr_en,
    input wire clk_50m,
    output wire tx,
    output wire tx_busy,
    input wire rx,
    output wire rdy,
    input wire rdy_clr,
    output wire [7:0] dout,
     output tX,
     input reset);

wire rxclk_en, txclk_en;


baud_rate_gen uart_baud(.clk_50m(clk_50m),
        .rxclk_en(rxclk_en),
        .txclk_en(txclk_en));
transmitter uart_tx(.din(din),
        .wr_en(wr_en),
        .clk_50m(clk_50m),
        .clken(txclk_en),
        .tx(tx),
        .tx_busy(tx_busy));
receiver uart_rx(.rx(rx),
     .rdy(rdy),
     .rdy_clr(rdy_clr),
     .clk_50m(clk_50m),
     .clken(rxclk_en),
     .data(dout));

     assign tX = 1;

 endmodule

1 Ответ

0 голосов
/ 03 мая 2018

Первое, что я заметил, это то, что у приемника есть ==15, что предполагает 16-кратную частоту дискретизации. Поиск в разделе комментариев github подтверждает это.

В вашем коде скорости передачи используется 50000000 / (9600 * 10);, то есть тактовая частота 10x, а не 16.

В вашем коде скорости передачи и в коде UART git hub широко используются инициализированные переменные. Есть много случаев, когда это не сработает. Правильный способ заключается в использовании сброса.

Я только взглянул на код получателя github, но он очень, очень небрежный:

  • Нет заголовка вверху файла, объясняющего, что он делает или делает.
  • Нет сброса
  • Не имеет синхронизатора. Данные UART поступают асинхронно с часами и должны быть синхронизированы!
  • рди написано в двух местах. Здесь это означает, что rdy_clr, прибывающий в то же время, что и байт данных, теряет байт данных.
  • Нет обнаружения переполнения.
  • Состояние останова не проверяет битовый максимум. Это означает, что несвязанная линия (всегда низкая) рассматривается как поток битов всех нулей.

Незначительная точка: Сборка принимаемого байта выполняется демультиплексором. scratch[bitpos[2:0]] много медленной логики для того, что вы можете сделать с помощью регистра сдвига.

...