У меня небольшие проблемы с моим кодом. Я написал простой код для последовательного считывателя для модуля Bluetooth HC-06, код которого приведен ниже, и он отлично работает как на плате, так и на Modelim.
module FYP (clk,Rx,RxData,forward,backward,turnL,turnR);
input clk,Rx;
output [7:0] RxData;
output forward,backward,turnL,turnR;
reg forward,backward,turnL,turnR = 0;
reg Tick;
reg [11:0] Baud_counter = 0;
reg [7:0] RxData = 0;
always @(posedge clk) //setting tick at 16 times of Baud Rate 9600
if (Baud_counter<325)
begin
Baud_counter <= Baud_counter + 1'b1;
Tick <= 0;
end
else
begin
Baud_counter <= 0;
Tick <= 1'b1;
end
reg RxDone = 0;
reg RxEn = 0;
reg IDLE = 0;
reg READ = 1;
reg State = 0;
always @((Rx) or (RxDone))
begin
case (State)
IDLE: if (Rx==0)
begin
State <= READ;
end
else
begin
State <= IDLE;
end
READ: if (RxDone==1)
begin
State <= IDLE;
end
else
begin
State <= READ;
end
default: State <= IDLE;
endcase
end
always @(State)
begin
case (State)
READ: RxEn <= 1'b1;
IDLE: RxEn <= 1'b0;
default: RxEn <= 1'b0;
endcase
end
reg [4:0] start_counter = 0;
reg ReadEn = 0;
always @(Tick)
if (RxEn==1)
begin
if (start_counter<8)
begin
start_counter <= start_counter + 1'b1;
ReadEn <= 0;
end
else
begin
if (RxDone==1)
begin
start_counter <= 0;
ReadEn <= 0;
end
else
begin
start_counter <= start_counter;
ReadEn <= 1'b1;
end
end
end
else
begin
start_counter <= 0;
ReadEn <= 0;
end
reg [4:0] counter = 0;
reg [4:0] Bit = 0;
reg [7:0] Rx_Data;
reg Rx_Done = 0;
always @(posedge Tick)
if (ReadEn==1)
begin
if (Bit<8)
begin
if (counter<16)
begin
counter <= counter + 1'b1;
Rx_Done <= 0;
Bit <= Bit;
end
else
begin
counter <= 0;
Rx_Done <= 0;
Rx_Data <= {Rx,Rx_Data[7:1]};
Bit <= Bit + 1'b1;
end
end
else
begin
counter <= 0;
Bit <= 0;
Rx_Done <= 1;
end
end
else
begin
counter <= 0;
Bit <= 0;
Rx_Done <= 1'b0;
end
reg holdSTATE = 0;
reg HOLD = 1;
reg RELEASE = 0;
reg [4:0] holdCounter = 0;
reg holdDone = 0;
reg holdEn = 0;
always @(Rx_Done or holdDone)
begin
case (holdSTATE)
RELEASE: if(Rx_Done==1)
begin
holdSTATE <= HOLD;
end
else
begin
holdSTATE <= RELEASE;
end
HOLD: if(holdDone==1)
begin
holdSTATE <= RELEASE;
end
else
begin
holdSTATE <= HOLD;
end
endcase
end
always @(holdSTATE)
begin
case (holdSTATE)
RELEASE: holdEn <= 1'b0;
HOLD: holdEn <= 1'b1;
default: holdEn <= 1'b0;
endcase
end
always @(posedge Tick)
if (holdEn==1)
begin
if(holdCounter<10)
begin
holdCounter <= holdCounter + 1'b1;
RxDone <= 1'b1;
holdDone <= 0;
end
else
begin
holdCounter <= 0;
RxDone <= 0;
holdDone <= 1'b1;
end
end
else
begin
holdCounter <= 0;
holdDone <= 0;
RxDone <= 0;
end
always @(posedge Tick)
if(RxDone==1)
begin
RxData <= Rx_Data;
end
else
begin
RxData <= RxData;
end
endmodule
но в тот момент, когда я добавляю в блок всегда, показанный ниже, результат, показанный на доске, начал сходить с ума, но результаты, смоделированные ModelSim, работают просто отлично и смогли получить тот результат, который я хотел.
always @*
if (RxData==8'b01000110)
begin
forward <= 1'b1;
backward <= 0;
turnL <= 0;
turnR <= 0;
end
else
begin
forward <= 0;
backward <= 0;
turnL <= 0;
turnR <= 0;
end
Кто-нибудь сталкивался с чем-то подобным и как я могу это решить?