久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

北航eda實驗報告數字部分

時間:2019-05-12 03:43:33下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《北航eda實驗報告數字部分》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《北航eda實驗報告數字部分》。

第一篇:北航eda實驗報告數字部分

Verilog數字電路設計

實驗報告

院系: 組員:

年月日

Verilog實驗報告

目錄

分組概況....................................................................................................................................3 分組概況................................................................................................................................3 實驗概況................................................................................................................................4 實驗感想................................................................................................................................5

實驗內容....................................................................................................................................9 實驗一....................................................................................................................................9 實驗二..................................................................................................................................15 實驗三..................................................................................................................................25 實驗四..................................................................................................................................33

Verilog實驗報告

一、分組概況

組長:

主要負責各次實驗的總體進程,以及選做實驗的代碼編譯。在實驗報告中負責統籌規劃及后期編排。

組員:

負責各次實驗必做實驗源代碼的錄入及仿真。在實驗報告中負責報告前期錄入,包括各次實驗的簡要內容、步驟等。

Verilog實驗報告

二、實驗概況

本課程共安排四次實驗,其內容是:

1、練習

一、簡單的組合邏輯設計

練習

二、簡單分頻時序邏輯電路的設計 選做

一、設計一個字節(8位)的比較器

2、練習

三、利用條件語句實現計數分頻時序電路

練習

五、用always塊實現較復雜組合邏輯電路 選做

一、利用10MB時鐘設計一個單周期波形 選做

二、運用always塊設計一個8路數據選擇器

3、練習

四、阻塞賦值與非阻塞賦值的區別

練習

六、在Verilog中使用函數 練習

七、在Verilog中使用任務

練習題

5、綜合一個可以計算正整數平方、立方、階乘的函數 思考題

3、在blocking模塊中實現對兩種寫法的仿真

4、必做

一、設計一個串行數據檢測器

必做

二、樓梯燈——基本任務 選做

一、樓梯燈——擴展任務

Verilog實驗報告

三、感想

通過這4次的實驗,我們基本熟悉Modelsim 軟件,掌握了Modelsim 軟件的編譯、仿真方法。同時在編寫程序的過程中,加深了我們對課上所講的語法的認識以及學會了測試模塊的編寫。經過實驗一,我們掌握了基本組合邏輯電路,基本時序電路;經過實驗二,我們掌握條件語句在簡單時序模塊設計中的使用、在Verilog模塊中應用計數器以及用always實現較大組合邏輯電路;經過實驗三,我們掌握阻塞賦值與非阻塞賦值的概念與區別,了解函數的定義和在模塊設計中的使用,掌握任務在verilog模塊設計中的應用;經過實驗四,我們掌握利用有限狀態機實現一般時序邏輯分析的方法。在實驗過程中,我們也遇到過程序編寫以及軟件仿真上的問題。程序編寫時,要注意一些細節,比如符號,全角與半角等。軟件仿真過程中,我們出現過程序無錯,但添加波形運行后,卻沒有波形的情況,最后上網百度,找到了解決方法。實驗總體來說,都比較順利。對于難度較大的實驗四,只要思路清晰,考慮到所有的情況,就能做出來。

Verilog實驗報告

四、實驗內容 第一次實驗課:

練習一 簡單的組合邏輯設計

實驗目的:(1)掌握基本組合邏輯電路的實現方法(2)初步了解兩種基本組合邏輯電路的生成方法(3)學習測試模塊的編寫(4)通過綜合和布局布線了解不同層次仿真的物理意義 實驗原理:

實驗代碼提供的是一個可綜合的數據比較器。從語句中可以看出是比較數據a,b的結果,結果相同輸出1,否則輸出0.測試模塊用于檢測模塊設計是否正確,給出輸入信號,觀察模塊的內部信號和輸出信號以確定設計是否正確。綜合就是把compare.v文件送到synplify或其他綜合器進行處理,啟動綜合器編譯。布局布線就是把綜合后的另一種文件(EDIF),在布線工具控制下進行處理,啟動布局布線的編譯。實驗內容:

模塊源代碼的組合邏輯仿真與測試

實驗代碼:

module compare(equal,a,b);inputa,b;output equal;

assign equal =(a==b)?1:0;

endmodule

實驗仿真:

測試程序:

`timescale 1ns/1ns `include “./compare.v”

module t;rega,b;wire equal;initial begin a=0;b=0;#100 a=0;b=1;#100 a=1;b=1;#100 a=1;b=0;

Verilog實驗報告

#100 a=0;b=0;#100 $stop;end

compare m(.equal(equal),.a(a),.b(b));

endmodule 仿真結果:

練習二 簡單分頻時序邏輯電路的設計

實驗目的:(1)掌握最基本時序電路的實現方法(2)學習時序電路測試模塊的編寫(3)學習綜合和不同層次的仿真 實驗原理:

對于組合邏輯電路,可綜合成具體電路結構的時序邏輯電路也有準確的表達方式。在可綜合的模型中,通常用always塊或者@(posedgeclk)或(negedgeclk)結構表達時序邏輯。實驗為二分之一分頻器模型。

在always塊中,被賦值信號都必須定義為reg型,對于reg型數據,如果未對它進行賦值,仿真工具會認為它是不定態的。為了正確觀察結果,在可綜合模塊中,常定義一個復位信號reset,其為低電平時對寄存器進行復位。實驗內容:

分頻時序電路的仿真測試

實驗代碼:

modulehalf_clk(reset,clk_in,clk_out);inputclk_in,reset;outputclk_out;regclk_out;always @(posedgeclk_in)begin if(!reset)clk_out=0;elseclk_out=~clk_out;end endmodule 實驗仿真:

測試程序:

Verilog實驗報告

`timescale 1ns/100ps `define clk_cycle 50 module top;reg clk,reset;wire clk_out;always #`clk_cycle clk=~clk;initial begin clk=0;reset=1;#10 reset=0;#110 reset=1;#100000 $stop;end half_clk m0(.reset(reset),.clk_in(clk),.clk_out(clk_out));endmodule 仿真結果:

選做一 設計一個字節(8位)比較器

實驗內容:

比較兩個字節的大小,若a[7:0]大于b[7:0],則輸出高電平,否則輸出低電平。

實驗代碼:

module compare8(equal,a,b);input [7:0]a,b;output equal;reg equal;always@(a or b)if(a>b)equal=1;else equal=0;endmodule 實驗仿真:

測試程序:

`timescale 1ns/1ns

Verilog實驗報告

`include “./compare8.v” module test8;reg [7:0]a;reg [7:0]b;wire equal;initial begin a=8'b10000000;b=8'b00000000;#100 a=8'b00001000;b=8'b00001111;#100 a=8'b00001111;b=8'b00011111;#100 a=8'b11111111;b=8'b11111111;#100 a=8'b10101010;b=8'b00001111;#100 $stop;end compare8 m(.equal(equal),.a(a),.b(b));endmodule 仿真結果:

第二次實驗課

練習三 利用條件語句實現計數分頻時序電路

實驗目的:(1)掌握條件語句在簡單時序模塊設計中的使用(2)學習在Verilog模塊中應用計數器(3)學習測試模塊的編寫、綜合和不同層次的仿真 實驗原理:

在可綜合的Verilog HDL模型中,常用的條件語句有if ?else和case?endcase兩種結構,用法和C語言相似。1.if語句(1)if(表達式)語句

(2)if(表達式)語句1 else語句2(3)if(表達式1)語句1;

else if(表達式2)語句2; else if(表達式3)語句3;

Verilog實驗報告

?? 2.case語句

(1)case(表達式)endcase(2)casez(表達式)endcase(3)casex(表達式)endcase 前者用于不太復雜的分支關系,實際編寫模塊時常用的是后者。實驗代碼是一個可綜合風格的分頻器,可將10M時鐘分頻為500K,基本原理和二分之一分頻器類似,但需要定義一個計數器以準確獲得1/20分頻。實驗內容:

進行所給代碼計數分頻器的仿真測試并觀察輸出波形

實驗代碼:

modulefdivsion(RESET,F10M,F500K);input F10M,RESET;output F500K;reg F500K;reg [7:0]j;always @(posedge F10M)if(!RESET)begin F500K<=0;j<=0;end else begin if(j==9)begin j<=0;F500K<=~F500K;end else j<=j+1;end endmodule 實驗仿真:

測試程序:

`timescale 1ns/100ps `defineclk_cycle 50 moduledivision_top;reg F10M,RESET;wire F500K_clk;always #`clk_cycle F10M=~F10M;initial

Verilog實驗報告

begin RESET=1;F10M=0;#100 RESET=0;#100 RESET=1;#10000 $stop;end fdivsion m0(.RESET(RESET),.F10M(F10M),.F500K(F500K_clk));endmodule

仿真結果:

練習五 用always塊實現較復雜的組合邏輯電路

實驗目的:

(1)掌握用always實現較大組合邏輯電路的方法;

(2)進一步了解assign與always兩種組合電路實現方法的區別和注意點;(3)學習測試模塊中隨機數的產生和應用;(4)學習綜合不同層次的仿真,并比較結果。實驗原理:

(1)自觸發always塊:

例:采用非阻塞賦值的自觸發振蕩器

module osc2(clk);outputclk;regclk;initial #10 clk=0;always @(clk)#10 clk<=~clk;endmodule @(clk)的第一次觸發之后,非阻塞賦值的RHS表達式便計算出來,并把值賦給LHS的時間并安排在更新事件隊列中。在非阻塞賦值更新事件隊列被激活之前,又遇到了@(clk)觸發語句,并且always塊再次對clk的值變化產生反應。當非阻塞LHS的值在同一時刻被更新時,@(clk)再一次觸發。

本實驗示例中使用了電平敏感的always塊,所謂電平敏感的觸發條件:@后的括號內電平里表中的任何一個電平發生變化(與時序邏輯不同,它在@后的括號內沒有沿敏感關鍵詞,如posedge或negedge),就能觸發always塊的動作。(2)assign與always

Verilog實驗報告

使用assign結構來實現組合邏輯電路,如果邏輯關系比較復雜,不容易理解語句的功能,而適當采用always來設計組合邏輯,使源代碼語句的功能容易理解。

同一組合邏輯電路分別用always塊和連續賦值語句assign描述時,代碼的形式大相徑庭,但在always中,若適當運用default(在case結構中)和else(在if?else結構中)語句時,通常可以綜合為純組合邏輯,盡管被賦值的變量一定要定義為reg型;若不使用default或else對默認項進行說明,則易生成意想不到的鎖存器,這一點一定注意!

實驗代碼:

`define plus 3'd0 `define minus 3'd1 `define band 3'd2 `definebor 3'd3 `defineunegate 3'd4 modulealu(out,opcode,a,b);output[7:0] out;reg[7:0] out;input[2:0] opcode;input[7:0] a,b;always@(opcode or a or b)begin case(opcode)`plus: out=a+b;`minus: out=a-b;`band: out=a&b;`bor: out=a|b;`unegate: out=~a;default: out=8'hx;endcase end endmodule 實驗仿真:

測試程序:

`timescale 1ns/1ns `include “./alu.v” moduleaultest;wire[7:0] out;reg[7:0] a,b;reg[2:0] opcode;parameter times=5;initial begin a={$random}%256;

Verilog實驗報告

