莱迪思 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 个使用位)。
谁能告诉我哪里出了问题?
感谢您的支持。
你的设计至少有两个明显的问题:
你的count
只有4位宽,因此不能数到1250。必须至少有11位宽才能数到1250。
而且你的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
我的 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 个使用位)。
谁能告诉我哪里出了问题?
感谢您的支持。
你的设计至少有两个明显的问题:
你的
count
只有4位宽,因此不能数到1250。必须至少有11位宽才能数到1250。而且你的
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