FSM: не видно выходной сигнал - PullRequest
0 голосов
/ 22 мая 2019

Я создал конечный автомат / путь к данным, который я отлаживаю в ModelSim. Состояния: Загрузка, Увеличение и Окончание. Состояния, кажется, прогрессируют нормально, однако countx и county (внутренние сигналы) не увеличиваются в состоянии приращения, и, следовательно, выходы vga_x, vga_y не назначаются.

Я попытался изменить сигналы countx и county с логики на reg, но это не имело никакого значения. также попытался установить выходные сигналы для блокировки, так как я хочу, чтобы countx и county были назначены на выход после того, как они будут увеличены в том же состоянии.

module fillscreen(input logic clk, input logic rst_n, input logic [2:0] colour,
              input logic start, output logic done,
              output logic [7:0] vga_x, output logic [6:0] vga_y,
              output logic [2:0] vga_colour, output logic vga_plot);

 enum logic [1:0] {Load = 2'b00, Increment = 2'b01, Out = 2'b10, Finish = 2'b11} state, next_state;
 reg[7:0] countx;
 reg [6:0] county;

 always @ (posedge clk) begin
    state = Load;
    case(state)

    Load: begin
           if(rst_n == 0) 
            next_state <= Load; 
        else if (start == 1) 
            next_state <= Increment;
        else begin
        next_state <= Load; end
    //initialize counter
    countx <= 0;    
    county <= 0; end

    Increment: begin
        if(rst_n == 0) 
            next_state <= Load;
        else if (county < 119 && countx < 159) begin
            county <= county+1; 
            next_state <= Increment; end                
        else if (countx < 159) begin
            countx <= countx +1;
            next_state <= Increment; end
        else begin 
            next_state <= Finish;end
    //output            
    vga_y = county;
    vga_x = countx;
    vga_colour = countx % 8;            
    vga_plot = 1;
    end
    Finish: begin
        done <= 1;          
        if(rst_n == 0) 
            next_state <= Load; 
        else begin
            next_state <= Finish; end
    end
    default: begin 
        vga_y = county;
        vga_x = countx;
        done = 0;
        vga_plot = 0;
    end
    endcase
    state = next_state;
end  
endmodule

1 Ответ

2 голосов
/ 22 мая 2019

обратите внимание, что всегда блок оценивается процедурно от начала до конца. первая строка у вас есть

always @(posedge clk) begin
state = Load;
...

Это устанавливает состояние «Загрузка», когда блок выполняется и стирает предыдущее установленное состояние из

state = next_state;

Это означает, что каждый такт, блок case (state) будет идти по пути загрузки.

Я полагаю, что состояние FSM устанавливается в своем собственном блоке Always для упрощения кода.

always @(posedge clk) begin
    if(!rst_n) begin
        state <= Load;
    end
    else begin
        state <= next_state;
    end
end

таким образом, вы можете сосредоточиться на использовании «state» в качестве входных данных и «next_state» в качестве выходных данных вашего исходного блока всегда.

...