b={$random}%256;opcode=3'h0;repeat(times)begin #100 a={$random}%256;b={$random}%256;opcode=opcode+1;end #100 $stop;end alu alu1(out,opcode,a,b);endmodule 仿真結果:

選做

一、利用10MB時鐘設計一個單周期波形

實驗內容:

利用原有代碼,自己編寫模塊源代碼和測試模塊代碼,利用10M時鐘,設計一個單周期形狀的周期波形

實驗代碼:

module fdivision2(RESET,clk,out);inputclk,RESET;output out;reg out;reg [15:0]j;always @(posedgeclk)if(!RESET)begin out<=0;j<=0;end else begin if(j==199)begin j<=j+1;out<=~out;end

Verilog實驗報告

else begin if(j==299)begin j<=j+1;out<=~out;end else if(j==499)j<=0;else j<=j+1;end end endmodule 實驗仿真:

測試程序:

`timescale 1ns/100ps `defineclk_cycle 50 modulefdivision_top;regclk,RESET;wireout_clk;always #`clk_cycleclk=~clk;initial begin RESET=1;clk=0;#1000 RESET=0;#1000 RESET=1;#100000 $stop;end fdivision2fdivision(.RESET(RESET),.clk(clk),.out(out_clk));endmodule 仿真結果:

Verilog實驗報告

選做

二、用always塊實現較復雜的組合邏輯電路

實驗內容:

運用always塊設計一個8路數據選擇器。要求:每路輸入數據與輸出數據均為4位2進制數,當選擇開關(至少3位)或輸入數據變化時,輸出數據也相應的變化。

實驗代碼:

module lianxi4(out,opcode,a,b,c,d,e,f,g,h);output[3:0] out;reg[3:0] out;input[2:0] opcode;input[3:0] a,b,c,d,e,f,g,h;

always@(opcode or a or b or c or d or e or f or g or h)begin case(opcode)3'd0:out=a;3'd1:out=b;3'd2:out=c;3'd3:out=d;3'd4:out=e;3'd5:out=f;3'd6:out=g;3'd7:out=h;endcase end endmodule 實驗仿真:

測試程序:

`timescale 1ns/1ns `include “./lianxi4.v” module lianxi4_t;wire[3:0] out;reg[3:0] a,b,c,d,e,f,g,h;reg[2:0] opcode;parameter times=8;initial begin a={$random}%16;b={$random}%16;c={$random}%16;d={$random}%16;e={$random}%16;

Verilog實驗報告

f={$random}%16;g={$random}%16;h={$random}%16;opcode=3'b0;repeat(times)begin #100 a={$random}%16;b={$random}%16;c={$random}%16;d={$random}%16;e={$random}%16;f={$random}%16;g={$random}%16;h={$random}%16;opcode=opcode+1;仿真結果:

Verilog實驗報告

第三次實驗課

練習四 阻塞賦值與非阻塞賦值的區別

實驗目的:

(1)通過實驗,掌握阻塞賦值與非阻塞賦值的概念與區別;(2)了解非阻塞與阻塞賦值的不同使用場合;

(3)學習測試模塊的編寫、綜合和不同層次的仿真。實驗原理:

非阻塞賦值方式:在語句塊中,上面語句所賦的變量值不能立即就為下面的語句所用;塊結束后才能完成這次賦值操作,而所賦的變量值是上一次賦值所得;在編寫可綜合的時序邏輯模塊時,這是最常用的賦值方法。

阻塞賦值方式:賦值語句執行完后,塊才結束;被賦的值才賦值語句執行完后立刻就改變;在時序邏輯中使用時,可能會產生意想不到的結果。

在always塊中,阻塞賦值可以理解為賦值語句是順序執行的,而非阻塞賦值可以理解為賦值語句是并發執行的。在時序邏輯設計中,通常使用非阻塞賦值語句,而在實現組合邏輯的assign結構中,或者always塊結構中都必須采用阻塞賦值語句。

實驗代碼:

module blocking(clk,a,b,c);output[3:0] b,c;input [3:0] a;inputclk;reg [3:0] b,c;always@(posedgeclk)begin b=a;c=b;$display(“blocking:a=%d,b=%d,c=%d.”,a,b,c);end endmodule

modulenonblocking(clk,a,b,c);output[3:0] b,c;input [3:0] a;inputclk;reg [3:0] b,c;always@(posedgeclk)begin b<=a;c<=b;$display(“nonblocking:a=%d,b=%d,c=%d.”,a,b,c);end endmodule 實驗仿真:

Verilog實驗報告

測試程序:

`timescale 1ns/100ps `include“./blocking.v” `include“./nonblocking.v” modulecomparetop;wire [3:0] b1,c1,b2,c2;reg[3:0] a;regclk;initial begin clk=0;forever #50 clk=~clk;end initial begin a=4'h3;$display(“_”);#100 a=4'h7;$display(“_”);#100 a=4'hf;$display(“_”);#100 a=4'ha;$display(“_”);#100 a=4'h2;$display(“_”);$stop;end nonblockingnonblocking(clk,a,b2,c2);blocking blocking(clk,a,b1,c1);endmodule 測試結果:

思考題3在blocking模塊中實現對兩種寫法的仿真

實驗內容:

在blocking模塊中按如下兩種寫法,仿真與綜合的結果會有什么樣的變化?做出仿真波形。

實驗代碼:

Verilog實驗報告

module blocking1(clk,a,b,c);output[3:0] b,c;input [3:0] a;inputclk;reg [3:0] b,c;always@(posedgeclk)begin c=b;b=a;end endmodule

module blocking2(clk,a,b,c);output[3:0] b,c;input [3:0] a;inputclk;reg [3:0] b,c;always@(posedgeclk)b=a;always@(posedgeclk)c=b;endmodule 實驗仿真:

測試程序:

`include“./blocking1.v” `include“./blocking2.v” module top;wire [3:0] b1,c1,b2,c2;reg[3:0] a;regclk;initial begin clk=0;forever #50 clk=~clk;end initial begin a=4'h3;$display(“_”);#100 a=4'h7;$display(“_”);#100 a=4'hf;$display(“_”);#100 a=4'ha;$display(“_”);

Verilog實驗報告

#100 a=4'h2;$display(“_”);$stop;end blocking2 blocking2(clk,a,b2,c2);blocking1 blocking1(clk,a,b1,c1);endmodule 測試結果:

練習六 在Verilog HDL中使用函數

實驗目的:

(1)了解函數的定義和在模塊設計中的使用;(2)了解函數的綜合性問題;

(3)了解許多綜合器不能綜合復雜的算術運算。實驗原理:

與一般的程序設計語言一樣,Verilog HDL中也可使用函數以適應對不同變量采取同一種運算的操作。Verilog HDL函數在綜合時被理解成具有獨立運算功能的電路,每調用一次函數相當于改變這部分電路的輸入以得到相應的計算結果。函數的目的是返回一個用于表達式的值。(1)函數定義

Function<返回值的類型或范圍>(函數名); <端口說明語句> <變量類型說明語句> Begin <語句>

?? End Endfuction(2)函數調用

<函數名>(<表達式>,?<表達式>)實驗內容:

采用同步時鐘觸發運算的執行,每個clk時鐘周期都會執行一次運算,并且在測試模塊中,通過調用系統任務$display及在時鐘的下降沿顯示每次計算的結果。

實驗代碼:

moduletryfunct(clk,n,result,reset);output [31:0] result;input [3:0] n;

Verilog實驗報告

inputreset,clk;reg [31:0] result;

always @(posedgeclk)begin if(!reset)result<=0;else begin result<=n*factorial(n)/((n*2)+1);end end

function [31:0] factorial;input [3:0] operand;reg [3:0] index;begin factorial=operand?1:0;for(index=2;index<=operand;index=index+1)factorial=index*factorial;end endfunction

endmodule 實驗仿真:

測試程序:

`include “./tryfunct.v” `timescale 1ns/1ns `define clk_cycle 50

module tryfunct_test;reg[3:0] n,i;reg reset,clk;wire [31:0] result;

initial begin clk=0;n=0;reset=1;#100 reset=0;#100 reset=1;for(i=0;i<=15;i=i+1)

Verilog實驗報告

begin #200 n=i;end #100 $stop;end

always #`clk_cycle clk=~clk;

tryfunct m(.clk(clk),.n(n),.result(result),.reset(reset));

endmodule 測試結果:

練習七 在Verilog HDL中使用任務(task)

實驗目的:

(1)掌握任務在verilog模塊設計中的應用;

(2)學會在電平敏感列表的always中使用拼接操作、任務和阻塞賦值等語句,并生成復雜組合邏輯的高級方法。實驗原理:

當我們希望能夠將一些信號進行運算并輸出多個結果時,采用函數結構就顯得非常不方便,而任務結構在這方面的優勢則十分突出。任務本身并不返回計算值,但它通過類似C語言中的形參與實參的數據變換,非常容易實現運算結果的調用。此外,還常常利用任務來包裝模塊設計中的許多復雜的過程,將許多復雜的操作步驟用一個命名清晰易懂的任務隱藏起來,大大提高程序可讀性。(1)任務和函數的不同

函數只能與主模塊共用同一個仿真時間單位,而任務可以定義自己的仿真時間單位;函數不能啟動任務但任務能啟動其他任務和函數;函數至少要有一個輸入變量,而任務可以沒有或有多個任何類型的變量;函數返回一個值,任務則不返回值。(2)任務定義

Task<任務名> <端口及數據類型聲明語句> <語句1> ?? Endtask(3)任務調用

<任務名>(端口1,端口2,?端口n); 實驗內容:

Verilog實驗報告

利用電平敏感的always快和一個比較兩變量大小排序的任務,設計出四個(4位)并行輸入數的高速排序組合邏輯。

實驗代碼:

module sort4(ra,rb,rc,rd,a,b,c,d);output[3:0] ra,rb,rc,rd;input[3:0] a,b,c,d;reg[3:0] ra,rb,rc,rd;reg[3:0] va,vb,vc,vd;

always @(a or b or c or d)begin {va,vb,vc,vd}={a,b,c,d};sort2(va,vc);sort2(vb,vd);sort2(va,vb);sort2(vc,vd);sort2(vb,vc);{ra,rb,rc,rd}={va,vb,vc,vd};end

task sort2;inout[3:0] x,y;reg[3:0] tmp;if(x>y)begin tmp=x;x=y;y=tmp;end endtask

endmodule 實驗仿真:

測試程序:

`timescale 1ns/100ps `include “sort4.v”

moduletask_test;reg[3:0] a,b,c,d;wire[3:0] ra,rb,rc,rd;

initial

Verilog實驗報告

begin a=0;b=0;c=0;d=0;repeat(50)begin #100 a={$random}%15;b={$random}%15;c={$random}%15;d={$random}%15;end

#100 $stop;end

sort4 sort4(.a(a),.b(b),.c(c),.d(d),.ra(ra),.rb(rb),.rc(rc),.rd(rd));

endmodule 測試結果:

選做一 綜合一個可以計算整數平方、立方、階乘的函數

實驗內容:

設計一個函數,可以計算整數平方、立方、以及不大于5的階乘

實驗代碼:

modulelianxi(clk,n,opcode,result,reset);output [7:0] result;input [3:0] n,opcode;inputreset,clk;reg [7:0] result;

always @(posedgeclk)begin if(!reset)result<=0;else begin case(opcode)3'd0: result<=pingfang(n);

Verilog實驗報告

