2017-09-07 55 views
0

這裏是箱子在時序邏輯信號在某些情況下不改性

always @ (posedge clk or negedge rst_n) begin 
if (!rst_n) begin 
    enable <= 1'b0; 
    t_A <= 1'b0; 
    t_B <= 1'b0; 
    t_C <= 1'b0; 
end 
else begin 
    case (nxt_state) 
    IDLE: begin 
    enable <= 1'b0; 
    t_A <= 1'b0; 
    t_B <= 1'b0; 
    t_C <= 1'b0; 
    end 
    LOAD: begin 
    enable <= 1'b0; 
    t_A <= A; 
    t_B <= B; 
    t_C <= C; 
    end 
    BUSY: begin 
    enable <= 1'b1; 
    end 
    DONE: begin 
    enable <= 1'b0; 
    end 
    default: begin 
    enable <= enable; 
    t_A <= t_A; 
    t_B <= t_B; 
    t_C <= t_C; 
    end 
    endcase 
end 

信號T_而nxt_state是「LOAD」 *僅加載新值的簡化示例。如果我沒有列出信號t_ *的情況下,「忙」和「完成,他們會保持其值?

我試過在case子句之前添加一些代碼如下,但它顯示一些警告,而運行linting工具

always @ (posedge clk or negedge rst_n) begin 
if (!rst_n) begin 
    enable <= 1'b0; 
    t_A <= 1'b0; 
    t_B <= 1'b0; 
    t_C <= 1'b0; 
end 
else begin 

    enable <= enable; 
    t_A <= t_A; 
    t_B <= t_B; 
    t_C <= t_C;  

    case (nxt_state) 
    IDLE: begin 
    enable <= 1'b0; 
    t_A <= 1'b0; 
    t_B <= 1'b0; 
    t_C <= 1'b0; 
    end 
    LOAD: begin 
    enable <= 1'b0; 
    t_A <= A; 
    t_B <= B; 
    t_C <= C; 
    end 
    BUSY: begin 
    enable <= 1'b1; 
    end 
    DONE: begin 
    enable <= 1'b0; 
    end 
    default: begin 
    enable <= enable; 
    t_A <= t_A; 
    t_B <= t_B; 
    t_C <= t_C; 
    end 
    endcase 
end 

我怎樣才能解決這個問題,以保持代碼的簡單和清晰?

回答

0

你已經指出,以保持先前值默認選項,那是綽綽有餘。另外,如果信號被分配值在一個「if」塊中但沒有出現在其它計數器部分中時,合成器通常會合成一個鎖存器以保持其先前值。

0

你在這裏真正做的是創建一堆觸發器來保持你的狀態機運行。翻牌的定義是它將輸出中的值保持到時鐘的下一個邊緣(或第一個或其他)。所以,這裏是一個失敗的一個簡單的模型:

reg q; 
always @(posedge clk) 
    q <= d; 

在上述情況下,q將時鐘邊緣之間的穩定,這意味着它的值將保持在寄存器中。

更多的東西compilcated與使能信號:

always @(posedge clk) 
    if (en) 
     q <= d; 

在的q值以上將是時鐘邊沿之間的穩定,並且將僅在CLK的邊緣改變,如果en高。在所有其他情況下,它將保持價值。

所以,在你的情況首先你做不是需要default條款。沒有它的價值將是穩定的。

如果您未在BUSY和DONE中列出信號,則值將不會從先前的狀態改變。所以,你的初始變體是正確的,除了在那裏不需要默認值。

always @ (posedge clk or negedge rst_n) begin 
if (!rst_n) begin 
    enable <= 1'b0; 
    t_A <= 1'b0; 
    t_B <= 1'b0; 
    t_C <= 1'b0; 
end 
else begin 
    case (nxt_state) 
    IDLE: begin 
    enable <= 1'b0; 
    t_A <= 1'b0; 
    t_B <= 1'b0; 
    t_C <= 1'b0; 
    end 
    LOAD: begin 
    enable <= 1'b0; 
    t_A <= A; 
    t_B <= B; 
    t_C <= C; 
    end 
    BUSY: begin 
    enable <= 1'b1; 
    end 
    DONE: begin 
    enable <= 1'b0; 
    end 
    endcase 
end 

我注意到的一件事是,你不要在這裏更新next_state。你應該弄清楚如何去做。

相關問題