版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章有限狀態(tài)機的設計有限狀態(tài)機(Finite-StateMachine,FSM)簡稱狀態(tài)機,是表示有限個狀態(tài)以及在這些狀態(tài)之間的轉移和動作等行為的數(shù)學模型。狀態(tài)機是一種實現(xiàn)高可靠控制模塊的經典方法,具有速度快、可靠性高、結構簡單等優(yōu)點,是數(shù)字系統(tǒng)設計的重要組成部分。在VerilogHDL設計中,常用always和case來描述狀態(tài)機。第7章有限狀態(tài)機的設計有限狀態(tài)機是由組合邏輯和寄存器邏輯構成的時序電路,組合邏輯主要用于狀態(tài)的判斷、譯碼和信號的產生輸出,寄存器邏輯主要負責狀態(tài)的存儲和轉移。有限狀態(tài)機可分為兩類:摩爾型(Moore)和米里型(Mealy)。7.1有限狀態(tài)機的分類如圖7.1所示,摩爾型狀態(tài)機的輸出僅由當前狀態(tài)決定。狀態(tài)機的輸出會在一個完整的時鐘周期后保持穩(wěn)定,即當輸入變化時,還需等下一個時鐘的到來,輸出才會發(fā)生變化(異步輸出)。7.1.1摩爾型狀態(tài)機圖7.1摩爾型狀態(tài)機框架圖如圖7.2所示,米里型狀態(tài)機的輸出由當前狀態(tài)和輸入信號決定。狀態(tài)機的輸出在一個完整的時鐘周期內就保持穩(wěn)定,即當輸入變化時,輸出也立即發(fā)生變化(同步輸出)。7.1.2米里型狀態(tài)機圖7.2米里型狀態(tài)機框架圖一般情況下狀態(tài)機都采用同步時序方式設計,可以降低亞穩(wěn)態(tài)出現(xiàn)的概率,增強抗干擾能力。摩爾型狀態(tài)機的輸出在有限個脈沖延時后達到穩(wěn)定,所以噪聲少,將輸入與輸出分開是摩爾型狀態(tài)機主要特征。米里型狀態(tài)機輸出受輸入影響,輸入信號可能在任一時鐘周期下發(fā)生變化,雖然會比摩爾型狀態(tài)機提前一個時鐘周期,但也可能將輸入噪聲帶到輸出端。有限狀態(tài)機有三種表示方法:流程圖(ASM圖)、狀態(tài)圖(狀態(tài)轉移圖)、狀態(tài)表。三種表示方法是可以相互轉換的,但狀態(tài)圖是最常用的表示方式(延用數(shù)字邏輯電路時序電路的表示方式)。在VerilogHDL設計中,常用一段式、兩段式和三段式來描述狀態(tài)機。7.2有限狀態(tài)機的表示與描述狀態(tài)圖的每個圓圈表示一個狀態(tài),每個箭頭表示一次跳轉。摩爾型狀態(tài)機的輸出寫在圓圈內,如圖7.3所示。米里型狀態(tài)機的輸入和輸出寫在箭頭上,如圖7.4所示。7.2.1有限狀態(tài)機的狀態(tài)圖畫法圖7.3模6計數(shù)器摩爾型狀態(tài)圖圖7.4模6計數(shù)器米里型狀態(tài)圖有限狀態(tài)機屬于時序電路,設計的對象包括:狀態(tài)寄存器(現(xiàn)態(tài):CurrentState)、狀態(tài)邏輯(次態(tài):NextState)和輸出邏輯(輸出:OutputLogic)。次態(tài)的描述應該按照狀態(tài)圖、狀態(tài)表或者流程圖進行跳轉,在描述風格上主要分為以下三種:(1)一段式:在一個always中將現(xiàn)態(tài)、次態(tài)和輸出邏輯寫在一起。這種方法不容易維護,特別是狀態(tài)復雜時容易出錯。(2)兩段式:將現(xiàn)態(tài)和次態(tài)放在一個always中,將輸出邏輯寫在另一個always中;或者將現(xiàn)態(tài)放在一個always中,將次態(tài)和輸出邏輯寫在另一個always中。這種方法便于閱讀、維護,有利于綜合器優(yōu)化代碼。但是,在描述當前狀態(tài)的輸出采用組合邏輯實現(xiàn),容易產生毛刺。(3)三段式:將現(xiàn)態(tài)、次態(tài)和輸出邏輯分別寫在三個always中描述。與兩段式相比,三段式是根據(jù)上一狀態(tài)的輸入條件決定當前的狀態(tài)輸出,在不插入時鐘的前提下實現(xiàn)寄存器輸出的,從而消除了組合邏輯輸出帶來的亞穩(wěn)態(tài)和毛刺的隱患,而且更有利于綜合和布局布線。7.2.2有限狀態(tài)機的描述方法采用一段式、兩段式和三段式分別設計模6計數(shù)器:系統(tǒng)帶有同步復位端(低電平復位);計數(shù)器從0開始計數(shù)到5(101),輸出端z等于1;計數(shù)器狀態(tài)編碼采用順序編碼。7.3模6計數(shù)器的VerilogHDL描述模6計數(shù)器的狀態(tài)跳轉需6次,這里采用localparam對6種狀態(tài)進行順序編碼。在同一個always語句中對現(xiàn)態(tài)、次態(tài)和輸出邏輯統(tǒng)一描述。【例7.1】采用一段式狀態(tài)機描述模6計數(shù)器(方法一)。`timescale1ns/1psmodulefsm_counter6_1(Q,z,clk,Res);outputreg[2:0]Q;outputregz;inputclk;inputRes;reg[2:0]state;localparam[2:0]s0=3'b000,s1=3'b001,s2=3'b010,//狀態(tài)編碼s3=3'b011,s4=3'b100,s5=3'b101;always@(posedgeclk)7.3.1模6計數(shù)器的一段式描述beginif(Res==0)beginstate<=s0;Q<=0;z<=0;end//同步復位elsebegincase(state)s0:beginstate<=s1;Q<=3'b000;z<=0;ends1:beginstate<=s2;Q<=3'b001;z<=0;ends2:beginstate<=s3;Q<=3'b010;z<=0;ends3:beginstate<=s4;Q<=3'b011;z<=0;ends4:beginstate<=s5;Q<=3'b100;z<=0;ends5:beginstate<=s0;Q<=3'b101;z<=1;enddefault:beginstate<=s0;Q<=3'b000;z<=0;end//多余的狀態(tài)處理endcaseendendendmodule7.3.1模6計數(shù)器的一段式描述例7.1設計了一個帶同步復位端的模6計數(shù)器。在時鐘上升沿的瞬間檢測Res為低電平時復位,為高電平時機器正常工作;采用case語句描述狀態(tài)機完成了6次跳轉,因為state不是fullcase(state為3位變量,可以表示0~7,這里只用到0~5),將多余的狀態(tài)用default進行處理,以確保在當轉移條件不滿足或者狀態(tài)突變時可以實現(xiàn)自恢復。7.3.1模6計數(shù)器的一段式描述兩段式的描述可分為兩種,在7.2小節(jié)里介紹過了。例7.2將現(xiàn)態(tài)和次態(tài)放在一個always中,將輸出邏輯在另一個always中描述;例題7.3則將次態(tài)與輸出邏輯放在一個always中描述,現(xiàn)態(tài)則單獨描述?!纠?.2】采用兩段式狀態(tài)機描述模6計數(shù)器(方法二)。`timescale1ns/1psmodulefsm_counter6_2(Q,z,clk,Res);outputreg[2:0]Q;outputregz;inputclk;inputRes;reg[2:0]state;localparam[2:0]s0=3'b000,s1=3'b001,s2=3'b010,//狀態(tài)編碼s3=3'b011,s4=3'b100,s5=3'b101;7.3.2模6計數(shù)器的兩段式描述always@(posedgeclk)beginif(Res==0)beginstate<=s0;end//同步復位elsebegincase(state)s0:beginstate<=s1;ends1:beginstate<=s2;ends2:beginstate<=s3;ends3:beginstate<=s4;ends4:beginstate<=s5;ends5:beginstate<=s0;enddefault:beginstate<=s0;end//多余狀態(tài)的處理endcaseendend7.3.2模6計數(shù)器的兩段式描述always@(state)begincase(state)s0:beginQ=3'b000;z=0;end//輸出邏輯s1:beginQ=3'b001;z=0;ends2:beginQ=3'b010;z=0;ends3:beginQ=3'b011;z=0;ends4:beginQ=3'b100;z=0;ends5:beginQ=3'b101;z=1;enddefault:beginQ=3'b000;z=0;end//多余的狀態(tài)處理endcaseendendmodule例7.2采用的兩段式狀態(tài)機將現(xiàn)態(tài)和次態(tài)用一個過程來描述:一般用case表示當前狀態(tài),用if判斷下一狀態(tài)的跳轉。將輸出(Q和z)在另一個過程中描述:采用組合邏輯也可采用時序邏輯描述,摩爾機僅需用case根據(jù)當前狀態(tài)描述輸出,而米里機要在case語句中用if語句根據(jù)當前輸入值和狀態(tài)決定輸出值。7.3.2模6計數(shù)器的兩段式描述【例7.3】采用兩段式狀態(tài)機描述模6計數(shù)器(方法三)。`timescale1ns/1psmodulefsm_counter6_3(Q,z,clk,Res);outputreg[2:0]Q;outputregz;inputclk;inputRes;reg[2:0]state,next_state;localparam[2:0]s0=3'b000,s1=3'b001,s2=3'b010,//狀態(tài)編碼s3=3'b011,s4=3'b100,s5=3'b101;always@(posedgeclk)beginif(Res==0)beginstate<=s0;end//同步復位elsestate<=next_state;endalways@(posedgeclk)7.3.2模6計數(shù)器的兩段式描述beginif(Res==0)beginnext_state<=s0;Q<=3'b000;z<=0;endelsecase(state)s0:beginnext_state<=s1;Q<=3'b000;z<=0;end//次態(tài)和輸出邏輯s1:beginnext_state<=s2;Q<=3'b001;z<=0;ends2:beginnext_state<=s3;Q<=3'b010;z<=0;ends3:beginnext_state<=s4;Q<=3'b011;z<=0;ends4:beginnext_state<=s5;Q<=3'b100;z<=0;ends5:beginnext_state<=s0;Q<=3'b101;z<=1;enddefault:beginnext_state<=s0;Q<=3'b000;z<=0;end//多余的狀態(tài)處理endcaseendendmodule例7.3采用的兩段式狀態(tài)機將現(xiàn)態(tài)用一個過程描述,即“state<=next_state”。在另一個過程對次態(tài)和輸出邏輯進行描述。7.3.2模6計數(shù)器的兩段式描述例7.4采用的三段式狀態(tài)機將現(xiàn)態(tài)、次態(tài)和輸出邏輯分別放在三個always中描述。三段式狀態(tài)機代碼容易理解和維護,采用時序邏輯輸出可以較好地解決組合邏輯電路的毛刺現(xiàn)象,但會消耗更多資源。【例7.4】采用三段式狀態(tài)機描述模6計數(shù)器(方法四)。`timescale1ns/1psmodulefsm_counter6_4(Q,z,clk,Res);outputreg[2:0]Q;outputregz;inputclk;inputRes;reg[2:0]state,next_state;localparam[2:0]s0=3'b000,s1=3'b001,s2=3'b010,//狀態(tài)編碼s3=3'b011,s4=3'b100,s5=3'b101;always@(posedgeclk)beginif(Res==0)beginstate<=s0;end//同步復位elsestate<=next_state;//現(xiàn)態(tài)end7.3.3模6計數(shù)器的三段式描述always@(state)begincase(state)//次態(tài)s0:beginnext_state=s1;ends1:beginnext_state=s2;ends2:beginnext_state=s3;ends3:beginnext_state=s4;ends4:beginnext_state=s5;ends5:beginnext_state=s0;enddefault:beginnext_state=s0;end//多余的狀態(tài)處理endcaseendalways@(posedgeclk)beginif(Res==0)beginQ<=3'b000;z<=0;endelsecase(state)//輸出邏輯s0:beginQ<=3'b000;z<=0;ends1:beginQ<=3'b001;z<=0;end7.3.3模6計數(shù)器的三段式描述s2:beginQ<=3'b010;z<=0;ends3:beginQ<=3'b011;z<=0;ends4:beginQ<=3'b100;z<=0;ends5:beginQ<=3'b101;z<=1;enddefault:beginQ<=3'b000;z<=0;endendcaseendendmodule7.3.3模6計數(shù)器的三段式描述針對例7.1~例7.3編寫仿真激勵程序:設計一個時鐘周期為100ns的信號,采用同步復位分別對例7.1-例7.3進行仿真,產生波形如圖7.5所示。Res等于高電平后(Q從000加到101),z等于1。【例7.5】模6計數(shù)器的仿真激勵程序`timescale1ns/1psmodulefsm_counter6_1_tb();wire[2:0]Q;wirez;regclk;regRes;parameterPeriod=100;//定義周期常量Period為100fsm_counter6_3uut(.Q(Q),.z(z),.clk(clk),.Res(Res));initial7.3.4模6計數(shù)器的仿真激勵beginclk=0;Res=0;clk=1;#Period;//同步復位Res=1;//停止復位#(Period*5)$stop;//5個周期后停止endalwaysbegin#(Period/2)clk=~clk;//100ns時鐘產生endendmodule仿真波形如圖7.5如示。7.3.4模6計數(shù)器的仿真激勵圖7.5模6計數(shù)器仿真波形狀態(tài)編碼是指使用特定數(shù)量的寄存器,通過特定形式將狀態(tài)集合表示出來的過程。如例7.1~例7.4中狀態(tài)變量s0~s5就是具體的狀態(tài)編碼。狀態(tài)編碼的方式有多種,如二進制編碼、格雷碼、約翰遜碼、獨熱碼等。狀態(tài)編碼的方式決定了保存狀態(tài)所需的觸發(fā)器數(shù)量,會影響狀態(tài)機的次態(tài)及輸出邏輯的復雜程度。7.4狀態(tài)的編碼1.順序編碼順序編碼一般采用順序的二進制方式來實現(xiàn)編碼,比如例7.1中的6個狀態(tài)s0~s5,分別用000、001、010、011、100、101來表示。它的特點是編碼形式簡單、使用的觸發(fā)器最少,但是在狀態(tài)轉換時有可能出現(xiàn)多個比特位同時發(fā)生變化(電路會產生較大尖峰脈沖)、瞬變次數(shù)較多,容易產生毛刺現(xiàn)象,增加了輸出噪聲。2.格雷碼格雷碼采用相鄰狀態(tài)轉換時只有一個比特位發(fā)生翻轉的方法來實現(xiàn)編碼,比如例7.1中的6個狀態(tài)分別用000、001、011、010、110、111來表示。它的特點是使用的邏輯單元少,消除了狀態(tài)轉換時傳輸延遲產生的毛刺和亞穩(wěn)態(tài)。3.約翰遜碼約翰遜碼采用把輸出的最高位取反后做為輸入反饋到最低位來實現(xiàn)編碼。比如例7.1中的6個狀態(tài)分別用000、001、011、111、110、100來表示。它的特點是相鄰兩個比特間只有一個位不同,瞬變次數(shù)少,不容易產生毛刺現(xiàn)象。4.獨熱碼獨熱碼采用N個狀態(tài)寄存器對N個狀態(tài)進行編碼,每個狀態(tài)都有獨立的寄存器位。比如例7.1中的6個狀態(tài)分別用000001、000010、000100、001000、010000、100000來表示。它的特點是在狀態(tài)比較時僅需比較一個位,雖然用了較多的觸發(fā)器,卻簡化了譯碼邏輯(組合邏輯電路少),可以工作于較高的頻率上,更適合FPGA上的設計。7.4.1狀態(tài)編碼的分類狀態(tài)編碼是一種常量,為了增強可讀性和靈活性,在Verilog中采用三種方法定義狀態(tài)編碼:`define、parameter和localparam。1.`define概念:`define一般寫在需要定義的module上面,若`define指令被編譯,在整個編譯過程中都有效,直到遇到`undef。
舉例說明:`definemsb9調用格式:reg[`msb:0]x_in;2.parameter概念:parameter在module內部定義,可用于一般常量或表達式的定義,但無法進行參數(shù)傳遞;在module內定義可以實現(xiàn)參數(shù)的傳遞。使用格式:module_name#(parametername1=value1,parametername2=value2)(portmap); 舉例說明:moduleseq100#(parametera=10,parametermsb=9,parameterlsm=0)//參數(shù)傳遞 (inputclk,inputRes,outputz);parametersum=a+b,q="abc";//module內部定義一般常量或表達式7.4.2狀態(tài)編碼的定義7.4.2狀態(tài)編碼的定義
parameterIDLE=3’b001,s0=3’b010,s1=3’b100;always@(posedgeclk)……調用格式:module_name#(.parameter_name(value),.parameter_name(value)) inst_name(portmap);舉例說明:moduleseq100#(.msb(8),.delay(10),.lsb(0))//名字映射法 uut(.clk(clk_100M),.Res(Res),.z(z));3、localparam
概念:localparam寫在需要定義的module內部,無法實現(xiàn)參數(shù)傳遞。localparam一般用于狀態(tài)機的狀態(tài)編碼定義。
舉例說明:localparammsb=9,lsb=0; 調用格式:reg[msb:0]x_in;采用何種編碼應該綜合考慮編程芯片的內部資源、狀態(tài)的多少等因素。順序編碼、格雷碼、約翰遜碼使用的組合邏輯較多,觸發(fā)器少,比較適用于CPLD器件(組合邏輯資源較多)或者小型狀態(tài)機。獨熱碼使用的觸發(fā)器較多,組合邏輯較少,比較適用于FPGA器件(觸發(fā)器資源豐富)或者速度較高的場合。順序編碼與格雷碼和約翰遜碼比較:格雷碼和約翰遜碼跳轉時只有1個位發(fā)生翻轉(例7.1中順序編碼從s3跳到s4時有3個位翻轉,而格雷碼和約翰遜碼只有1個位翻轉),可以消除多條信號線由于傳輸延時或門延時所產生的毛刺,減低功耗。獨熱碼與其他編碼的比較:在狀態(tài)比較時,獨熱碼僅需比較一個位,而其他編碼需要對所有位進行比較(例7.1中比較state與s0是否相等時,獨熱碼僅需比較state[0]=1,而其他編碼需比較3個位),在速度上占有優(yōu)勢。但是獨熱碼位寬一般比其他編碼多,需要的觸發(fā)器也就多,從而增加了設計面積。在資源允許的情況下采用獨熱碼當然是最好的,但在通常情況下是要綜合考慮的。建議在4個狀態(tài)以內用二進制碼(譯碼電路不復雜),5~24個狀態(tài)采用獨熱碼(觸發(fā)器用得不多),24個狀態(tài)以上采用格雷碼(綜合設計面積和資源考慮)。7.4.3狀態(tài)編碼的設計建議序列檢測器是指將特定的序列中串行的數(shù)字碼流從檢測出來的機器。本節(jié)分別采用摩爾型狀態(tài)機、米里型狀態(tài)機設計一個“100”檢測器。檢測器的狀態(tài)機設計采用三段式描述風格,使用獨熱碼編碼,并帶有同步復位端。7.5序列檢測器的VerilogHDL描述圖7.6為“100”序列檢測器的摩爾型狀態(tài)圖。當Res等于0時跳轉到IDLE態(tài),進入復位后的初始態(tài)。在IDLE態(tài)下檢測到輸入x等于1后跳轉到s1態(tài),否則停留在IDLE態(tài);s1態(tài)下x應為0才跳轉到s2態(tài),否則一直停留在s1態(tài);在s2態(tài)下檢測到x為0后跳轉到s3態(tài),x若為1則跳回s1態(tài);在s3態(tài)下輸出端z為1,若輸入x為1時跳轉至s1態(tài),否則跳轉至IDLE態(tài)。7.5.1序列檢測器的三段式摩爾型狀態(tài)機描述圖7.6序列檢測器的摩爾型狀態(tài)圖【例7.6】“100”序列檢測器的三段式摩爾型狀態(tài)機Verilog描述。`timescale1ns/1ps//摩爾型狀態(tài)機moduleseq100_1(z,x,clk,Res);//sequentialdetectoroutputregz;inputx,clk,Res;reg[3:0]state,next_state;localparam[3:0]IDLE=4'b0001,s1=4'b0010,//狀態(tài)編碼s2=4'b0100,s3=4'b1000;//獨熱碼always@(posedgeclk)//時鐘上升沿;beginif(Res==0)beginstate<=IDLE;end//同步復位elsestate<=next_state;//現(xiàn)態(tài)endalways@(state,x)begincase(state)//次態(tài)跳轉
7.5.1序列檢測器的三段式摩爾型狀態(tài)機描述IDLE:beginif(x==1)next_state=s1;elsenext_state=IDLE;ends1:beginif(x==0)next_state=s2;elsenext_state=s1;ends2:beginif(x==0)next_state=s3;elsenext_state=s1;ends3:beginif(x==0)next_state=IDLE;elsenext_state=s1;enddefault:beginnext_state=IDLE;end//多余的狀態(tài)處理endcaseendalways@(state,Res)beginif(Res==0)beginz=0;endelsecase(state)//輸出與現(xiàn)態(tài)有關,與輸入x無關。摩爾型狀態(tài)機s3:z=1;default:z=0;endcaseendendmodule7.5.1序列檢測器的三段式摩爾型狀態(tài)機描述圖7.7為“100”序列檢測器的米里型狀態(tài)圖。當Res等于0時跳轉到IDLE態(tài),進入復位后的初始態(tài)。在IDLE態(tài)下檢測到輸入x等于1后跳轉到s1態(tài),否則停留在IDLE態(tài);s1態(tài)下x應為0才跳轉到s2態(tài),否則一直停留在s1態(tài);在s2態(tài)下檢測到x為0后輸出端z為1同時跳轉到跳轉至IDLE態(tài),若輸入x為1時跳轉至s1態(tài)。7.5.2序列檢測器的三段式米里型狀態(tài)機描述圖7.7序列檢測器的米里型狀態(tài)圖【例7.7】“100”序列檢測器的三段式米里型狀態(tài)機Verilog描述。`timescale1ns/1psmoduleseq100_2(z,x,clk,Res);//sequentialdetectoroutputregz;inputx,clk,Res;reg[2:0]state,next_state;localparam[2:0]IDLE=4'b001,s1=4'b010,//狀態(tài)編碼s2=4'b100;//獨熱碼always@(posedgeclk)//時鐘上升沿;beginif(Res==0)beginstate<=IDLE;end//同步復位elsestate<=next_state;//現(xiàn)態(tài)endalways@(state,x)begin7.5.2序列檢測器的三段式米里型狀態(tài)機描述case(state)//次態(tài)跳轉IDLE:beginif(x==1)next_state=s1;elsenext_state=IDLE;ends1:beginif(x==0)next_state=s2;elsenext_state=s1;ends2:beginif(x==0)next_state=IDLE;elsenext_state=s1;enddefault:beginnext_state=IDLE;end//多余的狀態(tài)處理endcaseendalways@(state,Res)//輸出邏輯beginif(Res==0)beginz=0;endelsecase(state)s2:if(x==0)z=1;//輸出與輸入和現(xiàn)態(tài)有關。default:z=0;endcaseendendmodule7.5.2序列檢測器的三段式米里型狀態(tài)機描述針對例7.6~例7.7編寫仿真激勵程序:設計一個時鐘周期為100ns的信號,采用同步復位分別對例7.6~例7.7進行仿真。在輸入的串行碼流“0110000100”中檢測到兩次“100”序列,z輸出為1?!纠?.8】“100”序列檢測器的仿真激勵程序`timescale1ns/1psmoduleseq100_1_tb;wirez;regx,clk,Res;parameterPeriod=100;//定義周期常量Period為100parametermsb=9;//定義x_in的位寬parameterlsb=0;reg[msb:lsb]x_in=10'b0110000100;seq100_1uut(//名字映射.z(z),.x(x),.clk(clk),.Res(Res));initial7.5.3序列檢測器的仿真激勵beginclk=0;x=0;Res=0;clk=1;#Period;//同步復位Res=1;//停止復位#(Period*(msb+2))$stop;endalwaysbegin #(Period/2)clk=~clk;//100ns時鐘產生endalways@(posedgeclk)begin#5x=x_in[msb];x_in=x_in<<1;endendmodule圖7.8為檢測器的摩爾型狀態(tài)機,當x出現(xiàn)連續(xù)的“100”序列后的下一個時鐘周期z輸出1。圖7.9為檢測器的米里型狀態(tài)機,當x出現(xiàn)連續(xù)的“100”序列時z馬上輸出1。米里型狀態(tài)機比摩爾型狀態(tài)機提前一個時鐘周期得到輸出信號。7.5.3序列檢測器的仿真激勵7.5.3序列檢測器的仿真激勵圖7.8“100”序列檢測器的三段式摩爾型狀態(tài)機仿真圖圖7.9“100”序列檢測器的三段式米里型狀態(tài)機仿真圖數(shù)碼管是設計中經常使用的顯示器件,它的驅動分為兩種:靜態(tài)顯示和動態(tài)顯示。動態(tài)顯示是用兩位以上的數(shù)碼管通過分時掃描每一位,利用人眼的視覺停留現(xiàn)象,造成一種假靜態(tài)顯示的效果。本節(jié)將重點介紹動態(tài)顯示的電路、狀態(tài)機驅動程序的設計和激勵仿真。7.6動態(tài)顯示的VerilogHDL描述圖7.10是八位共陰動態(tài)顯示電路圖,該電路由兩個4位共陰數(shù)碼管、8個NPN三極管和若干個電阻電容組成。當SMG1的數(shù)據(jù)端A~H輸入高電平(如:8’b0110_0000),且Q1基極LED_BIT1為高電平,則最左邊數(shù)碼管點亮(顯示1)。此時數(shù)據(jù)端B、C的電流流經數(shù)碼管,從COM1輸出至三極管Q1的集電極再經射極到GND,最左邊數(shù)碼管B、C段點亮。動態(tài)方式顯示時各數(shù)碼管分時輪流選通:即在某一時刻只選通一位數(shù)碼管(對應的NPN三極管為導通),并送出相應的字型碼給數(shù)據(jù)端A~H;在另一時刻選通另一位數(shù)碼管,并送出相應的字型碼。依此規(guī)律循環(huán),既可使數(shù)碼管分別將要顯示的不同字符顯示在相應的位置上。由于人眼存在視覺暫留效應(人眼在觀察景物時,光信號傳入大腦神經,需經過一段短暫的時間,光的作用結束后,視覺形象并不立即消失,這種被稱為“視覺暫留”或“余暉效應”),只要每位顯示間隔足夠短就可以給人同時顯示的感覺。通常數(shù)碼管顯示周期20ms左右即可,周期太短會有重影,周期太長會有閃爍現(xiàn)象。現(xiàn)實中經常把SMG1的A~H與SMG2的A~H并聯(lián)在一起,這里使用的EGO1開發(fā)板兩個4位數(shù)碼管的數(shù)據(jù)端A~H是獨立分開的。7.6.1動態(tài)顯示的工作原理7.6.1動態(tài)顯示的工作原理圖7.10八位共陰動態(tài)顯示電路圖本次開發(fā)板有源晶振為100MHz,八位數(shù)碼管共占用20ms時間,則每位數(shù)碼管占用2.5ms時間,動態(tài)顯示的時鐘由有源晶振分頻所得?!纠?.9】采用三段式狀態(tài)機設計一個八位動態(tài)顯示程序,顯示內容為1~8。`timescale1ns/1psmodulesmg8_fsm(LED_BITS,DATA1_A_G,DATA2_A_G,clk,Res);inputclk;//100MHzinputRes;//高電平復位outputreg[7:0]LED_BITS;//位選端outputreg[6:0]DATA1_A_G,DATA2_A_G;//數(shù)據(jù)端a~gparameterdiv_dat=250000;//分頻比250000wireclk_div;//分頻輸出reg[7:0]state,next_state;//必須和狀態(tài)編碼位數(shù)一樣reg[19:0]cnt;//cnt的位數(shù)必須大于等于div_dat;localparams0=8'b0000_0001,s1=8'b0000_0010,
s2=8'b0000_0100,s3=8'b0000_1000,s4=8'b0001_0000,s5=8'b0010_0000,s6=8'b0100_0000,s7=8'b1000_0000;//獨熱碼編碼;7.6.2動態(tài)顯示的狀態(tài)機描述always@(state,Res)beginif(Res)beginnext_state<=s0;endelsebegincase(state)//次態(tài)s0:beginnext_state<=s1;ends1:beginnext_state<=s2;ends2:beginnext_state<=s3;ends3:beginnext_state<=s4;ends4:beginnext_state<=s5;ends5:beginnext_state<=s6;ends6:beginnext_state<=s7;ends7:beginnext_state<=s0;enddefault:beginnext_state<=s0;endendcaseendendalways@(state,Res)//輸出邏輯begin7.6.2動態(tài)顯示的狀態(tài)機描述
if(Res)beginLED_BITS=8'h00;DATA1_A_G=7'h00;DATA2_A_G=7'h00;endelsebegincase(state)//1-7'h06,2-7'h5b,3-7'h4f,4-7'h66,5-7'h6d,6-7'h7d,7-7'h07,8-7'h7fs0:beginDATA1_A_G=7'h06;DATA2_A_G=7'h00;LED_BITS=8'h80;ends1:beginDATA1_A_G=7'h5b;DATA2_A_G=7'h00;LED_BITS=8'h40;ends2:beginDATA1_A_G=7'h4f;DATA2_A_G=7'h00;LED_BITS=8'h20;ends3:beginDATA1_A_G=7'h66;DATA2_A_G=7'h00;LED_BITS=8'h10;ends4:beginDATA2_A_G=7'h6d;DATA1_A_G=7'h00;LED_BITS=8'h08;ends5:beginDATA2_A_G=7'h7d;DATA1_A_G=7'h00;LED_BITS=8'h04;ends6:beginDATA2_A_G=7'h07;DATA1_A_G=7'h00;LED_BITS=8'h02;ends7:beginDATA2_A_G=7'h7f;DATA1_A_G=7'h00;LED_BITS=8'h01;enddefault:beginDATA1_A_G=7'h00;DATA2_A_G=7'h00;LED_BITS=8'h00;endendcaseendendendmodule7.6.2動態(tài)顯示的狀態(tài)機描述例7.9對數(shù)碼管的位選端的控制順序采用localparam(獨熱碼)進行編碼。用cnt對100MHz的系統(tǒng)時鐘進行計數(shù)分頻,產生2.5ms的clk_div信號用于分時驅動8位數(shù)碼管。后三個always則是動態(tài)顯示的三段式描述,對現(xiàn)態(tài)、次態(tài)和輸出邏輯分別進行描述。7.6.2動態(tài)顯示的狀態(tài)機描述對例7.9激勵仿真,系統(tǒng)在復位后只需采用always產生時鐘信號即可。仿真波形如圖7.11所示,從波形中可看到DATA1_A_G、DATA2_A_G和LED_BITS與例7.9中的always@(state,Res)的輸出邏輯一致?!纠?.10】三段式八位動態(tài)顯示狀態(tài)機仿真激勵程序。`timescale1ns/1psmodulesmg8_fsm_tb();regclk;//100MHzregRes;//高電平復位wire[7:0]LED_BITS;//位選端wire[6:0]DATA1_A_G,DATA2_A_G;//數(shù)據(jù)端a~gparameterPeriod=10;//定義周期常量Period為10smg8_fsmuut(LED_BITS,DATA1_A_G,DATA2_A_G,clk,Res);//位置映射initialbegin clk=0;Res=1;#Period; Res=0;//不復位;endalways7.6.3動態(tài)顯示的仿真激勵begin #(Period/2)clk=~clk;//10ns時鐘產生endendmodule7.6.3動態(tài)顯示的仿真激勵圖7.11三段式八位動態(tài)顯示狀態(tài)機仿真圖數(shù)模轉換器是將串行或并行的二進制數(shù)字量轉換為直流電壓或直流電流的器件,經常用于波形產生、數(shù)控恒流穩(wěn)壓等,或用在數(shù)字音頻播放器等上。本節(jié)講述的是8位并行數(shù)模轉換器DAC0832芯片的運用,圖7.12所示為單極性輸出的DAC0832電路。EGO1開發(fā)板上DAC0832的參考電壓Vref是兩個電阻對負5V電壓的分壓所得,電壓實測為負3.68V。模數(shù)轉換后輸出后經過雙電源供電的運放LM324得到一個正電壓((0~3.68)*255/256V)。7.7數(shù)/模轉換器DAC0832的VerilogHDL描述圖7.12單極性輸出DAC0832電路DAC0832的控制方式有三種:直通模式、單緩沖模式和雙緩沖模式。直通模式是分別將ILE置1,、、和均置0,此時二進制數(shù)據(jù)直接從DAC0832的輸入端D0~D7輸入,通過兩級寄存器到達DA轉換器輸出。單緩沖模式是將ILE、、、和其中一個端口置為無效(設置其中一級寄存器為直通),二進制數(shù)據(jù)輸入后(有效時間大于90ns)再同時開啟另一級寄存器(有效時間大于500ns),完成DA轉換和輸出。雙緩沖模式是將二進制數(shù)據(jù)輸入后(有效時間大于90ns),開啟第一級寄存器讓數(shù)據(jù)鎖存在第一級寄存器中再關閉第一級寄存器(有效時間大于500ns),當總線上控制多個DAC0832時同時開啟第二級寄存器可實現(xiàn)同時輸出(有效時間大于500ns)。7.7.1DAC0832的工作模式采用直通模式設計的數(shù)模轉換器DAC0832的驅動程序必須對100MHz系統(tǒng)時鐘進行分頻,以免DAC0832沒有足夠的建立時間而產生數(shù)據(jù)擁塞。將DAC0832兩級寄存器的控制端ILE、CS、WR1、WR2、XFER中的ILE設置為低電平,其他控制端設置為高電平(直通模式)。由于減少了兩級寄存器的緩沖時間,直通模式的程序簡單、輸出轉換頻率最高,但無法實現(xiàn)總線并聯(lián)控制?!纠?.11】采用直通模式設計數(shù)模轉換器DAC0832輸出鋸齒波。`timescale1ns/1psmodule
dac0832_simple(DAC_out,ILE,CS,WR1,WR2,XFER,clk,Res);outputregILE,CS,WR1,WR2,XFER;outputreg[7:0]DAC_out;inputclk;//100MinputRes;//平時為低電平,按下后高電平復位parameterdiv_dat=10000;//分頻比10000wireclk_div;reg[15:0]cnt;//cnt位數(shù)應大于等于div_datalways@(posedgeclk,posedgeRes)7.7.2DAC0832的Verilog描述beginif(Res)begincnt<=0;endelsebeginif(cnt==div_dat)begincnt<=0;endelsebegincnt<=cnt+1'b1;endendendassignclk_div=(cnt==div_dat)?1:0;//時鐘分頻100MHz/div_datalways@(posedgeclk_div,posedgeRes)beginif(Res)begin{ILE,CS,WR1,WR2,XFER}<=5'b01111;DAC_out<=8'b0000_0000;end
7.7.2DAC0832的Verilog描述elsebegin{ILE,CS,WR1,WR2,XFER}<=5'b10000;//設置為直通模式DAC_out<=DAC_out+1;endendendmodule直通模式只需設置兩級寄存器一直開啟然后發(fā)送二進制數(shù)據(jù),僅存在一種狀態(tài),所以無須用狀態(tài)機描述。DAC_out是一條8位的總線,自加到255后會自動回零。時鐘的分頻比div_dat=10000,對系統(tǒng)100MHz時鐘進行分頻,使數(shù)字信號有足夠時間完成數(shù)模轉換。【例7.12】采用單緩沖模式設計數(shù)模轉換器DAC0832輸出鋸齒波。`timescale1ns/1psmoduledac0832_fsm1(DAC_out,ILE,CS,WR1,WR2,XFER,clk,Res);outputregILE,CS,WR1;outputWR2,XFER;outputreg[7:0]DAC_out;inputclk;//100MHzinputRes;//平時為低電平,按下后高電平復位
7.7.2DAC0832的Verilog描述parameterdiv_dat=100;//分頻比100parameterMSB=2,LSB=0;wireclk_div;//分頻后的時鐘reg[7:0]cnt;//cnt位數(shù)應大于等于div_datreg[MSB:LSB]state,next_state;//與localparam編碼位數(shù)一致localparam[MSB:LSB]IDLE=3'b001,s1=3'b010,s2=3'b100;always@(posedgeclk,posedgeRes)beginif(Res)cnt<=0;elsebeginif(cnt>=div_dat)begincnt<=0;endelsebegincnt<=cnt+1;endendend7.7.2DAC0832的Verilog描述assignclk_div=(cnt==div_dat)?1:0;//時鐘分頻100MHz/div_datalways@(posedgeclk_div,posedgeRes)//時鐘上升沿beginif(Res)beginstate<=IDLE;end//同步復位elsestate<=next_state;//現(xiàn)態(tài)endalways@(posedgeclk_div,posedgeRes)beginif(Res)beginnext_state<=IDLE;endelsebegincase(state)//次態(tài)跳轉
IDLE:beginnext_state<=s1;ends1:beginnext_state<=s2;ends2:beginnext_state<=IDLE;enddefault:beginnext_state<=IDLE;end//多余的狀態(tài)處理endcaseendend7.7.2DAC0832的Verilog描述assign{WR2,XFER}=2'b00;//第二級緩沖設為直通always@(posedgeclk_div,posedgeRes)beginif(Res)begin{ILE,CS,WR1}=3'b011;DAC_out=8'b0000_0000;endelsebegincase(state)IDLE:beginDAC_out=DAC_out+1;end//發(fā)送數(shù)據(jù)s1:begin{ILE,CS,WR1}=3'b100;end//第一級緩沖開s2:begin{ILE,CS,WR1}=3'b011;end//第一級緩沖關default:begin{ILE,CS,WR1}=3'b011;DAC_out=0;end//多余的狀態(tài)處理
7.7.2DAC0832的Verilog描述endcaseendendendmodule采用三段式狀態(tài)機設計單緩沖的DAC0832鋸齒波發(fā)生器。DAC0832的第二級緩沖設計為常開,只對第一級緩沖進行控制。鋸齒波的頻率可以通過變量clk_div進行改變。DAC_out發(fā)生變化后,開啟緩沖使數(shù)據(jù)進入轉換器進行DA轉換。【例7.13】采用雙緩沖模式設計數(shù)模轉換器DAC0832輸出鋸齒波。`timescale1ns/1psmoduledac0832_fsm2(DAC_out,ILE,CS,WR1,WR2,XFER,clk,Res);outputregILE,CS,WR1;outputregWR2,XFER;outputreg[7:0]DAC_out;inputclk;//100MHzinputRes;//平時為低電平,按下后高電平復位parameterdiv_dat=100;//分頻比1007.7.2DAC0832的Verilog描述parameterMSB=3,LSB=0;wireclk_div;//分頻后的時鐘reg[7:0]cnt;//cnt位數(shù)應大于等于div_datreg[MSB:LSB]state,next_state;//與localparam編碼位數(shù)一致localparam[MSB:LSB]IDLE=4'b0001,s1=4'b0010,s2=4'b0100,s3=4'b1000;always@(posedgeclk,posedgeRes)beginif(Res)cnt<=0;elsebeginif(cnt>=div_dat)begincnt<=0;endelsebegincnt<=cnt+1;endendend
7.7.2DAC0832的V
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年江西中醫(yī)藥高等??茖W校高職單招語文2018-2024歷年參考題庫頻考點含答案解析
- 2025年江蘇安全技術職業(yè)學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2025年武漢城市職業(yè)學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 2025年新疆建設職業(yè)技術學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 社會保險與福利政策解讀
- 互聯(lián)網嵌入對新農人創(chuàng)業(yè)績效的影響研究
- 2025年外研版三年級起點九年級地理下冊月考試卷含答案
- 2025年外研銜接版七年級生物上冊階段測試試卷
- 2025年粵教版選修2地理下冊月考試卷
- 智能制造投資咨詢合同(2篇)
- 江西省部分學校2024-2025學年高三上學期1月期末英語試題(含解析無聽力音頻有聽力原文)
- GA/T 2145-2024法庭科學涉火案件物證檢驗實驗室建設技術規(guī)范
- 2024年度窯爐施工協(xié)議詳例細則版B版
- 尿毒癥替代治療
- 基底節(jié)腦出血護理查房
- 工程公司總經理年終總結
- 【新能源汽車企業(yè)的財務風險控制研究:以比亞迪公司為例15000字】
- 醫(yī)美整形銷售培訓課件
- 安保服務技術標準及要求
- 芯片研發(fā)項目計劃表模板
- 公司戰(zhàn)略和績效管理doc資料
評論
0/150
提交評論