3'd1: result<=lifang(n);3'd2: result<=jiecheng(n);default: result=8'hx;endcase end end

function [7:0] jiecheng;input [3:0] operand;reg [3:0] index;begin jiecheng=operand?1:0;for(index=2;index<=operand;index=index+1)jiecheng=index*jiecheng;end endfunction

function [7:0] pingfang;input [3:0] operand;pingfang=operand*operand;endfunction

function [7:0] lifang;input [3:0] operand;lifang=operand*operand*operand;endfunction

endmodule 實驗仿真:

測試程序:

`include “./lianxi.v” `timescale 1ns/1ns `define clk_cycle 50

module lianxi_test;reg[3:0] n,opcode;regreset,clk;wire [7:0] result;parameter times=20;

initial begin clk=0;

Verilog實驗報告

n=0;reset=1;opcode=0;#100 reset=0;#100 reset=1;begin n={$random}%6;opcode={$random}%3;repeat(times)begin #100 n={$random}%6;opcode={$random}%3;end end

#1000 $stop;end

always #`clk_cycleclk=~clk;

lianxi lian(.clk(clk),.n(n),.opcode(opcode),.result(result),.reset(reset));

endmodule 仿真結果:

第四次實驗課

必做一[練習題七]設計一個串行數據檢測器

實驗目的:

(1)掌握利用有限狀態機實現一般時序邏輯分析的方法;(2)掌握用Verilog編寫可綜合的有限狀態機的標準模板;(3)掌握用Verilog編寫狀態機模塊的測試文件的一般方法。實驗原理:

(1)有限狀態機

有限狀態機是指輸出取決于過去輸入部分和當前輸入部分的時序邏輯電路。一般來說,除了輸入部分和輸出部分外,有限狀態機還含有一組具有“記憶”功能的寄存器,這些寄存器的功能是記憶有限狀態機的內部狀態,它們常被稱為狀態寄存

Verilog實驗報告

器。在有限狀態機中,狀態寄存器的的下一個狀態不僅與輸入信號有關,而且還與該寄存器的當前狀態有關,因此有限狀態機又可以認為是組合邏輯和寄存器邏輯的一種組合。其中,寄存器邏輯的功能是存儲有限狀態機的內部狀態;而組合邏輯又可以分為次態邏輯和輸出邏輯兩部分,次態邏輯的功能是確定有限狀態機的下一個狀態,輸出邏輯的功能是確定有限狀態機的輸出。(2)有限狀態機設計

邏輯抽象,得出狀態裝換圖;狀態化簡;狀態分配;選定觸發器的類型并求出狀態方程、驅動方程和輸出方程;按照方程得出邏輯圖。

在數字電路中我們已經學習過通過建立有限狀態機來進行數字邏輯的設計,而在Verilog HDL硬件描述語言中,這種設計方法得到進一步的發展。通過Verilog HDL提供的語句,我們可以直觀地設計出適合更為復雜的時序邏輯的電路。實驗內容:

設計一個串行數據檢測器。要求是:連續4個或4個以上為1時輸出為1,其他輸入情況下為0。編寫測試模塊對設計的模塊進行各種層次的仿真,并觀察波形,編寫實驗報告。

實驗代碼:

module lianxiti7(x,z,clk,rst,state);inputx,clk,rst;output z;output[2:0]state;reg[2:0]state;wire z;

parameter IDLE='d0,A='d1,B='d2,C='d3,D='d4;

always@(posedgeclk)if(!rst)begin state<=IDLE;end else case(state)IDLE: state<=x ?A : IDLE;A: state<=x ?B : IDLE;B: state<=x ?C : IDLE;C: state<=x ?D :IDLE;D: state<=x ?state : IDLE;

default:state=IDLE;endcase assign z=(state==D);endmodule

Verilog實驗報告

實驗仿真:

測試程序:

`timescale 1ns/1ns `include “./lianxiti7.v” modulelianxititop;regclk,rst;reg[23:0] data;wire[2:0] state;wirez,x;assign x=data[23];always #10 clk=~clk;always @(posedgeclk)data={data[22:0],data[23]};

initial begin clk=0;rst=1;#2 rst=0;#30 rst=1;data='b1001_1110_0111_1101_0101;#500 $stop;end lianxiti7 m(x,z,clk,rst,state);endmodule 仿真結果:

必做二 樓梯燈——基本任務

實驗內容:

樓下到樓上依次有3個感應燈:燈

1、燈

2、燈3。當行人上下樓梯時,各個燈感應到后自動點亮,若在8s內感應信號消失,則點亮8s,若感應信號存在時間超過8s,則感應信號消失4s后燈自動關閉。

任務1:做出如上邏輯電路設計并仿真; 任務2:考慮去抖,對于感應信號到達存在毛刺(小于0.5s),設計邏輯并剔出。

實驗代碼:

module loutid1(clk10,rst,switch,light);

input clk10,rst;input[2:0]switch;output[2:0]light;

reg[2:0]state1,state2,state3;reg[7:0]count1,count2,count3;reg[2:0]count_1,count_2,count_3;reg[2:0]light;

parameter

state1_start=3'b000,state2_start=3'b000,state3_start=3'b000,state1_work=3'b001,state2_work=3'b001,state3_work=3'b001,state1_up=3'b010,state2_up=3'b010,state3_up=3'b010,state1_down=3'b011,state2_down=3'b011,state3_down=3'b011,state1_other=3'b100,state2_other=3'b100,state3_other=3'b100;

