Я пытаюсь написать модуль передатчика UART. Он получает данные из data[7:0], а затем отправляет их последовательно через Tx. Я написал модуль Tester для тестирования передатчика. Он имитирует в Изиме, как я и предсказывал, но не в Спартанце-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
иnbitstransmitted
— предполагаемые защелки. В зависимости от синтезатора и синхронизации в состоянииTRANSMITTING
может быть петля обратной связи. Попробуйте сделатьnbitstransmitted
триггером, так как именно здесь находится обратная связь. Я бы предпочел, чтобыTx
также был триггером, но это простой флоп, поэтому он не возмещается. - person Greg   schedule 30.06.2014