【发布时间】:2014-06-30 12:54:23
【问题描述】:
我尝试编写一个 UART 发送器模块。它从 data[7:0] 获取数据,然后通过 Tx 串行发送。我编写了一个名为 Tester 的模块来测试发射机。它像我预测的那样在 Isim 中进行模拟,但在 Spartan-6 中没有。我用示波器观察了 Tx 引脚,我只看到逻辑 1。我无法检测到问题。我做错了什么?
module Tester(
clk,
data,
oclk,
Tx
);
input wire clk;
output reg [7:0] data;
output wire oclk;
output wire Tx;
assign oclk = clk;
initial begin
data<=8'b11001010;
end
UartTransmitter UT(.clk(clk),.data(8'b11001010),.Tx(Tx),.transmit(1'b1));
endmodule
module UartTransmitter(
//Inputs
clk,
reset,
data,
transmit,
//Output
Tx
);
input wire clk;
input wire reset;
input wire [7:0] data;
input wire transmit;
output reg Tx;
reg [16:0] counter;
reg durum;
reg s_durum;
reg sendbyone;
reg [10:0]buffer;
reg [3:0]nbitstransmitted;
parameter IDLE = 1'b0;
parameter TRANSMITTING = 1'b1;
initial begin
counter=0;
Tx=1;
s_durum = IDLE;
durum=IDLE;
sendbyone=0;
buffer=0;
nbitstransmitted=0;
end
always @(posedge clk) begin
counter<=counter+1;
if(counter>=13019) begin
counter<=0;
sendbyone<=1;
end else begin
sendbyone<=0;
end
durum<=s_durum;
end
always @(*) begin
s_durum=durum;
if((durum==IDLE) && (transmit==1)) begin
buffer={1'b1,^data,data,1'b0};
s_durum=TRANSMITTING;
end
else if(durum==TRANSMITTING && (sendbyone==1)) begin
if(nbitstransmitted<10) begin
Tx=buffer[nbitstransmitted];
nbitstransmitted=nbitstransmitted+1;
end else if(nbitstransmitted==10)begin
Tx=buffer[10];
nbitstransmitted=0;
s_durum=IDLE;
end
end
end
endmodule
【问题讨论】:
-
您是否测试过您能够实际修改 Tx 引脚,即使是静态的?如果您只是根据开关将其驱动到 0 或 1,您会看到它切换吗?我会先测试一下。
-
Tx和nbitstransmitted是推断的锁存器。根据合成器和时序,TRANSMITTING状态可能存在反馈循环。尝试将nbitstransmitted制作成触发器,因为这是反馈所在。如果Tx也是一个触发器,我更愿意,但它是一个简单的触发器,所以它不需要。
标签: verilog fpga xilinx hdl synthesis