Verilog Code работает на ModelSim, но не на плате Altera DE2-115 - PullRequest
0 голосов
/ 26 марта 2019

У меня небольшие проблемы с моим кодом. Я написал простой код для последовательного считывателя для модуля 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

Кто-нибудь сталкивался с чем-то подобным и как я могу это решить?

...