莱迪思 iCE40-HX8K 开发板 - UART

Lattice iCE40-HX8K Board - UART

我的 Lattice iCE40-HX8K 板有以下 verilog 代码:

uart.v:

module uart(input clk, output TXD);

reg [3:0] count;
reg [9:0] data;
reg z;

initial begin

data[9:0] = 10'b1000000000; // Startbit = 1, Stopbit = 0

z = 0;

end

always@(posedge clk)
begin

  if(count == 1250) //9600x per Second (1250) = Baudrate
    begin

      count <= 0;

      TXD = data[z];

      z = z + 1;
 if(z == 10)
        begin
        z = 0;
        end
      else
        begin
        end

    end
  else
    begin
      count <= count + 1;
    end


end

endmodule

为了接收 UART 数据,我在 Ubuntu 14.04 下使用 gtkterm。 我已将 gtkterm 中的波特率设置为 9600。 如果我现在用每次编程收到一次的代码对我的 FPGA 进行编程 十六进制“00”(不考虑 8 个使用位)。

谁能告诉我哪里出了问题?

感谢您的支持。

你的设计至少有两个明显的问题:

  1. 你的count只有4位宽,因此不能数到1250。必须至少有11位宽才能数到1250。

  2. 而且你的z只有1位宽,所以它只能容纳值0和1。它必须至少有4位宽才能数到10。

您还应该阅读 blocking vs. non-blocking assignments。在顺序逻辑中使用阻塞分配的方式可能会导致 verilog 仿真模型中的竞争条件。

您应该始终为您的 HDL 代码编写测试台并在尝试运行硬件中对其进行仿真之前。您的设计的测试平台将非常简单:

module uart_testbench;
        reg clk = 1;
        always #5 clk = ~clk;

        uart uut (
                .clk(clk)
        );

        initial begin
                $dumpfile("uart.vcd");
                $dumpvars(0, uut);
                repeat (1000000) @(posedge clk);
                $finish;
        end
endmodule