莱迪思iCE40-HX8K板 - UART

时间:2015-09-04 20:58:44

标签: verilog fpga uart

我的莱迪思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-Data,我在Ubuntu 14.04下使用gtkterm。 我已将gtkterm中的波特率设置为9600。 如果我现在用我编程的代码编程我的FPGA一次编程a 十六进制&#34; 00&#34; (不论8个用法位)。

enter image description here

有人能给我一个提示是什么问题?

感谢您的支持。

1 个答案:

答案 0 :(得分:3)

您的设计至少存在两个明显的问题:

  1. 您的count只有4位宽,因此无法计入1250.它必须至少为11位宽才能计数到1250.

  2. 此外,z只有1位宽,因此它只能保存值0和1.它必须至少为4位宽才能计数到10。

  3. 您还应该阅读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