我的莱迪思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个用法位)。
有人能给我一个提示是什么问题?
感谢您的支持。
答案 0 :(得分:3)
您的设计至少存在两个明显的问题:
您的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