always@(posedge clk10)if(!rst)begin state1<=state1_start;count1<=8'b0;count_1<=3'b0;end else if(switch[0]=='b1&&count_1<4)count_1<=count_1+1;else case(state1)

state1_start: if(switch[0]=='b1)begin state1<=state1_up;count1<=78;end

Verilog實驗報告

else begin

state1<=state1_start;light[0]<='b0;end

state1_up: begin

light[0]<='b1;

state1<=state1_work;end

state1_work: if(count1>0)begin

count1<=count1-1;end else

if(switch[0]=='b0)begin

state1<=state1_down;end else begin

state1<=state1_other;

count1<=39;end

state1_other: if(switch[0]=='b1)

state1<=state1_other;else

if(count1>0)begin

count1<=count1-1;end else

state1<=state1_down;

state1_down: begin light[0]<='b0;count_1<=3'b0;state1<=state1_start;end

default: state1<=state1_start;

endcase

always@(posedge clk10)if(!rst)begin state2<=state2_start;count2<=8'b0;count_2<=3'b0;end else if(switch[1]=='b1&&count_2<4)count_2<=count_2+1;else case(state2)

state2_start: if(switch[1]=='b1)begin state2<=state2_up;count2<=78;end else begin state2<=state2_start;light[1]<='b0;end

state2_work: if(count2>0)begin count2<=count2-1;end else if(switch[1]=='b0)begin

Verilog實驗報告

state2<=state2_down;end else begin

state2<=state2_other;

count2<=39;end

state2_other: if(switch[1]=='b1)

state2<=state2_other;else

if(count2>0)begin

count2<=count2-1;end else

state2<=state2_down;

state2_down: begin

light[1]<='b0;

count_2<=3'b0;

state2<=state2_start;end

state2_up: begin

light[1]<='b1;

state2<=state2_work;end

default:

state2<=state2_start;

endcase

always@(posedge clk10)if(!rst)begin

state3<=state3_start;count3<=8'b0;count_3<=3'b0;end else if(switch[2]=='b1&&count_3<4)count_3<=count_3+1;else case(state3)

state3_start: if(switch[2]=='b1)begin state3<=state3_up;count3<=78;end else begin state3<=state3_start;light[2]<='b0;end

state3_work: if(count3>0)begin count3<=count3-1;end else if(switch[2]=='b0)begin

state3<=state3_down;end else begin state3<=state3_other;

實驗仿真:

測試程序:

`timescale 10ms/1ms module loutid1_t;reg clk10,rst;reg[2:0] swh;wire[2:0] light;

Verilog實驗報告

count3<=39;end

state3_other: if(switch[2]=='b1)

state3<=state3_other;else

if(count3>0)begin

count3<=count3-1;end else

state3<=state3_down;

state3_down: begin

light[2]<='b0;

count_3<=3'b0;

state3<=state3_start;end

state3_up: begin

light[2]<='b1;

state3<=state3_work;end

default:

state3<=state3_start;

endcase

endmodule

Verilog實驗報告

parameter HALF_PERIOD = 5;

always #HALF_PERIOD clk10=~clk10;

initial begin

clk10 = 0;

rst = 1;

swh=3'b000;

#1 rst = 0;

#10 rst = 1;

#100 swh=3'b000;

#100 swh=3'b001;#400 swh=3'b000;#40 swh=3'b001;#500 swh=3'b010;#900 swh=3'b000;#400 swh=3'b100;#400 swh=3'b000;#600 swh=3'b001;#40 swh=3'b000;

#1000 $stop;end 仿真結果:

選做一:樓梯燈——拓展任務

實驗內容:

任務3:若為節約能源,下一個燈點亮的同時將自動關閉上一個燈,作出如上邏輯設計并仿真(僅考慮一個人的情況);

任務4:考慮存在多個人上下樓梯的情況,比如:

行人1已經從燈1到達燈2,燈2受感應自動點亮,但此時行人2剛上樓梯到達燈1的位置,則燈1和燈2都須點亮,更加復雜一點,如果行人2是下樓梯剛到達燈3位置,作出如上邏輯設計并仿真;

實驗代碼:

modulelight_All(clk10,rst,switch,light);

input clk10,rst;input[2:0]switch;output[2:0]light;

reg[2:0]state1,state2,state3;reg[7:0]count1,count2,count3;reg[2:0]count_1,count_2,count_3;reg[2:0]light;

parameter

state1_start=3'b000,state2_start=3'b000,state3_start=3'b000,state1_work=3'b001,state2_work=3'b001,state3_work=3'b001,state1_up=3'b010,state2_up=3'b010,state3_up=3'b010,state1_down=3'b011,state2_down=3'b011,state3_down=3'b011,state1_other=3'b100,state2_other=3'b100,state3_other=3'b100;

always@(posedge clk10)if(!rst)begin state1<=state1_start;count1<=8'b0;count_1<=3'b0;end else if(switch[0]=='b1&&count_1<4)count_1<=count_1+1;else case(state1)

state1_start: if(switch[0]=='b1)

Verilog實驗報告

begin

state1<=state1_up;count1<=78;end else begin

state1<=state1_start;light[0]<='b0;end

state1_work: if(count1>0)begin

count1<=count1-1;

if(switch[0]=='b0&&(state2==3'b010||state3==3'b010))begin

light[0]<='b0;state1<=state1_down;end end else

if(switch[0]=='b0)begin

state1<=state1_down;end else begin

state1<=state1_other;count1<=39;end

state1_other: if(switch[0]=='b1)

state1<=state1_other;else

if(count1>0)begin

count1<=count1-1;if(switch[0]=='b0&&(state2==3'b010||state3==3'b010))begin

light[0]<='b0;state1<=state1_down;end end else state1<=state1_down;

state1_down: begin light[0]<='b0;count_1<=3'b0;state1<=state1_start;end

state1_up: begin light[0]<='b1;state1<=state1_work;end

default: state1<=state1_start;

endcase

always@(posedge clk10)if(!rst)begin state2<=state2_start;count2<=8'b0;count_2<=3'b0;end else if(switch[1]=='b1&&count_2<4)count_2<=count_2+1;else case(state2)

state2_start: if(switch[1]=='b1)begin state2<=state2_up;count2<=78;

Verilog實驗報告

end else begin

state2<=state2_start;light[1]<='b0;end

state2_work: if(count2>0)begin

count2<=count2-1;

if(switch[1]=='b0&&(state1==3'b010||state3==3'b010))begin

light[1]<='b0;state2<=state2_down;end end else

if(switch[1]=='b0)begin

state2<=state2_down;end else begin

state2<=state2_other;count2<=39;end

state2_other: if(switch[1]=='b1)

state2<=state2_other;else

if(count2>0)begin

count2<=count2-1;if(switch[1]=='b0&&(state1==3'b010||state3==3'b010))begin

light[1]<='b0;

state2<=state2_down;end end else state2<=state2_down;

state2_down: begin light[1]<='b0;count_2<=3'b0;state2<=state2_start;end

state2_up: begin light[1]<='b1;state2<=state2_work;end

default: state2<=state2_start;

endcase

always@(posedge clk10)if(!rst)begin state3<=state3_start;count3<=8'b0;count_3<=3'b0;end else if(switch[2]=='b1&&count_3<4)count_3<=count_3+1;else case(state3)

state3_start: if(switch[2]=='b1)begin state3<=state3_up;count3<=78;end else begin state3<=state3_start;

Verilog實驗報告

light[2]<='b0;end

state3_work: if(count3>0)begin

count3<=count3-1;

if(switch[2]=='b0&&(state1==3'b010||state2==3'b010))begin

light[2]<='b0;state3<=state3_down;end end else

if(switch[2]=='b0)begin

state3<=state3_down;end else begin

state3<=state3_other;count3<=39;end

state3_other: if(switch[2]=='b1)

state3<=state3_other;else

if(count3>0)begin

count3<=count3-1;if(switch[2]=='b0&&(state1==3'b010||state2==3'b010))begin

light[2]<='b0;

state3<=state3_down;end end else

state3<=state3_down;

Verilog實驗報告

state3_down: begin light[2]<='b0;count_3<=3'b0;state3<=state3_start;end

state3_up: begin light[2]<='b1;

state3<=state3_work;end

default:

state3<=state3_start;

endcase

endmodule實驗仿真:

測試程序:

`timescale 10ms/1ms moduletest_light_All;reg clk10,rst;reg[2:0] up,down;wire[2:0] swh;wire[2:0] light;

parameter HALF_PERIOD = 5;

always #HALF_PERIOD clk10=~clk10;

initial

begin

clk10 = 0;

rst = 1;

up = 3'b000;down = 3'b000;

#1 rst = 0;

#10 rst = 1;

#100 up = 3'b001;down = 3'b000;

#300 up =3'b010;down = 3'b000;

#600 up = 3'b010;down = 3'b010;

#30 up = 3'b010;

#900 up = 3'b100;down = 3'b001;

#1000 $stop;

end

assignswh = up | down;

light_Allm5(clk10,rst,swh,light);endmodul仿真結果:

第二篇:北航_電子實習_數字部分實驗報告

報告名稱:電子電路設計訓練數字部

學院:儀器科學與光電工程學院

目錄

實驗報告概述:...............................................................................................................3

一、選做實驗總結:.................................................................................................3(1)補充練習2:樓梯燈設計.............................................................................3(2)練習題6:用兩種不同的設計方法設計一個功能相同的模塊,完成4個數據的冒泡排序...................................................................................................................5(3)(4)(5)

二、(1)(2)(3)(4)(5)練習題3:利用10MB的時鐘,設計一個單周期形狀的周期波形..................6 練習題4:運用always塊設計一個8路數據選擇器......................................6 練習題5:設計一個帶控制端的邏輯運算電路.............................................7 練習一:簡單組合邏輯設計.........................................................................7 練習三:利用條件語句實現計數分頻失序電路.............................................7 練習四:阻塞賦值與非阻塞賦值得區別.......................................................8 練習五:用always塊實現較復雜的組合邏輯電路........................................8 練習六:在verilog HDL中使用函數..............................................................9 必做實驗總結:.................................................................................................7(6)練習七:在verilog HDL中使用任務..............................................................9(7)練習八:利用有限狀態機進行時許邏輯設計..............................................10

三、實驗總結及體會:............................................................................................10

四、選作程序源代碼...............................................................................................11(1)練習題3:利用10MB的時鐘,設計一個單周期形狀的周期波形................11(2)練習題4:運用always塊設計一個8路數據選擇器....................................12(3)練習題5:設計一個帶控制端的邏輯運算電路...........................................13(4)練習題6:用兩種不同的設計方法設計一個功能相同的模塊,完成4個數據的冒泡排序.................................................................................................................14(5)補充練習2:樓梯燈設計...........................................................................16

圖表目錄

Figure 1 樓梯燈任務4..............................................................................................5 Figure 2 組合邏輯.....................................................................................................5 Figure 3 時序邏輯.....................................................................................................6 Figure 4 周期波形....................................................................................................6 Figure 5 8路數據選擇器..........................................................................................6 Figure 6 邏輯運算電路.............................................................................................7 Figure 7 組合邏輯設計.............................................................................................7 Figure 8 計數分頻時序電路......................................................................................8 Figure 9 阻塞賦值與非阻塞賦值得區別....................................................................8 Figure 10 always塊組合邏輯電路.............................................................................9 Figure 11 使用函數..................................................................................................9 Figure 12 使用任務................................................................................................10 Figure 13 有限狀態機............................................................................................10

電子電路設計訓練(數字部分)實驗報告

實驗報告概述:

本實驗報告為對四次電子電路設計訓練(數字部分)實驗的總結,主要包括以下四部分:

第一部分為選做實驗總結,主要包括每個選擇實驗的設計思路、運行結果、注意事項、心得體會;

第二部分為必做實驗總結,包括運行結果、總結、心得體會; 第三部分為課程總結和體會,是對全部實驗及課程的總結; 第四部分為選做實驗部分源代碼;

一、選做實驗總結:

(1)補充練習2:樓梯燈設計

設計思路:

本題給出樓梯的運行規則,并分別給與四個相應任務進行編程設計,考慮到程序的通用性及FPGA高速并行處理的優點,主要思路如下:

根據運行規則(8s內和大于8s等),對每個燈的相應狀態進行編程,設計時序邏輯及有限狀態機;由于在總體上看,每個燈的狀態變化相對獨立(只有一個人上樓除外),故對每個燈編程所得到的程序代碼可通用于其它燈(只需要改變相應寄存器定義即可),此即為燈控制模塊,對4個不同的任務,只需設計其它部分判斷邏輯,即可完成任務要求;如此設計,可大大提高程序設計效率、易用性,同時如果面對更多的燈控制需要,也可快速進行修改部署。

下面針對不同任務給出不同處理方法:

任務1/任務3:由于任務1和任務3在定義上有很大相同點,比如同樣是一個人走樓梯,若不考慮一個人同時在兩層使兩個燈亮,則事實上就是一個人始終只能使一盞燈亮,亮起后盞時熄滅前一盞;在保持每個燈控制模塊不改變的情況下,利用非阻塞賦值,判斷該人目前所處狀態及位置(上樓/下樓,樓層),同時規定輸出,同時只能亮一盞燈;

任務2:由于輸入信號已被賦值給寄存器變量,此時只需在系統時鐘作用下對寄存器中輸入變量進行判斷,滿足要求即為正確信號,再輸入燈控制模塊;

任務4:由于已有燈控制模塊,此時只需結合任務2防抖電路,直接輸出狀態信號所對應的結果即可;

(單個)燈控制模塊代碼:

always @(posedgeclk)begin signal_test[0]<=signal[0];if(signal_test[0]==signal[0])

begin

i0=i0+1;

end else

i0=0;if(i0>=5)

begin signal_reg[0]=signal[0];

end

if(state0==light_off)

begin

k0=0;

k0a=0;

k0b=0;

end else

k0=k0+1;

case(signal_reg[0])

1: if(!reset)

begin

state0=light_off;

end

else

begin

k0a=k0a+1;*分欄顯示,詳細代碼見報告第四部分;

運行結果:

if((k0a >= 79)&&(k0<=119))

state0=light_on12;

else

state0=light_on8;

end

0:if(!reset)

begin

state0=light_off;

end

else if(k0a==0)

state0=light_off;endcase

case(state0)

light_off:light_reg[0]=0;

light_on8:

begin light_reg[0]=1;

if(k0b==79)

state0=light_off;

else

k0b=k0b+1;

end

light_on12:

begin

light_reg[0]=1;

if(k0b==119)

state0=light_off;

else

k0b=k0b+1;

end endcase end

Figure 1樓梯燈任務4

Figure 2樓梯燈信號防抖部分放大結果

(2)練習題6:用兩種不同的設計方法設計一個功能相同的模塊,完成4個數據的冒泡排序

設計思路:

純組合排序中,設計sort排序任務對數列中的元素進行排序,通過調用任務實現對不同元素的排序功能,并將排序完成的結果直接輸出;

冒泡排序即為每次將兩個相鄰數進行比較,大的數后“浮”,每一趟比較獲得較大值并置于數列末位;

根據題目要求,每比較一次,即將調換位置的數字進行輸出;同樣設計sort任務,對兩數字進行比較并排序;

通過排序控制和邏輯判斷代碼,控制sort任務的有效調用,進而實現冒泡排序功能;

根據設計要求,程序中只設計有一個輸入端口,通過對輸入信號不斷移位,模擬串并行信號轉換,從而完成穿行輸入,并行比較的功能;

運行結果:

Figure 3組合邏輯

Figure 4時序邏輯

(3)練習題3:利用10MB的時鐘,設計一個單周期形狀的周期波形

設計思路:

對輸入時鐘進行計數,通過if語句進行判斷,若滿足判斷條件,則按要求改變輸出信號;如此循環往復,即可產生所需單周期形狀的周期波形;

運行結果:

Figure 5周期波形

(4)練習題4:運用always塊設計一個8路數據選擇器

設計思路:

利用define宏定義預先定義,利于后期程序功能的擴充和調整;同時利用case語句判斷信號,并將相對應信號輸出,進而完成系統目標功能;

運行結果:

Figure 68路數據選擇器

(5)練習題5:設計一個帶控制端的邏輯運算電路

設計思路:

設計三個函數分別完成三個要求的計算,通過函數調用實現相應功能;設計的控制端為同步控制端,需要通過時鐘信號從而進行檢測復位;

運行結果:

Figure 7邏輯運算電路

二、必做實驗總結:

(1)練習一:簡單組合邏輯設計

語法要點:

Assign語句構成的組合邏輯電路,若輸入a,b改變,則輸出equal;

利用assign equal=(a==b)?1:0語句,可同時完成判斷賦值功能,大大減少代碼量; 運行結果:

Figure 8組合邏輯設計

(2)練習三:利用條件語句實現計數分頻時序電路

語法要點:

此程序主要練習了對輸入時鐘進行計數,判斷,從而實現分頻輸出;

在實際應用中,可以通過該方式獲得不同占空比或頻率的信號供系統使用;

課本程序問題修改:

課本測試程序中未定義F10M_clk變量,故應將測試程序fdivision_TOP中出現的該變量改為已定義的F10M;

運行結果:

Figure 9計數分頻時序電路

(3)練習四:阻塞賦值與非阻塞賦值的區別

語法要點:

阻塞賦值呈現的是一種立即賦值的狀態,即同一個變量在前后語句中用到,語句間的順序會影響到輸出的結果;

非阻塞賦值對每一個塊中語句間的相對位置沒有要求,只在該塊語句全部運行完成后同一進行賦值;

運行結果:

Figure 10阻塞賦值與非阻塞賦值得區別

(4)練習五:用always塊實現較復雜的組合邏輯電路

語法要點:

Always@實現了對若干輸入信號的敏感,即只要有一個信號改變,輸出即改變; 通過case語句,實現了選擇性輸出,對不同功能進行綜合;

運行結果:

Figure 11 always塊組合邏輯電路

(5)練習六:在verilog HDL中使用函數

語法要點:

函數最基本功能即實現計算,通過對不同函數定義,實現不同的計算功能;同時定義函數,可以利于在該模塊外對某函數功能的調用,增強了程序的通用性和功能性,同時可以使程序結構更加清晰,易讀易懂;

運行結果:

Figure 12使用函數

(6)練習七:在verilog HDL中使用任務

語法要點:

相比函數,任務的調用功能更強大,可以實現運算并輸出多個結果的功能,同時任務并不返回計算值,只通過類似C語言中的形參和實參的數據交換,實現功能;任務的定義和調用可

以只程序結構更明晰,功能更豐富;

程序中通過對比較順序的設計,實現了對4個數字,進行5次比較即可成功完成排序功能的目的;

運行結果:

Figure 13使用任務

(7)練習八:利用有限狀態機進行時許邏輯設計

語法要點:

設計有限狀態機主要需要進行狀態分配,狀態編碼,然后利用case語句進行判斷,從而改變相應狀態,實現狀態轉移和輸出變換;

對涉及時鐘的一般時序邏輯,主要運用非阻塞(〈=)賦值完成功能;

課本程序問題修改:

在modelsim 10中,測試文件時鐘無法仿真,故只能保持與課本測試文件相同的思路,重新編寫測試文件,仿真結果如下,與課本完全一致;

運行結果:

Figure 14有限狀態機

三、實驗總結及體會:

通過半個學期的學習和實驗,我初步掌握了verilogHDL語言和modelsim軟件,可以通過編程實現數字電路基礎中幾乎全部簡單邏輯芯片的功能,同時可以用編程實現相對復雜一點的邏輯電路和功能.總體而言,四次實驗內容相對簡單,幾乎是在課后實驗的基礎上稍稍做了提高,以利于我們掌握并鞏固課上學習的知識。有幾個課后實驗內容,按照程序輸入后無法進行波形仿真,在改正一些錯誤定義,或者重寫測試程序后,都能順利完成實驗任務。通過實驗上機,鞏固了我們的理論知識,加強了實際運用的能力,對整個課程的學習起到了很好的作用。

最后一個補充實驗相對復雜,但實現的方法卻可以有很多,在實際寫代碼前進行構思分析,在這個實驗中顯得尤為重要,例如,如何發揮FPGA并行處理的能力,如何提高程序的通用性,能夠將所設計的模塊結構同時完成四個任務,如何設計代碼提高效率的同時節省硬件資源??都是在設計構思中不得不考慮的環節,因此,通過最后一個實驗的設計,能夠很好的鍛煉我們解決實際生活中問題的能力,使我們對所學的知識能夠真正有所使用。

運用verilog HDL語言進行硬件電路設計,已成為未來電路設計的主要趨勢,學習這門語言及相應軟件,能夠幫助我們在以后的學習及科研中,大大提高我們的效率,使我們能夠快速搭建實驗平臺,完成目標功能。

雖然8周的課,時間相對較短,但通過這8周的學習,我對verilog HDL語言有了全面的認識,對基本的語法都有了很好的掌握,雖然時間有限,不能對verilog HDL語言有更深入的認識,但通過這8周的學習,我為我將來進一步深化使用這個工具打下了堅實的基礎。

四、選作程序源代碼(1)練習題3:利用10MB的時鐘,設計一個單周期形狀的周期波形 主程序:

module fdivison_2(RESET,F10M,clk_out,j);input F10M,RESET;output clk_out;output[12:0] j;

regclk_out;

reg[12:0] j;always @(posedge F10M)begin if(!RESET)begin clk_out<=0;j<=0;end

else begin if(j==199)

begin

j<=j+1;clk_out<=1;

end

else if(j==299)

begin

j<=j+1;clk_out<=0;

end

else if(j==499)

j<=0;

else j<=j+1;end end

endmodule

output[3:0] out;

reg[3:0] out;

always @(a or b or c or d or e or f or g or h or selet)

begin

case(selet)

`s1:out=a;

`s2:out=b;

`s3:out=c;

`s4:out=d;

`s5:out=e;

`s6:out=f;

`s7:out=g;

`s8:out=h;default:out=4'hz;endcase

end

endmodule

測試程序: `timescale 1 ns/1 ns

module muxtest;

wire[3:0] out;reg[3:0] a,b,c,d,e,f,g,h;reg[2:0] selet;

parameter times1=8;

initial

begin

a=0;

b=1;

c=2;d=3;

e=4;

f=5;

g=6;

h=7;selet=3'h0;

repeat(5)測試程序:

`timescale 1ns/100ps `define clk_cycle 50 module TOP_2;reg F10M,RESET;wire clk;wire[12:0] j;always #`clk_cycle

F10M = ~F10M;

initial

begin

RESET=1;

F10M=0;

#100 RESET=0;

#100 RESET=1;

#10000 $stop;

end

fdivison_2 fdivison_2(.RESET(RESET),.F10M(F10M),.clk_out(clk),.j(j));

endmodule

(2)練習題4:運用always塊設計一個8路數據選擇器

主程序: `define s1 3'd0 `define s2 3'd1 `define s3 3'd2 `define s4 3'd3 `define s5 3'd4 `define s6 3'd5 `define s7 3'd6 `define s8 3'd7

module mux_8(a,b,c,d,e,f,g,h,selet,out);

input[3:0] a,b,c,d,e,f,g,h;

input[2:0] selet;

begin

#100 selet=selet+1;

end

selet=0;repeat(times1)

begin

#100 selet=selet+1;

a={$random}%16;

b={$random}%16;

c={$random}%16;

d={$random}%16;

e={$random}%16;

f={$random}%16;

g={$random}%16;

h={$random}%16;

end

#100 $stop;

end

mux_8 m0(a,b,c,d,e,f,g,h,selet,out);endmodule

(3)練習題5:設計一個帶控制端的邏輯運算電路

主程序:

`define sqrR 4'd0 `define triR 4'd0 `define factR 4'd0

module sqr(a,reset,clk,sqr_out,tri_out,fact_out);

input[3:0] a;input reset,clk;output[7:0] sqr_out,tri_out,fact_out;reg[7:0] sqr_out,tri_out,fact_out;

always @(posedgeclk)begin

if(!reset)

{sqr_out,tri_out,fact_out}={`sqrR,`triR,`factR};

else

begin

sqr_out=sqr_cal(a);tri_out=tri_cal(a);fact_out=fact_cal(a);

end end

function[7:0] sqr_cal;

input[3:0] a;

begin sqr_cal=a*a;

end endfunction

function[7:0] tri_cal;

input[3:0] a;

begin tri_cal=a*a*a;

end endfunction

function[7:0] fact_cal;

input[3:0] a;

begin

if(a>5)fact_cal=0;

else

begin

case(a)

0:fact_cal=1;

1:fact_cal=1;

2:fact_cal=2;

3:fact_cal=6;

4:fact_cal=24;

5:fact_cal=120;endcase

end

end endfunction

endmodule

測試程序:

`timescale 1 ns/100 ps `define clk_cycle 50

module sqrTEST;

reg[3:0] a,i;regreset,clk;

wire[7:0] sqr_out,tri_out,fact_out;

initial

begin clk=0;

a=0;

reset=1;

#100 reset=0;

#100 reset=1;

for(i=0;i<=6;i=i+1)

begin

#200 a=i;

end

#100 $stop;

end

always #`clk_cycleclk=~clk;

sqr m(a,reset,clk,sqr_out,tri_out,fact_out);

endmodule

(4)練習題6:用兩種不同的設計方法設計一個功能相同的模塊,完成4個數據的冒泡排序

組合邏輯實現程序:

module bub(ai,bi,ci,di,ao,bo,co,do);

input[7:0] ai,bi,ci,di;output[7:0] ao,bo,co,do;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n;

parameter so=4;

//

always @(ai or bi or ci or di)begin

{ar,br,cr,dr}={ai,bi,ci,di};

for(n=so;n>1;n=n-1)

//

bb(ar,br,cr,dr,n);

{ao,bo,co,do}={ar,br,cr,dr};end

task bb;

// inout[7:0] x1,x2,x3,x4;

input[3:0] n;

// reg[7:0] temp;reg[3:0] s;

if(n>0)

for(s=1;s

begin

case(s)

1:sort2(x1,x2);2:sort2(x2,x3);

3:sort2(x3,x4);endcase

end endtask

task sort2;inout[7:0] x,y;reg[7:0] temp;

if(x>y)

begin

temp=x;

x=y;

y=temp;

end endtask

endmodule

組合邏輯測試程序: `timescale 1 ns/100 ps

module bubTEST;reg[7:0] ai,bi,ci,di;wire[7:0] ao,bo,co,do;

initial

begin ai=0;bi=0;ci=0;di=0;

repeat(4)

begin

#100 ai={$random}%256;

bi={$random}%256;

ci={$random}%256;

di={$random}%256;

end

#100 $stop;

end

bub m0(ai,bi,ci,di,ao,bo,co,do);

endmodule

時序邏輯實現程序:

module bub_1(in,clk,ar,br,cr,dr,ao,bo,co,do);

input[7:0] in;input clk;output[7:0] ao,bo,co,do;output[7:0] ar,br,cr,dr;reg[7:0] ao,bo,co,do;reg[7:0] ar,br,cr,dr;reg[3:0] n,s,q;

parameter so=4;

initial

begin

n=0;

s=0;

q=0;

end

always @(posedgeclk)begin

if(n<=so)

begin

n=n+1;ar<=in;br<=ar;cr<=br;dr<=cr;

end

if(n==so+1)

begin

n<=so+2;

s<=so;

q<=1;

end

if(s>1)

begin

{ao,bo,co,do}<={ar,br,cr,dr};

if(q

begin

case(q)

1:sort2(ar,br);

2:sort2(br,cr);

3:sort2(cr,dr);endcase

q<=q+1;

end

else

begin

s<=s-1;

q<=1;

end

end

end

task sort2;inout[7:0] x,y;reg[7:0] temp;

if(x>y)

begin

temp=x;

x=y;

y=temp;

end endtask

endmodule

時序邏輯測試程序: `timescale 1 ns/100 ps

module bubTEST_1;reg[7:0] in;regclk;

wire[7:0] ao,bo,co,do,ar,br,cr,dr;

initial

begin clk=0;

in=0;

begin

repeat(4)

#100 in={$random}%256;

end

#100 $stop;

end

always #50 clk=~clk;

bub_1 m0(in,clk,ar,br,cr,dr,ao,bo,co,do);

endmodule

(5)補充練習2:樓梯燈設計 主程序:

module final2(signal,reset,clk,light);

input[2:0] signal;

input reset,clk;

output[2:0] light;

reg[2:0]

signal_reg,light_reg,light_test,signal_test;

reg[11:0] k0,k1,k2,k0a,k1a,k2a,k0b,k1b,k2b;

reg[1:0] state0,state1,state2;

reg[3:0] i0,i1,i2;

parameter light_off=2'b00,light_on8=2'b01,light_on12=2'b10;initial begin

k0=0;k1=0;k2=0;

k0a=0;k1a=0;k2a=0;

k0b=0;k1b=0;k2b=0;

i0=0;i1=0;i2=0;light_reg=3'b000;

state0=light_off;

state1=light_off;

state2=light_off;signal_reg=0;signal_test=signal;end

//

//

always @(posedgeclk)begin

signal_test[0]<=signal[0];if(signal_test[0]==signal[0])

begin

i0=i0+1;

end else

i0=0;if(i0>=5)

begin

signal_reg[0]=signal[0];

end

if(state0==light_off)

begin

k0=0;

k0a=0;

k0b=0;

end else

k0=k0+1;

case(signal_reg[0])

1: if(!reset)

begin

state0=light_off;

end

else

begin

k0a=k0a+1;

if((k0a >= 79)&&(k0<=119))

state0=light_on12;

else

state0=light_on8;

end

0:if(!reset)

begin

state0=light_off;

end

else if(k0a==0)

state0=light_off;endcase

case(state0)

light_off:light_reg[0]=0;

light_on8:

begin light_reg[0]=1;

if(k0b==79)

state0=light_off;

else

k0b=k0b+1;

end

light_on12:

begin light_reg[0]=1;

if(k0b==119)

state0=light_off;

else

k0b=k0b+1;

end endcase end

always @(posedgeclk)begin

signal_test[1]<=signal[1];if(signal_test[1]==signal[1])

begin

i1=i1+1;

end else

i1=0;

if(i1>=5)

begin

signal_reg[1]=signal[1];

end

if(state1==light_off)

begin

k1=0;

k1a=0;

k1b=0;

end else

k1=k1+1;

case(signal_reg[1])

1: if(!reset)

begin

state1=light_off;

end

else

begin

k1a=k1a+1;

if((k1a >= 79)&&(k1<=119))

state1=light_on12;

else

state1=light_on8;

end

0:if(!reset)

begin

state1=light_off;

end

else if(k1a==0)

state1=light_off;endcase

case(state1)

light_off:light_reg[1]=0;

light_on8:

begin light_reg[1]=1;

if(k1b==79)

state1=light_off;

else

k1b=k1b+1;

end

light_on12:

begin light_reg[1]=1;

if(k1b==119)

state1=light_off;

else

k1b=k1b+1;

end endcase end

//

// always @(posedgeclk)begin signal_test[2]<=signal[2];if(signal_test[2]==signal[2])

begin

i2=i2+1;

end else

i2=0;if(i2>=5)

begin signal_reg[2]=signal[2];

end

if(state2==light_off)

begin

k2=0;

k2a=0;

k2b=0;

end else

k2=k2+1;

case(signal_reg[2])

1: if(!reset)

begin

state2=light_off;

end

else

begin

k2a=k2a+1;

if((k2a >= 79)&&(k2<=119))

state2=light_on12;

else

state2=light_on8;

end

0:if(!reset)

begin

state2=light_off;

end

else if(k2a==0)

state2=light_off;endcase

case(state2)

light_off:light_reg[2]=0;

light_on8:

begin light_reg[2]=1;

if(k2b==79)

state2=light_off;

else

k2b=k2b+1;

end

light_on12:

begin light_reg[2]=1;

if(k2b==119)

state2=light_off;

else

k2b=k2b+1;

end endcase

casex(light_reg)

3'b000:light_test=000;

3'b001:light_test=001;

3'b01x:light_test=010;

3'b1xx:light_test=100;endcase end

assign light=light_test;endmodule

測試程序:

`timescale 10ms/10ms

module final_TOP2;reg[2:0] signal;regclk,reset;

wire[2:0] light;

initial begin clk=0;

reset=1;

#2 reset=0;

#10 reset=1;

#10 signal=3'b111;

#10 signal=3'b000;

#900 signal=3'b111;

#100 signal=3'b000;

#900 signal=3'b011;

#100 signal=3'b000;

#900 signal=3'b001;

#900 signal=3'b000;

#100 $stop;end

always #5 clk=~clk;

final2 m(signal,reset,clk,light);endmodule

第三篇:EDA實驗報告

實驗一:

QUARTUS II 軟件使用及組合電路設計仿真

實驗目的:

學習QUARTUS II 軟件的使用,掌握軟件工程的建立,VHDL源文件的設計和波形仿真等基本內容。

實驗內容:

1.四選一多路選擇器的設計 基本功能及原理 :

選擇器常用于信號的切換,四選一選擇器常用于信號的切換,四選一選擇器可以用于4路信號的切換。四選一選擇器有四個輸入端a,b,c,d,兩個信號選擇端s(0)和s(1)及一個信號輸出端y。當s輸入不同的選擇信號時,就可以使a,b,c,d中某一個相應的輸入信號與輸出y端接通。

邏輯符號如下:

程序設計:

軟件編譯:

在編輯器中輸入并保存了以上四選一選擇器的VHDL源程序后就可以對它進行編譯了,編譯的最終目的是為了生成可以進行仿真、定時分析及下載到可編程器件的相關文件。仿真分析:

仿真結果如下圖所示

分析:

由仿真圖可以得到以下結論:

當s=0(00)時y=a;當s=1(01)時y=b;當 s=2(10)時y=c;當s=3(11)時y=d。符合我們最開始設想的功能設計,這說明源程序正確。2.七段譯碼器程序設計 基本功能及原理:

七段譯碼器是用來顯示數字的,7段數碼是純組合電路,通常的小規模專用IC,如74或4000系列的器件只能作十進制BCD碼譯碼,然而數字系統中的數據處理和運算都是2進制的,所以輸出表達都是16進制的,為了滿足16進制數的譯碼顯示,最方便的方法就是利用VHDL譯碼程序在FPGA或CPLD中實現。本項實驗很容易實現這一目的。輸出信號的7位分別接到數碼管的7個段,本實驗中用的數碼管為共陽極的,接有低電平的段發亮。數碼管的圖形如下

七段譯碼器的邏輯符號:

程序設計:

軟件編譯:

在編輯器中輸入并保存了以上七段譯碼器的VHDL源程序后就可以對它進行編譯了,編譯的最終目的是為了生成可以進行仿真、定時分析及下載到可編程器件的相關文件

。仿真分析:

仿真結果如下圖所示:

分析: 由仿真的結果可以得到以下結論:

當a=0(0000)時led7=1000000 此時數碼管顯示0; 當a=1(0001)時led7=1111001 此時數碼管顯示1; 當a=2(0010)時led7=0100100 此時數碼管顯示2; 當 a=3(0011)時led7=0110000 此時數碼管顯示3; 當 a=4(0100)時led7=0011001 此時數碼管顯示4; 當 a=5(0101)時led7=0010010 此時數碼管顯示5; 當 a=6(0110)時led7=0000010 此時數碼管顯示6; 當 a=7(0111)時led7=1111000 此時數碼管顯示7; 當 a=8(1000)時led7=0000000 此時數碼管顯示8; 當a=9(1001)時led7=0010000 此時數碼管顯示9; 當a=10(1010)時led7=0001000 此時數碼管顯示A; 當a=11(1011)時led7=0000011 此時數碼管顯示B; 當 a=12(1100)時led7=1000110 此時數碼管顯示C; 當a=13(1101)時led7=0100001 此時數碼管顯示D; 當a=14(1110)時led7=0000110 此時數碼管顯示E; 當a=15(1111)時led7=0001110 此時數碼管顯示F;

這完全符合我們最開始的功能設計,所以可以說明源VHDL程序是正確的。

實驗心得:

通過這次實驗,我基本掌握了QUARTUS II軟件的使用,也掌握了軟件工程的建立,VHDL源文件的設計和波形仿真等基本內容。在實驗中,我發現EDA這門課十分有趣,從一個器件的功能設計到程序設計,再到編譯成功,最后得到仿真的結果,這其中的每一步都需要認真分析,一遍又一遍的編譯,修改。當然,中間出現過錯誤,但我依然不放棄,一點一點的修改,驗證,最終終于出現了正確的仿真結果,雖然有一些毛刺,但是總的來說,不影響整體的結果。

實驗二:計數器設計與顯示

實驗目的:

(1)熟悉利用QUARTUS II中的原理圖輸入法設計組合電路,掌握層次化的設計方法;

(2)學習計數器設計,多層次設計方法和總線數據輸入方式的

仿真,并進行電路板下載演示驗證。實驗內容:

1.完成計數器設計

基本功能及原理:

本實驗要設計一個含有異步清零和計數使能的4位二進制加減可控計數器,即有一個清零端和使能端,當清零端為1時異步清零,即所有輸出值都為0,當使能端為0時,計數器停止工作,當使能端為1時,正常工作,由時鐘控制。另外,還應該有一個控制端,當控制端為0時,進行減法運算,當控制端為1時,進行加法運算。輸出端有輸出值和進位端,當進行加法運算時,輸出值遞增,當減法運算時,輸出值遞減,同時進位端進行相應的變化。

4位二進制加減計數器的邏輯符號:

程序設計:

軟件編譯:

在編輯器中輸入并保存了以上4位二進制加減計數器的VHDL源程序后就可以對它進行編譯了,編譯的最終目的是為了生成可以進行仿真、定時分析及下載到可編程器件的相關文件。仿真分析: 仿真結果如下:

分析:

由仿真圖可以得到以下結論:

當enable端為0時,所有數值都為0,當enable端為1時,計數器正常工作;當reset端為1時,異步清零,所有輸出數值為0,當reset端為0時,正常工作;當updown端為0時,進行減法運算,當updown為1時,進行加法運算;另外,當程序進行減法運算時,出現借位時,co為1,其余為0,當進行加法運算時,出現進位時,co為1,其余為0。圖中所有的功能與我們設計的完全一樣,所以說明源程序正確。2.50M分頻器的設計

基本功能及原理:

50M分頻器的作用主要是控制后面的數碼管顯示的快慢。即一個模為50M的計數器,由時鐘控制,分頻器所有的端口基本和上述4位二進制加減計數器的端口一樣,原理也基本相同。分頻器的進位端(co)用來控制加減計數器的時鐘,將兩個器件連接起來。50M分頻器的邏輯符號如下:

程序設計:

軟件編譯:

在編輯器中輸入并保存了以上50M分頻器的VHDL源程序后就可以對它進行編譯了,編譯的最終目的是為了生成可以進行仿真、定時分析及下載到可編程器件的相關文件。仿真分析: 結果如下:

上圖為仿真圖的一部分,由于整個圖太大,所以顯示一部分即可,其余部分如圖以上圖規律一直遞增,直到50M為止,然后再重復,如此循環。

上圖是部分輸出的顯示,由于整個圖太大,所以只顯示部分,其余部分如圖遞增。

分析:

由仿真圖可以看出,當reset為0,enable為1時(因為本實驗中計數器的模值太大,為了盡可能多的觀察出圖形,可讓reset一直為0,enable一直為1,即一直正常工作),輸出值由0一直遞增到50M,構成一個加法計數器,與我們設計的功能一致。3.七段譯碼器程序設計

基本功能及原理:

七段譯碼器是用來顯示數字的,7段數碼是純組合電路,通常的小規模專用IC,如74或4000系列的器件只能作十進制BCD碼譯碼,然而數字系統中的數據處理和運算都是2進制的,所以輸出表達都是16進制的,為了滿足16進制數的譯碼顯示,最方便的方法就是利用VHDL譯碼程序在FPGA或CPLD中實現。本項實驗很容易實現這一目的。輸出信號的7位分別接到數碼管的7個段,本實驗中用的數碼管為共陽極的,接有低電平的段發亮。

七段譯碼器的邏輯符號:

程序設計:

軟件編譯:

在編輯器中輸入并保存了以上七段譯碼器的VHDL源程序后就可以對它進行編譯了,編譯的最終目的是為了生成可以進行仿真、定時分析及下載到可編程器件的相關文件。仿真分析:

仿真結果如下圖所示:

分析:具體分析與實驗一中七段譯碼器的分析相同,在此不再贅述。計數器和譯碼器連接電路的頂層文件原理圖:

原理圖連接好之后就可以進行引腳的鎖定,然后將整個程序下載到已經安裝好的電路板上,即可進行仿真演示。

實驗心得:

經過本次試驗,我學到了很多。首先,我加強了對QUARTUS II軟件的掌握;其次,我掌握了電路圖的頂層文件原理圖的連接,學會了如何把自己設計的程序正確的轉化為器件,然后正確的連接起來,形成一個整體的功能器件;最后,我學會了如何安裝以及如何正確的把完整的程序下載到電路板上,并進行演示驗證。

實驗三:大作業設計

(循環彩燈控制器)

實驗目的:

綜合應用數字電路的各種設計方法,完成一個較為復雜的電路設計。實驗內容:

流水燈(循環彩燈)的設計 設計任務:

設計一個循環彩燈控制器,該控制器可控制10個發光二極管循環點亮,間隔點亮或者閃爍等花型。要求至少三種以上花型,并用按鍵控制花型之間的轉換,用數碼管顯示花型的序號。基本原理:

該控制器由兩部分組成,一部分是一個50M的分頻器,其主要用來控制花色變化的快慢;另一部分是一個彩燈控制器,該彩燈控制器可由兩個開關控制花型的序號,10個輸出分別控制10個發光二極管的亮暗,當輸出為1時,該發光二極管亮,輸出為0時,該二極管滅。將分頻器的co端用來控制彩燈控制器的時鐘,將兩個器件連接起來。1.分頻器的設計

50M分頻器與實驗二中的分頻器一樣,這里不再贅述。2.彩燈控制器的設計 基本原理:

該彩燈控制器由時鐘控制,reset異步清零,enable當做使能端,由兩個開關do(0-1)來控制選擇不同的花型,10個輸出端lig(0-9)來控制10個LED燈的亮滅。因為用了兩個開關來控制花型,所以一共有4種花色。

彩燈控制器的邏輯符號:

程序設計:

3.七段譯碼器的設計

七段譯碼器是用來顯示不同花型的序號的,其設計與實驗一中的設計一樣,這里不再贅述。循環彩燈控制器的原理圖:

仿真波形如下: 第一種花型:

第二種花型:

第三種花型:

第四種花型:

仿真分析:

將以上仿真波形圖和源程序對比,我們可以看到,仿真出來的波形和我們設計的功能一致,這說明源VHDL程序是正確的。實驗心得:

本次試驗是在沒有老師指導的情況下自己完成的,我在參考了網上的程序的情況下,最終成功的設計并正確的演示出了循環彩燈的不同花型。通過本次試驗,我真正的體會到了DEA這門課的樂趣,也發現它對我們的學習和生活帶來很大的方便。

第四篇:EDA實驗報告

EDA課程實驗報告

----移位相加8位硬件乘法器電路計

ou 1

移位相加硬件乘法器設計

一.實驗目的

1、學習移位相加8 位硬件乘法器電路設計;

2、學習應用EDA 技術進行項目設計的能力

二.實驗原理

該乘法器是由8位加法器構成的以時序方式設計的8位乘法器。其乘法原理是:乘法通過逐項移位相加原理來實現,從被乘數的最低位開始,若

為1,則乘數左移后與上一次的和相加;若為0,左移后以全零相加,直至被乘數的最高位。

實驗箱內部結構圖

三.實驗設備

1.安裝QUARTUS II 軟件的PC一臺;

2.實驗箱一個 四.實驗步驟

1.輸入下列VHDL程序:

2.編譯程序,并連接實驗箱并下載 3.在實驗箱上按下列要求進行設置:

①選擇模式1 ②CLKK控制移位相加速度,接clock0=4Hz ③A[7..0]、B[7..0]輸入數據 顯示于此4個數碼管上

④DOUT[15..0]接數碼管8/7/6/5,顯示16位乘積:PIO31—PIO16 ⑤接鍵8(PIO49):高電平清0,低電平計算允許

⑥A[7..0]接鍵2/1,輸入8位乘數 PIO7—PIO0(模式1)⑦B[7..0]接鍵2/1,輸入8位被乘數 PIO7—PIO0(模式1)

五.實驗結果

實驗程序編譯運行后RTL電路圖

ou 1)2

(模式

實驗RTL電路

A[7..0]接鍵2/1,輸入8位乘數:A2(十六進制)B[7..0]接鍵4/3,輸入8位被乘數:33(十六進制)可得結果DOUT[15..0]:2046(十六進制)六:心得體會

通過電子設計的數字部分EDA設計,我們掌握了系統的數字電子設計的方法,也知道了實驗調試適配的具體操作方法。

通過實驗,進一步加深了對EDA的了解,讓我對它有了濃厚的興趣。但是在調試程序時,遇到了不少問題,編譯下載程序時,總是有錯誤,在細心的檢查下,終于找出了錯誤和警告,排除困難后,程序編譯就通過了,心里終于舒了一口氣。

ou 3

第五篇:EDA實驗報告

EDA

實驗報告

姓名:湯燦亮 學號:2012118060 班級:1211自動化

實驗一 QUARTUS Ⅱ的設計流程

一、實驗目的:

1、掌握QUARTUSⅡ安裝過程;

2、熟悉QUARTUSⅡ設計環境;

3、掌握QUARTUSⅡ的設計過程。

二、實驗內容:

用文本輸入法設計一個二進制加法器。

三、實驗步驟:

(一)、創建工作文件夾

在windows中新建一個文件夾(又稱工作庫或WORK LIBRARY),用于保存設計工程項目的有關文件。注:設計工程項目的所有有關文件不能保存在根目錄下,必須保存在一個文件夾之下。例如建立的文件夾:E:CNT10

(二)、啟動Quartus II 點擊QUARTUSⅡ9.0圖標打開QUARTUSⅡ9.0設計窗口。或點擊QUARTUSⅡ9.0圖標打開QUARTUSⅡ9.0設計窗口

(三)、設計文件輸入

1、打開輸入文件編輯器

點擊菜單Filenew?選擇Verilog HDL file建立一個文本設計文件。用文本輸入法輸入程序。

2、保存文件,文件名同程序的模塊名。后綴.v

(四)、全編譯(邏輯綜合)

1、創建工程

點擊菜單FileNew Project Wizard…….進行工程設置。完成工程文件夾的選定、工程名、頂層設計文件名(主程序)、編程器件的選擇等工程設置。

2、編譯前的相關設置設置

⑴選擇PLD芯片:AssignmenmtsSettingsDevice彈出的窗口中選擇選擇芯片。

⑵選擇配置芯片的工作方式AssignmenmtsSettingsDeviceDevice&Pin Options彈出的窗口中首選General項,在Options欄中選擇Auto-restart-configuration after error.⑶選擇配置芯片和編程方式:AssignmenmtsSettingsDeviceDevice&Pin Options彈出的窗口中選擇Configuration欄,在窗口中設置配置方式,配置芯片和是否需要生成壓縮的配置文件。

⑷選擇輸出設置:(1)-(4)項默認方式,可以不做任何操作,⑸選擇目標器件閑置引腳的狀態:AssignmenmtsSettingsDeviceDevice&Pin Options彈出的窗口中選擇Unused Pins欄,在窗口中對閑置的引腳設置,推薦設置為As input tri-stated。

3、執行全程編譯:ProcessingStart Compilation。完成對設計項目的檢 錯、邏輯綜合、結構綜合、配置文件生成以及時序分析。

(五)、功能仿真(或時序仿真)

建議先做功能仿真,以檢驗設計項目的邏輯真確性,這樣可以提高設計效率。

1、功能仿真設置:AssignmenmtsSettings彈出的窗口中選擇Simulator Settings。在右邊Simulation mode中選擇 Functional.2、ProcessingGenerate Functional Simulation netlist,生成功能仿真所需的文件。

3、建立波形文件并進行功能仿真

⑴FileNew,在窗口中選擇Vector Waveform file打開向量波形文件編輯器。

⑵設置仿真時間區域:可默認。一般幾十微妙。時間區域過長,使仿真時間變長,影響仿真效率。

⑶在向量波形文件編輯器中添加項目的相關引腳。原則上是所有引腳,但有的項目引腳很多,可以只添加必要的一些引腳。雙擊向量波形文件編輯器Name欄的空白區域后,會彈出一個“Insert Node or Bus”對話框,在彈出的對話框中選擇“Node Finder?”按鈕,則彈出“Node Finder?”對話框,選擇Filter:Pins:all,然后點擊List,Nodes Found欄將列出所有輸入、輸出端口。選擇要觀察的信號,點擊“>”命令按鈕加入到觀察目標窗口中。選擇OK,則在波形圖中加入了待觀察信號的圖形。

或者執行ViewUtility WindowsNode Finder命令打開Node Finder窗口,在彈出的窗口中將所需引腳拖入波形編輯器中。

⑷編輯輸入波形:對所有的輸入引腳設置合適的波形。⑸啟動仿真器:ProcessingStart Simulation.⑹觀察分析仿真結果。仿真結果保存于文件“Simulation Report”,此文件在仿真完成后會自動彈出。若仿真結果有出入,重新修改程序,直到仿真結果沒有問題。

(六)、下載驗證:

1、芯片選擇ACEX1KEP1K30QC208-2;

2、引腳鎖定:

3、全編譯;

4、下載線連接:將25針連下一端連接電腦LPT1口,一端連接到編程模塊的DB25接口,再用十針連線一頭插入通用編程模塊JTGA下載接口處,另一頭連接到目標芯片的下載接口。

5、打開實驗箱電源,將模式選擇開關CTRL的(2)(4)(8)撥至ON,使按鍵KD1,KD2,LED1,LED2,LED3,LED4,LED5等有效。

6、下載:ToolsProgrammer,完成下載。

7、撥動開關按鍵KD1,KD2驗證電路。

四、實驗程序及仿真結果

(一)、實驗程序:

時序仿真結果:

波形文件及仿真:

五、實驗箱現象描述

注:在程序正確,正確操作實驗箱并成功下載并正常運行程序的前提下,現象為:實驗箱上一排設定的LED燈,分別為4個表示四位二進制碼,一個表示使能信號EN,一個表示復位信號RST,一個表示置數信號,一個進位位COUT,高電平時表示進位,四個用于置數的燈。EN信號高電平有效,低電平起保持作用,RST低電平有效,起復位作用,LOAD信號低電平有效,起置數作用。啟動實驗箱,讓EN燈亮(高電平),RST燈亮(高電平),LOAD燈亮(高電平),此時表示四位二進制碼的LED燈分別從0到9計數(約為1S記一個數),到10的時候,顯示數的四個LED燈表示成0(全滅),進位位燈(COUT)閃動一次(表示進一位),如此反復。使EN燈熄滅(低電平),顯示數的燈停止變動,保持在它當前所表示的數值?;謴虴N燈亮,繼續計數。使RST燈熄滅(低電平),顯示數的燈立即變為全滅(表示復位為0)。設置任意值,使LOAD燈熄滅(低電平),顯示燈變成設置的數值,然后正常計數。

六、心得體會

在這次實驗中,QUARTUS II軟件是英文版的,一下基本功能在第一次中還是不夠熟悉,通過問老師同學,慢慢的了解到QUARTUS Ⅱ軟件的基本使用方法,以及從編寫程序到下載到實驗箱驗證運行的基本流程,實驗二用原理圖輸入法設計2位頻率計

一、實驗目的:

1.熟悉和掌握用QUARTUS Ⅱ的原理圖輸入方法設計簡單數字系統的方法,并通過一個2位頻率計的設計掌握用EDA軟件進行數字系統設計的詳細流程。2.掌握用EDA技術的層次化設計方法; 3.掌握多個數碼管動態顯示的原理與方法

二、實驗內容

用原理圖輸入法設計一個2位頻率計

三、實驗步驟

1.在頂層文件設計窗口中設計頻率計,頻率計的設計分成幾部分設計,分別是一個2位十進制計數器,一個時序控制電路,一個顯示電路模塊。

2.先設計2位十進制計數器,如圖顯示為設計好的2位十進制計數器。

步驟:(1)、點擊file—new,彈出如圖所示窗口,點擊design File中Block diagram/schematic file,再點擊ok即可。(2)、在彈出的bdf文件設計窗口中設計所需的設計,設計完成后,點擊編譯按鈕,編譯無誤后,再進行時序仿真。

結果如圖:

(3)、即可點擊file—created/update—create symbol files for current file.生成元件符號,供高層次設計調用。注意:需要獨立建立工程,2位十進制計數器的工程名和bdf文件名都為counter8。

3、設計時序控制電路,設計步驟與設計2位類似,設計完成后,一樣需要設計文件符號供高層次設計調用,如圖為設計好的時序控制電路。

4.在頂層設計窗口中設計頂層設計,最終的設計如圖

進行時序仿真無誤后進行波形仿真,結果如圖:

可以從波形仿真中看出,當輸入的待測信號的周期為410ns的時候,所測的的頻率的最后兩位為39。

四、試驗箱驗證及現象描述

引腳正確設定并正確下載到試驗箱后,調節待測信號頻率,當輸入為4hz時,數碼管上顯示04,當輸入為8hz,數碼管上顯示08,當輸入為16HZ時,數碼管

上顯示為16,當輸入為128hz時,數碼管上顯示為28。

五、心得體會

這次實驗中,按照書上面的接線圖,完成基本的接線,然后在電腦上面設計原理圖,進行實驗的測試,掌握用EDA技術的層次化設計方法,在實驗中也出現過點失誤,軟件運行出錯,經過檢查,發現軟件沒有破解,在實驗中還是要注意小細節。

實驗三簡易正弦波信號發生器設計

一、實驗目的:

1、進一步熟悉QuartusII設計流程;

2、熟悉LMP_ROM與FPGA硬件資源的使用方法。3、熟悉SignalTap II嵌入式邏輯分析儀的使用方法。

二、實驗內容

用原理圖設計一個簡易的正弦波信號發生器。

三、實驗步驟

1.建立一個工程,取名為SIN_GNT。

2.生成.mif文件,用直接編輯法。點擊file—new—memory file—memory initialization file,點擊OK,選number為128位,word size為8位,點擊ok,填寫 表格,結果如圖

3.以原理圖方式對LPM_ROM進行設置和調用,在工程原理圖編輯窗中雙擊,出現symbol框圖中點擊megawizard plug-in manager,在所示窗口中點擊memory compiler的ROM:1-PORT,取文件名為ROM78,正弦波數據初始化文件選擇DATA7X8.mif,即可生成正弦信號數據存儲器ROM,如圖所示

4.用原理圖方式對7為計數器LPM模塊,方法與制作ROM78模塊類似,如圖所示

5.新建一個原理圖設計窗口,取名為SIN_GNT,在窗口里面設計所需的電路,結果如圖,進行時序仿真,無誤后建立波形文件,結果如圖

由圖可知,在時間脈沖的作用下,AR計數,相對于的,Q也從正弦信號數據存儲器ROM中輸出相對應的數值,由這兩項,這可以在示波器上輸出正弦波。

四、心得體會

在實驗中,LPM 是參數可設置模塊庫Library of Parameterized Modules 的英語縮寫,Altera 提供的可參數化宏功能模塊和LPM 函數均基于Altera 器件的結構做了優化設計。在許多實用情況中,必須使用宏功能模塊才可以使用一些Altera 特定器件的硬件功能。例如各類片上存儲器、DSP 模塊、LVDS 驅動器、嵌入式PLL 以及SERDES 和DDIO 電路模塊等等。這些可以以圖形或硬件描述語言模塊形式方便調用的宏功能塊,使得基于EDA 技術的電子設計的效率和可靠性有了很大的提高LPM可實現基于LPM的流水線的累加器的設計,邏輯數據采樣電路設計,簡易正弦信號發生器的設計

實驗四用狀態機實現序列檢測器的設計

一、實驗目的

1、熟悉狀態機的作用及設計方法;

2、學習用狀態機實現序列檢測器的設計,并對其進行仿真和硬件測試。

二、實驗原理

序列檢測器可用于檢測一組或多組由二進制碼組成的脈沖序列信號,當序列檢測器連續收到一組串行二進制碼后,如果與檢測器預先設置的碼相同,則輸出為1,否則輸出為0。

三、實驗內容

設計一個序列檢測器,對1110010進行檢測,對設計進行仿真測試并給出仿 真波形。

四、實驗步驟

(1)運行軟件,創建一個工程,取名為SHCK,打開文本文件編輯窗口,輸入編寫好的程序,如圖所示。

取名為shiyan4,保存生成shiyan4.v文件。

(2)編譯,時序仿真,直至無錯誤。

(3)建立波形文件,保存,取名為SHCK。設置各個需要的設置的參數,仿真時間設置為50us,時鐘信號周期為4us,復位信號高電平有效,一般情況保持低電平,設置輸入信號DIN含有輸入數據段如圖1110010,如圖所示

(4)點擊波形仿真,結果如圖

由仿真結果可以看出,只有當輸入完整的1110010時,輸出信號才是高電平。(5)點擊tools—netlist viewers—state machine viewers,查看狀態轉換表。

四、心得體會

通過本次實驗掌握了如何用Verilog HDL語言實現狀態機的原理,運用狀態機實現序列檢測器的設計,進一步掌握了課堂上所學到的知識,但同時充分的感覺到了自己的不足之處,今后一定要加強自己弱勢方面的學習,用心學好EDA教科書上的知識,并抽時間在課外進行深入地學習,相信下次試驗情況會有很大程度的改觀

下載北航eda實驗報告數字部分word格式文檔
下載北航eda實驗報告數字部分.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    EDA實驗報告

    EDA 實驗報告 張佳興 2220131738 電氣工程及其自動化1班 一、 Verilog語言反應硬件特性舉例 1. module cc ( clk,en,cout)、input、output,這三個語句用Verilog語言定義了一......

    EDA實驗報告(精選5篇)

    XX大學 UNIVERSITY 《EDA技術》實驗報告 學院:電子與信息工程學院 專業:電子信息科學與技術 姓名: XXX 班級:XXX 學號: XXXXXXXXX 指導老師:XXX 這是模板,僅供參考,做實驗報告的步......

    EDA課程設計 數字時鐘

    EDA課程設計報告 一·設計任務 使用硬件描述語言,在CPLD/FPGA上實現一個多功能數字鐘。 二·設計要求 除按鍵、LED、揚聲器、時鐘信號外,整個數字鐘的功能要求在一塊芯片上......

    EDA課程設計——數字時鐘

    Hefei University EDA課程綜述 論文題目: EDA課程綜述專 業: 09通信(2)班姓 名: 唐吉祥 學 號: 0905072035 指導老師: 查長軍前 言 隨著基于PLD的EDA技術的發展和應用領域的擴......

    北航matlab上機實驗報告

    MATLAB基礎上機指導書 實驗目的 MATLAB基礎上機實驗的目的主要是在深入理解和掌握課程中的基本概念和原理的基礎上培養學習者用計算機解決實際問題的意識,訓練和提高學生分析......

    數字電路EDA課程設計數字跑表

    EDA課程設計報告書 題目: 數字跑表 姓名: 班級: 學號: 成績: 一、設計題目及要求 設計題目:數字跑表 要求:1 具有暫停,啟動功能。 2 具有重新開始功能。 3 用六個數碼管分別顯示百分......

    EDA數字秒表的設計

    設 計 報 告——數字秒表的設計 EDA 一 設計目的 1.根據設計要求,完成對數字秒表的設計。 2.進一步加強對QuartusⅡ的應用和對Verilog HDL語言的使用。 二 設計內容和要求 1......

    EDA課程設計 數字時鐘(鬧鐘)

    課 程 設 計 說 明 書 題目: 鬧鐘 學院(系): 年級專業: 學 號: 學生姓名: 指導教師: 教師職稱: 共 16 頁第 1 頁 目 錄 第1章 摘要……………………………………………………………......

主站蜘蛛池模板: 精品亚洲成a人在线看片| 日本丶国产丶欧美色综合| 国产a√无码专区亚洲av| 里番本子纯肉侵犯肉全彩无码| 国产精品毛片无遮挡| 精品国产自线午夜福利在线观看| 国产毛片久久久久久国产毛片| 精品麻豆剧传媒av国产| 亚洲av无码一区二区三区电影| 日本在线 | 中文| 亚洲国产精品一区二区成人片国内| 麻豆一区产品精品蜜桃的广告语| 成熟人妻换xxxx| 中国丰满少妇人妻xxx性董鑫洁| 精品一区精品二区制服| 欧美成人家庭影院| 日韩欧美在线综合网| 丰满人妻妇伦又伦精品国产| 亚洲综合色婷婷在线影院p厂| 在线观看国产精品日韩av| 色综合网天天综合色中文| 中字幕视频在线永久在线观看免费| 午夜性无码专区| 色综合久久久久综合体桃花网| 波多野结衣aⅴ在线| 少妇久久久久久被弄到高潮| 好了av第四综合无码久久| 免费a级毛片18禁网站免费| 精品久久久久久无码人妻热| 不卡无码人妻一区二区| 精品少妇无码av无码专区| 国产伦久视频免费观看视频| 色婷婷国产精品高潮呻吟av久久| 久热爱精品视频线路一| 亚洲十八禁| 欧美成人欧美va天堂在线电影| 一区一区三区产品乱码亚洲| 99久久国产综合精品swag| 欧美成人片在线观看| 国产精成人品一区| 久久亚洲中文字幕无码|