“課堂上給大家介紹代碼規(guī)范的時(shí)候,反復(fù)強(qiáng)調(diào)不能出現(xiàn)組合邏輯環(huán),具體就是組合邏輯所有的else語(yǔ)句要寫(xiě)全,case語(yǔ)句也要寫(xiě)全,但組合邏輯環(huán)到底有什么危害?下面就詳細(xì)舉例說(shuō)明。”
01
—
什么是組合邏輯環(huán)?
組合邏輯反饋環(huán)路是數(shù)字同步邏輯設(shè)計(jì)的大忌,它最容易因振蕩、毛刺、時(shí)序違規(guī)等問(wèn)題引起整個(gè)系統(tǒng)的不穩(wěn)定和不可靠。組合邏輯反饋環(huán)路是二種高風(fēng)險(xiǎn)的設(shè)計(jì)方式,主要原因如下:
1.組合反饋環(huán)的邏輯功能完全依賴(lài)于其反饋環(huán)路上組合邏輯的門(mén)延時(shí)和布線延時(shí)等,如果這些傳播延時(shí)有任何改變,則該組合反饋環(huán)單元的整體邏輯功能將徹底改變,而且改變后的邏輯功能很難確定。
2.組合反饋環(huán)的時(shí)序分析是無(wú)窮循環(huán)的時(shí)序計(jì)算,綜合、實(shí)現(xiàn)等EDA 工具迫不得已一般必須主動(dòng)割斷其時(shí)序路徑,以完成相關(guān)的時(shí)序計(jì)算。而不同的EDA工具對(duì)組合反饋環(huán)的處理方法各不相同,所以組合反饋環(huán)的最終實(shí)現(xiàn)結(jié)果有很多不確定因素。
3.通常的綜合工具在處理組合邏輯反饋問(wèn)題時(shí),將產(chǎn)生Latch,這將對(duì)時(shí)序造成許多問(wèn)題。
在用Verilog HDL進(jìn)行可綜合電路設(shè)計(jì)時(shí),有很多情況都有可能產(chǎn)生組合邏輯環(huán)。
?在組合邏輯的組合進(jìn)程中, 條件語(yǔ)句描述時(shí)應(yīng)該指定所有條件下所有輸出的狀態(tài),以避免鎖存。比如if/case語(yǔ)句的所有分支必須定義全部的輸出才可能避免出現(xiàn)鎖存。
?在設(shè)計(jì)中,應(yīng)該盡量避免使用鎖存!因?yàn)殒i存要占去大量的觸發(fā)器資源,而且會(huì)對(duì)電路帶來(lái)某種不穩(wěn)定的隱患。
?所謂的latch,其實(shí)質(zhì)是組合電路中有反饋!反饋的形成是利用到了前一個(gè)狀態(tài)。
具體舉例如下:
總結(jié)如下:
?組合電路描述中,條件判斷語(yǔ)句必須指明所有條件分支情況下,被賦值信號(hào)的值。
?分支不完整,意味著電路需要在某種電平狀態(tài)下,讓被賦值的信號(hào)“保持原值”,這只能使用鎖存電路實(shí)現(xiàn)。
02
—
一個(gè)實(shí)例
設(shè)計(jì)代碼如下:
// **************************************************************
// COPYRIGHT(c)2015, Xidian University
// All rights reserved.
//
// IP LIB INDEX :
// IP Name :
// File name :
// Module name :
// Full name :
//
// Author : Liu-Huan
// Email : assasin9997@163.com
// Data :
// Version : V 1.0
//
// Abstract :
// Called by :
//
// -----------------------------------------------------------------
//
//
//
// *****************************************************************
// *******************
// TIMESCALE
// *******************
`timescale 1ns/1ps
// *******************
// INFORMATION
// *******************
//*******************
//DEFINE(s)
//*******************
//`define UDLY 1 //Unit delay, for non-blocking assignments in sequential logic
//*******************
//DEFINE MODULE PORT
//*******************
module TOP (
input clk ,
input rst
) ;
//*******************
//DEFINE LOCAL PARAMETER
//*******************
//parameter(s)
parameter IDLE = 5'b0_0001 ;
parameter S1 = 5'b0_0010 ;
parameter S2 = 5'b0_0100 ;
parameter S3 = 5'b0_1000 ;
parameter S4 = 5'b1_0000 ;
//*********************
//INNER SIGNAL DECLARATION
//*********************
//REGS
(* mark_debug = "true" *)reg [4:0] c_state ;
(* mark_debug = "true" *)reg [4:0] n_state ;
reg [3:0] cnt ;
(* mark_debug = "true" *) reg [3:0] led ;
//WIRES
//*********************
//INSTANTCE MODULE
//*********************
//*********************
//MAIN CORE
//*********************
always @(posedge clk or posedge rst) begin
if (rst == 1'b1) begin
cnt <= 4'b0 ;
end
else begin
cnt <= cnt+1'b1 ;?
end
end
// 三段式狀態(tài)機(jī) 驗(yàn)證 第二段 if無(wú)else的異常跳轉(zhuǎn)
// 第一段 狀態(tài)轉(zhuǎn)移
always @(posedge clk or posedge rst) begin
if (rst == 1'b1) begin
c_state <= IDLE ;?
end
else begin
c_state <= n_state ;
end
end
// 第二段 計(jì)算下一狀態(tài)
always @ (*) begin
case ( c_state )
IDLE : begin
if ( cnt == 'b0 )
n_state = S1 ;
end
S1 : begin
if ( cnt == 'd2 )
n_state = S2 ;
end
S2 : begin
if ( cnt == 'd4 )
n_state = S3 ;
end
S3 : begin
if ( cnt == 'd8 )
n_state = S4 ;
end
S4 : begin
if ( cnt == 'd15 )
n_state = IDLE ;
end
default : begin
n_state = IDLE ;
end
endcase
end
// 第三段 輸出
always @(posedge clk or posedge rst) begin
if (rst == 1'b1) begin
led <= 4'b0 ;
end
else begin
case ( n_state )
IDLE : led <= 4'b0 ;
S1 : led <= 4'd1 ;
S2 : led <= 4'd2 ;
S3 : led <= 4'd3 ;
S4 : led <= 4'd4 ;
default : begin
led <= 4'd0 ; ?
end
endcase
end
end
endmodule
仿真激勵(lì)代碼如下:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2017/12/11 2030
// Design Name:
// Module Name: test
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module test ;
reg clk ;
reg rst ;
initial begin
clk = 1'b0 ;
rst = 1'b1 ;
# 100
rst = 1'b0 ;
end
always # 5 clk = ~clk ;
TOP U_TOP (
.clk ( clk ) ,
.rst ( rst )
) ;
endmodule
上面組合邏輯環(huán)的代碼已經(jīng)用紅色字體顯示。
先看前仿真結(jié)果:
看不太清?讓我們?cè)倏匆粡垐D。
狀態(tài)跳變正常,n_state[4:0]按照1、2、4、8、16、1......的順序重復(fù)跳變,沒(méi)有任何問(wèn)題。
但在用FPGA工具(如vivado)進(jìn)行綜合時(shí),會(huì)報(bào)警告:
但是上板抓取信號(hào),發(fā)現(xiàn)狀態(tài)機(jī)異常跳轉(zhuǎn),如下圖所示。
此時(shí)的n_state[4:0]信號(hào)跳變狀態(tài)為:1、2、4、8、9、1......,出現(xiàn)了9這樣的一個(gè)狀態(tài)!
此時(shí),水落石出!出現(xiàn)組合邏輯環(huán)會(huì)給電路帶來(lái)嚴(yán)重問(wèn)題!
而上面的例子是顯而易見(jiàn)的,一眼就能看出來(lái),還有一些組合邏輯環(huán),是在寫(xiě)代碼時(shí)不小心引入的,并且是由多個(gè)always模塊組成的,這種組合邏輯環(huán)在綜合的時(shí)候也會(huì)報(bào)warning,必須要修改掉之后才能繼續(xù)后續(xù)工作。否則,等真正上板調(diào)試時(shí),規(guī)模稍微大點(diǎn)的設(shè)計(jì)如果要定位到這個(gè)錯(cuò)誤估計(jì)也得花掉好幾天的時(shí)間,所以代碼規(guī)范至關(guān)重要!
03
—
組合邏輯環(huán)的好處
在實(shí)際芯片設(shè)計(jì)中,也是不允許出現(xiàn)組合邏輯環(huán)的。但組合邏輯環(huán)能夠減少電路邏輯資源,降低電路功耗,具有很多優(yōu)點(diǎn)。但是其難以被靜態(tài)時(shí)序分析工具分析和計(jì)算,且難以生成功能驗(yàn)證向量和自動(dòng)測(cè)試圖形向量.針對(duì)此問(wèn)題,很多人都提出了多種組合邏輯環(huán)轉(zhuǎn)化方法,以解決硬件描述語(yǔ)言以及高級(jí)語(yǔ)言邏輯綜合階段所面臨的組合邏輯環(huán)拆分問(wèn)題。
審核編輯 :李倩
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602977 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110074 -
eda
+關(guān)注
關(guān)注
71文章
2755瀏覽量
173194
原文標(biāo)題:Verilog HDL描述的組合邏輯環(huán)在FPGA實(shí)現(xiàn)時(shí)到底有什么問(wèn)題?
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論