第一篇:EDA實驗總結報告
數字EDA實驗報告--------------薛蕾0941903207
數字EDA實驗 實驗報告
學院: 計算機科學與工程學院 專業: 通信工程 學號: 0941903207 姓名: 薛蕾 指導老師: 錢強
數字EDA實驗報告--------------薛蕾0941903207 實驗一 四選一數據選擇器的設計
一、實驗目的
1、熟悉Quartus II軟件的使用。
2、了解數據選擇器的工作原理。
3、熟悉EDA開發的基本流程。
二、實驗原理及內容
實驗原理
數據選擇器在實際中得到了廣泛的應用,尤其是在通信中為了利用多路信號中的一路,可以采用數據選擇器進行選擇再對該路信號加以利用。從多路輸入信號中選擇其中一路進行輸出的電路稱為數據選擇器。或:在地址信號控制下,從多路輸入信息中選擇其中的某一路信息作為輸出的電路稱為數據選擇器。數據選擇器又叫多路選擇器,簡稱MUX。4選1數據選擇器:
(1)原理框圖:如右圖。
D0、D1、D2、D3
:輸入數據 A1、A0
:地址變量
由地址碼決定從4路輸入中選擇哪1路輸出。
(2)真值表如下圖:(3)邏輯圖
數據選擇器的原理比較簡單,首先必須設置一個選擇標志信號,目的就是為了從多路信號中選擇所需要的一路信號,選擇標志信號的一種狀態對應著一路信號。在應用中,設置一定的選擇標志信號狀態即可得到相應的某一路信號。這就是數據選擇器的實現原理。
三.實驗內容
1、分別采用原理圖和VHDL語言的形式設計4選1數據選擇器
2、對所涉及的電路進行編譯及正確的仿真。電路圖:
四、實驗程序
library ieee;use ieee.std_Logic_1164.all;
ENTITY mux4 IS
PORT(a0, a1, a2, a3 :IN STD_LOGIC;
s :IN STD_LOGIC_VECTOR(1 DOWNTO 0);
y :OUT STD_LOGIC);END mux4;ARCHITECTURE archmux OF mux4 IS
BEGIN y <= a0 WHEN s = “00” else
--當s=00時,y=a0 a1 WHEN s = “01” else
--當s=01時,y=a1 a2 WHEN s = “10” else
--當s=10時,y=a2 a3;
--當s取其它值時,y=a2 END archmux;
五、運行結果
六.實驗總結
真值表分析:
當js=0時,a1,a0取00,01,10,11時,分別可取d0,d1,d2,d3.實驗二 血型配對器的設計
一、實驗目的
1、進一步熟悉Quartus II軟件的使用。
2、掌握簡單組合邏輯電路的設計方法與功能仿真技巧。
3、進一步學習Quartus II中基于原理圖設計的流程。
二、實驗原理及內容
實驗原理
人類有O、A、B、AB 4種基本血型,輸血者與受血者的血型必須符合圖示原則。設計一血型配對電路,用以檢測輸血者與受血者之間的血型關系是否符合,如果符合,輸出為1,否則為0。
已知: AB血型是萬能受血者,O血型是萬能獻血者!如果要輸血給O型血,那么可以的血型是O型!如果要輸血給A型血,那么可以的血型是A,O型!如果要輸血給B型血,那么可以的血型是B,O型!
如果要輸血給AB型血,那么可以的血型是A,B,AB,O型!
輸血者
受血者
O A
O A B AB
B AB
三.實驗內容
1、用VHDL語言編寫程序實現血型配對器的功能 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY Vxuexing IS PORT(P,Q,R,S:IN STD_LOGIC;F:OUT STD_LOGIC);END Vxuexing;ARCHITECTURE A OF Vxuexing IS BEGIN
F<=((NOT P)AND(NOT Q))OR(R AND S)OR((NOT P)AND S)OR((NOT Q)AND R);END A;
2、對所編寫的電路進行編譯及正確的仿真。
實驗分析 真值表
PQRSF***************11111
P,Q表示輸血者的血型;R,S,表示受血者的血型。當兩者符合血型配合原則時,F=1,否則為0.四、運行結果
五、實驗總結
本實驗給出了四種不同的血型編碼,PQ(1,1),RS(1,1)表示AB型血,P,Q(1,0),RS(1,0)表示B型血,PQ(0,1),RS(0,1)表示A型血,PQ(0,0),RS(0,0)表示O型血。根據真值表,并根據實驗的原理圖,畫出電路圖并進行連接。
實驗三 簡單數字鐘的設計
一、實驗目的
1、了解數字鐘的工作原理。
2、進一步學習Quartus II中基于VHDL設計的流程。
3、掌握VHDL編寫中的一些小技巧。
4、掌握簡單時序邏輯電路的設計方法與功能仿真技巧。
二、實驗原理及內容
實驗原理
簡單數字鐘應該具有顯示時-分-秒的功能。首先要知道鐘表的工作機理,整個鐘表的工作應該是在1Hz信號的作用下進行,這樣每來一個時鐘信號,秒增加1秒,當秒從59秒跳轉到00秒時,分鐘增加1分,同時當分鐘從59分跳轉
三.實驗內容
1、用原理圖的方式編寫一個12/24進制的計數器,并創建為SYMBOL文件。
2、用VHDL的方式編寫一個60進制的計數器,并創建為SYMBOL文件。
3、創建頂層文件。調用已編寫的SYMBOL文件,設計簡單的數字鐘電路。
2、對所編寫的電路進行編譯及正確的仿真。
二十四進制VHDL LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CNT24 IS PORT(CP, EN, Rd, LD :IN STD_LOGIC;
D
:IN STD_LOGIC_VECTOR(5 DOWNTO 0);
Co
:OUT STD_LOGIC;Q
:OUT STD_LOGIC_VECTOR(5 DOWNTO 0));END CNT24;ARCHITECTURE STR OF CNT24 IS
SIGNAL QN : STD_LOGIC_VECTOR(5 DOWNTO 0);
BEGIN Co<= '1'WHEN(QN = “010111”AND EN='1')
ELSE '0';PROCESS(CP, RD)
BEGIN IF(Rd ='0')THEN
QN<= “000000”;ELSIF(CP'EVENT AND CP='1')THEN IF(LD='0')THEN QN <= D;
ELSIF(EN='1')THEN QN <= QN+1;END IF;END IF;END PROCESS;Q <= QN;END STR;
六十進制VHDL LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY jsq60 IS PORT(en,rd,cp :IN STD_LOGIC;
qh:buffer STD_LOGIC_VECTOR(3 DOWNTO 0);
ql :buffer STD_LOGIC_VECTOR(3 DOWNTO 0);
Co :OUT STD_LOGIC);END jsq60;ARCHITECTURE b OF jsq60 IS BEGIN Co<='1'when(qh=“0101”and ql=“1001” and en='1')else'0';PROCESS(cp,rd)
BEGIN IF(rd='0')THEN qh<=“0000”;ql<=“0000”;ELSIF(cp'EVENT AND cp='1')THEN
IF(en='1')THEN
IF(ql=9)THEN
ql<=“0000”;
IF(qh=5)THEN
qh<=“0000”;
ELSE qh<=qh+1;
end if;
else
ql<=ql+1;
end if;
end if;
END IF;END PROCESS;END b;
原理圖
四、運行結果
24進制
60進制
時鐘仿真結果
五、實驗總結
此設計問題可分為主控電路,計數器模塊和掃描顯示三大部分,計數器在之前的學習中已經非常熟悉,只要掌握60,12進制的技術規律,用同步或異步計數器都可以實現。二掃描電路我們學過兩種驅動方式:BCD碼驅動方式和直接驅動方式。
實驗四 簡單交通燈的設計
一、實驗目的
1、了解交通燈的亮滅規律。
2、了解交通燈控制器的工作原理。
3、進一步熟悉VHDL語言編程,了解實際設計中的優化方案。
二、實驗原理及內容
實驗原理
交通燈的顯示有很多方式,如十字路口、丁字路口等,而對于同一個路口又有很多不同的顯示要求,比如十字路口,車子如果只要東西和南北方向通行就很簡單,而如果車子可以左右轉彎的通行就比較復雜,本實驗僅針對最簡單的南北和東西直行的情況。
要完成本實驗,首先必須了解交通路燈的亮滅規律。依人們的交通常規,“紅燈停,綠燈行,黃燈提醒”。其交通燈的亮滅規律為:初始態是兩個路口的紅燈全亮,之后東西路口的綠燈亮,南北路口的紅燈亮,東西方向通車,延時一段時間后,東西路口綠燈滅,黃燈開始閃爍。閃爍若干次后,東西路口紅燈亮,而同時南北路口的綠燈亮,南北方向開始通車,延時一段時間后,南北路口的綠燈滅,黃燈開始閃爍。閃爍若干次后,再切換到東西路口方向,重復上述過程。
三.實驗內容
1、用VHDL的方式編寫一個簡單的交通控制燈電路
2、對所編寫的電路進行編譯及正確的仿真。
程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity traffic is port(clk,enb : in std_logic;
ared,agreen,ayellow,bred,bgreen,byellow : buffer std_logic;
acounth,acountl,bcounth,bcountl : buffer std_logic_vector(3 downto 0));end traffic;
architecture one of traffic is begin process(clk,enb)variable lightstatus : std_logic_vector(5 downto 0);begin
if(clk'event and clk='1')then lightstatus := ared&agreen&ayellow&bred&bgreen&byellow;if((acounth=“0000” and acountl=“0000”)or(bcounth=“0000” and bcountl=“0000”))then Case lightstatus is When “010100”=> lightstatus:=“001100”;acountl<=“0101”;acounth<=“0000”;bcountl<=“0101”;bcounth<=“0000”;When “001100”=> if(enb='1')then lightstatus:=“100010”;acountl<=“0000”;acounth<=“0011”;bcountl<=“0101”;bcounth<=“0010”;
else lightstatus:=“010100”;acountl<=“0101”;acounth<=“0100”;bcountl<=“0000”;bcounth<=“0101”;end if;
when “100010”=>
lightstatus:=“100001”;acountl<=“0101”;acounth<=“0000”;bcountl<=“0101”;bcounth<=“0000”;
when “100001”=>
lightstatus:=“010100”;acountl<=“0101”;acounth<=“0100”;bcountl<=“0000”;bcounth<=“0101”;
when others=> lightstatus:=“010100”;acountl<=“0101”;acounth<=“0100”;bcountl<=“0000”;bcounth<=“0101”;
end case;else if(acountl=“0000”)then acounth<=acounth-1;acountl<=“1001”;
else acountl<=acountl-1;
end if;
if(bcountl=“0000”)then bcounth<=bcounth-1;bcountl<=“1001”;
else bcountl<=bcountl-1;end if;end if;end if;
ared<=lightstatus(5);agreen<=lightstatus(4);ayellow<=lightstatus(3);
bred<=lightstatus(2);bgreen<=lightstatus(1);byellow<=lightstatus(0);end process;end one;
四、運行結果
分析:
這里a代表東西方向,b代表南北方向,acounth是表示東西方向五進制計數acountl是東西方向六進制計數,bcounth則表示南北方向五進制,bounthl則是南北方向六進制計數 東西方向為0時,東西方向紅燈亮(ared=1)
東西方向在1~4之間,東西方向綠燈亮(即agreen=1)南北方向 的紅燈亮起(即bred=1)
五、實驗總結
此設計問題可分為主控電路,譯碼驅動電路和掃描顯示部分。
但是,這遠遠不能滿足實際生活的需要,還應設置倒計時秒數,因此可在此電路基礎上外加一個定時模塊。
實驗五 流水燈的設計
一、實驗目的
1、了解流水燈的工作原理。
二、實驗原理及內容
實驗原理
要完成本實驗,首先必須了解流水燈的原理。所謂的流水燈實際上就是由多個LED發光二極管構成的電路,當發光二極管可以依次點亮時,即能呈現流水的效果。實驗內容
1、設計能帶8個LED發光管發光,并按照要求輪流發光,產生流水燈的流動效果。
2、應具有兩種以上不同風格的流動閃亮效果。比如依次點亮或者依次熄滅。(選作)
3、有起動、停止控制鍵。(選作)
4、有流動閃亮效果選擇設置鍵。(選作)
5、對所編寫的電路進行編譯及正確的仿真。
三、實驗程序
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY yiweijicun1 IS PORT(CP,R,DSR,DSL:IN STD_LOGIC;
S:STD_LOGIC_VECTOR(2 DOWNTO 0);
D:STD_LOGIC_VECTOR(7 DOWNTO 0);
Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));END yiweijicun1;ARCHITECTURE yiweijicun_arch OF yiweijicun1 IS
SIGNAL IQ: STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN PROCESS(CP,R,IQ)BEGIN IF(R='1')THEN IQ <=(OTHERS =>'0');ELSIF(CP'EVENT AND CP ='1')THEN CASE CONV_INTEGER(S)IS WHEN 0=>NULL;WHEN 1=> IQ <= D;WHEN 2=> IQ <= DSR & IQ(7 DOWNTO 1);WHEN 3=> IQ <=IQ(6 DOWNTO 0)& DSL;WHEN 4=> IQ <= IQ(0)& IQ(7 DOWNTO 1);WHEN 5=> IQ <=IQ(6 DOWNTO 0)& IQ(7);WHEN 6=> IQ <= IQ(7)& IQ(7 DOWNTO 1);WHEN 7=> IQ <= IQ(6 DOWNTO 0)& IQ(0);WHEN OTHERS => NULL;END CASE;END IF;Q <= IQ;END PROCESS;END yiweijicun_arch;
四、運行結果
結果分析:
d[0]~d[7]為八個輸入端,s[0]和s[1]控制流水燈得輸出,s=1保持,s=2實現左移功能,s=3實現右移功能,因為延遲的原因,在s=2時,需要經過一段時間才能實現循環右移的功能,流水燈的實現其實是運用了8位移位寄存器,它只是運用了其中的保持左移與右移的功能,8LO位移位寄存器還有循環右移,循環左移,算數右移,算數左移等功能。
五、實驗總結
了解了移位寄存器的功能和原理
通過這次實驗,加深了VHDL語言的運用能力,更進一步了解了8位移位寄存器的功能。
實驗六 乘法器的設計
一、實驗目的
1、了解乘法器的工作原理。
2、了解復雜時序電路的設計流程。
二、實驗原理及內容
實驗原理
具體設計原理參見教材188頁。實驗內容
1、設計一個能進行兩個十進制數相乘的乘法器,乘數和被乘數均小于100。(可以參考教材231頁的VHDL代碼來設計)
2、對所編寫的電路進行編譯及正確的仿真。
三、實驗程序
library IEEE;use IEEE.std_logic_1164.all;
entity one_bit_adder is port(A: in STD_LOGIC;B: in STD_LOGIC;C_in: in STD_LOGIC;S: out STD_LOGIC;C_out: out STD_LOGIC);end one_bit_adder;
architecture one_bit_adder of one_bit_adder is begin
S <= A xor B xor C_in;C_out <=(A and B)or(C_in and(A xor B));
end one_bit_adder;library IEEE;use IEEE.std_logic_1164.all;
entity sichen is port(A: in STD_LOGIC_VECTOR(3 downto 0);B: in STD_LOGIC_VECTOR(3 downto 0);data_out: out STD_LOGIC_VECTOR(6 downto 0));end sichen;
architecture multi_arch of sichen is signal A_MULT_B0: STD_LOGIC_VECTOR(2 downto 0);signal A_MULT_B1: STD_LOGIC_VECTOR(2 downto 0);signal A_MULT_B2: STD_LOGIC_VECTOR(2 downto 0);
signal S_TEMP1: STD_LOGIC_VECTOR(1 downto 0);signal S_TEMP2: STD_LOGIC_VECTOR(1 downto 0);
signal C_TEMP : STD_LOGIC_VECTOR(6 downto 0);
signal C0_out_B0, C1_out_B0, C2_out_B0 : STD_LOGIC;signal C0_out_B1, C1_out_B1, C2_out_B1 : STD_LOGIC;
signal ZERO: STD_LOGIC;
component one_bit_adder port(A: in STD_LOGIC;B: in STD_LOGIC;C_in: in STD_LOGIC;S: out STD_LOGIC;C_out: out STD_LOGIC);end component;begin U_0_0 : one_bit_adder port map(A => A_MULT_B0(1), B => A_MULT_B1(0), C_in => ZERO, S => C_TEMP(1), C_out => C0_out_B0);U_0_1 : one_bit_adder port map(A => A_MULT_B0(2), B => A_MULT_B1(1), C_in => C0_out_B0, S => S_TEMP1(0), C_out => C1_out_B0);U_0_2 : one_bit_adder port map(A => ZERO, B => A_MULT_B1(2), C_in => C1_out_B0, S => S_TEMP1(1), C_out => C2_out_B0);
U_1_0 : one_bit_adder port map(A => A_MULT_B2(0), B => S_TEMP1(0), C_in => ZERO, S => C_TEMP(2), C_out => C0_out_B1);U_1_1 : one_bit_adder port map(A => A_MULT_B2(1), B => S_TEMP1(1), C_in => C0_out_B1, S => S_TEMP2(0), C_out => C1_out_B1);U_1_2 : one_bit_adder port map(A => A_MULT_B2(2), B => C2_out_B0, C_in => C1_out_B1, S => S_TEMP2(1), C_out => C2_out_B1);
A_MULT_B0(0)<= A(0)and B(0);A_MULT_B0(1)<= A(1)and B(0);A_MULT_B0(2)<= A(2)and B(0);
A_MULT_B1(0)<= A(0)and B(1);A_MULT_B1(1)<= A(1)and B(1);A_MULT_B1(2)<= A(2)and B(1);
A_MULT_B2(0)<= A(0)and B(2);A_MULT_B2(1)<= A(1)and B(2);A_MULT_B2(2)<= A(2)and B(2);
ZERO <= '0';C_TEMP(0)<= A_MULT_B0(0);C_TEMP(4 downto 3)<= S_TEMP2(1 downto 0);C_TEMP(5)<= C2_out_B1;
C_TEMP(6)<= A(3)xor B(3);
data_out <= C_TEMP;
end multi_arch;
四、運行結果
乘法器實現A,B兩數的相乘。A[0]~A[3]以及B[0]~B[3]是實現輸入端的控制。由圖看出,輸出上產生了延遲是因為當A[3]輸入1,對應了十進制的8,B[0]輸入1,對應了十進制的1,兩者相乘得8,即在data_out端應輸出8,此處因仍存在競爭冒險。
五、實驗總結
乘法器的設計的問題可以分為乘數和被乘數控制模塊,寄存模塊,乘法模塊和掃描顯示模塊幾個部分。
兩數相乘的方法很多,可以用移位相加的方法,也可以將乘法器看成計數器,乘積的初始值為零,每一個時鐘周期將被乘數的值加到積上,同時乘數減一,這樣反復執行,直到乘數為零。
第二篇:EDA實驗二總結報告
實驗二
數字秒表設計
一、實驗目的
1、理解計時器的原理與Verilog/VHDL 的編程方法;
2、掌握多模塊設計及層次設計的方法。
二、實驗原理
秒計時器是由計數器和譯碼器、顯示器組成,其核心是計數器與譯碼器。60 秒計時器可由二個計數器分別完成:個位為十進制計數器,十位為 6 進 制計數。個位計數器的計數信號由實驗開發板上主頻20MHZ分頻產生的1Hz 時鐘信號提供, 十位計數器的計數信號由個位的進位信號提供。然后由譯碼器 對計數結果進行譯碼,送LED 數碼管進行顯示。Clr為清零,se t為開始。
三、實驗框圖
四、實驗任務
1、采用層次設計的方法,設計一個包括頂層及底層模塊的60 秒計時器,底 層模塊用Verilog/VHDL 設計,頂層用原理圖設計。
2、秒計時器應當具有系統復位功能;
3、每十秒發出提示信號及計滿60 秒時發出報警信號。(選做)
五、實驗步驟與要求
1、分模塊設計:首先分別設計10 進制、6 進制計數器、譯碼器模塊;
2、頂層原理圖如圖7-1 所示;
3、編譯完成后進行波形仿真;
4、進行引腳鎖定,并下載至開發系統驗證。
六、分模塊設計 1.十進制計數器(1)程序代碼:
module CNT10(CLK,RST,EN,COUT,DOUT);
input CLK,EN,RST;
output [3:0]DOUT;
output COUT;
reg[3:0]Q1;
reg COUT;
assign DOUT=Q1;
always@(posedge CLK or negedge RST)
begin
if(!RST)Q1<=0;
else if(EN)begin
if(Q1<9)Q1<=Q1+1;
else Q1<=4'b0000;end
end
always@(Q1)
if(Q1==4'h9)COUT=1'b1;
else COUT=1'b0;endmodule
(2)仿真波形
(3)模塊符號
2.六進制計數器(1)程序代碼:
module CNT6(CLK,RST,EN,COUT,DOUT);
input CLK,EN,RST;
output [3:0]DOUT;
output COUT;
reg[3:0]Q2;
reg COUT;
assign DOUT=Q2;
always@(posedge CLK or negedge RST)
begin
if(!RST)Q2<=0;
else if(EN)begin
if(Q2<5)Q2<=Q2+1;
else Q2<=3'b000;end
end
always@(Q2)
if(Q2==3'h5)COUT=1'b1;
else COUT=1'b0;endmodule
(2)仿真波形
(3)模塊符號
3.分頻器
(1)程序代碼:
module FPQ(clk0,clk1);
input clk0;
output clk1;
reg[26:0] Q1;
reg clk1;always@(posedge clk0)
if(Q1<10)Q1<=Q1+1;
else
begin Q1<=0;
clk1<=~clk1;
end endmodule(2)模塊符號
七.頂層原理圖:
八.仿真波形
九.結果分析
當輸入端CLK,EN,RST都不為0時,首先是十進制計數器開始進行計時,直到DOUT1輸出端大于9時產生進位,并且自身變為0,同時使六進制計數器也開始計時,六進制輸出端DOUT2大于5時產生進位,使COUT輸出為1.
第三篇:《EDA技術基礎》實驗總結報告及要求
電工電子中心2009年5月繪制
湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
什么什么設計(研究)
紅色部分提交時請刪除!!
題目:“什么內容”的設計或“什么內容”的研究,例如: 基于FPGA的數字搶答器設計 基于FPGA的等精度數字頻率計設計 Verilog HDL同步時序電路研究 一種簡易數字頻率計設計
基于FPGA的DDS信號發生器的設計
更多參考“大學生電子實驗室”論壇設計選題指南 一.任務解析
根據對設計選題的理解,明確要做什么,要達到什么要求(參數、指標)。二.方案論證
對所要完成的設計任務,參考相關資料,提出設計方案,拿不同方案進行對比分析,選擇你能夠實現的方案,并明確指出為什么要選擇此方案,較其它方案有何優點。三.實驗步驟
方案的具體實施,按實際實施過程認真做好原始記錄,可以包括單元電路仿真分析,部分指標測試(實際效果)等等,描述演示效果要明確所用設備,說明實驗箱,使用了什么儀器等。四.結果分析
對所測試結果(演示現象)做分析,得出結論(描述現象)。五.經驗總結
對完成任務情況進行總結,是否達到預期的設計,效果如何,還有哪些可以改進的,改進建議,特別是錯誤分析。
如果是自己獨立完成的,我相信一定會有很多心得體會可以總結的,挫折的苦惱,成功的喜悅。如果你完成了一個設計性實驗,一點體會都沒有,那么我相信你一定是走捷徑完成了任務,而沒有真正獨立完成本設計任務!老師批改報告,往往把學生的心得體會看成一個亮點。心得體會一定要認真寫,把自己做設計性實驗的過程認真總結,讓老師感受到你是一步一步完成該設計性實驗選題的。
第2頁,共2頁
第四篇:EDA實驗4lxm
實驗四 計數器與七段譯碼器及顯示的設計
一 實驗目的
1、掌握七段譯碼器的工作原理;
2、學會用VHDL硬件描述語言進行數字系統設計;
3、學會運用波形仿真測試檢驗程序的正確性;
4、用QuartusII完成基本組合電路的設計。
二 實驗儀器
PC機、Quartus II 6.0軟件、康芯EDA實驗箱
三 實驗內容
選GW48系統的實驗電路模式6,用數碼8顯示譯碼輸出(PIO46-PIO40),鍵3到鍵8作為控制輸入端。完成計數器的數碼管顯示設計。
四 實驗原理及步驟
7段數碼是純組合電路,通常的小規模專用IC,如74或4000系列的器件只能作十進制BCD碼譯碼,然而數字系統中的數據處理和運算都是2進制的,所以輸出表達都是16進制的,為了滿足16進制數的譯碼顯示,最方便的方法就是利用譯碼程序在FPGA/CPLD中來實現。例6-18作為7段譯碼器,輸出信號LED7S的7位分別接如圖6-2數碼管的7個段,高位在左,低位在右。例如當LED7S輸出為“1101101”時,數碼管的7個段:g、f、e、d、c、b、a分別接1、1、0、1、1、0、1;接有高電平的段發亮,于是數碼管顯示“5”。注意,這里沒有考慮表示小數點的發光管,如果要考慮,需要增加段h,例6-18中的LED7S:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)應改為...(7 DOWNTO 0)。
1、根據譯碼器真值表寫出原程序。
譯碼器真值表:
數
輸入
輸出
值 A
B C D a b c d e f g 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 0 1 1 0 0 0 0 2 0 0 1 0 1 1 0 1 1 0 1 3 0 0 1 1 1 1 1 1 0 0 1 4 0 1 0 0 0 1 1 0 0 1 1 5 0 1 0 1 1 0 1 1 0 1 1 6 0 1 1 0 1 0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 0 0 8 1 0 0 0 1 1 1 1 1 1 1 9 1 0 0 1 1 1 1 1 0 1 1 A 0 1 0 1 1 1 0 1 1 1 B 1 0 1 1 0 0 1 1 1 1 1 C 1 1 0 0 1 0 0 1 1 1 0 D 1 1 0 1 0 1 1 1 1 0 1 E 1 1 1 0 1 0 0 1 1 1 1 F 1 1 1 1 1 0 0 0 1 1 1
三、實驗內容:
1、說明下列程序中各語句的含義,以及該例的整體功能。在Quartus II 6.0上對以下該例進行編輯、編譯、綜合、適配、仿真,給出其所有信號的時序仿真波形(提示:用輸入總線的方式給出輸入信號仿真數據)。
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DecL7S IS PORT(A : IN STD_LOGIC_VECTOR(3 DOWNTO 0);LED7S : OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END;ARCHITECTURE one OF DecL7S IS BEGIN PROCESS(A)BEGIN CASE A(3 DOWNTO 0)IS WHEN “0000” => LED7S <= “0111111”;--X“3F”?0 WHEN “0001” => LED7S <= “0000110”;--X“06”?1 WHEN “0010” => LED7S <= “1011011”;--X“5B”?2 WHEN “0011” => LED7S <= “1001111”;--X“4F”?3 WHEN “0100” => LED7S <= “1100110”;--X“66”?4 WHEN “0101” => LED7S <= “1101101”;--X“6D”?5 WHEN “0110” => LED7S <= “1111101”;--X“7D”?6 WHEN “0111” => LED7S <= “0000111”;--X“07”?7 WHEN “1000” => LED7S <= “1111111”;--X“7F”?8 WHEN “1001” => LED7S <= “1101111”;--X“6F”?9 WHEN “1010” => LED7S <= “1110111”;--X“77”?10 WHEN “1011” => LED7S <= “1111100”;--X“7C”?11 WHEN “1100” => LED7S <= “0111001”;--X“39”?12 WHEN “1101” => LED7S <= “1011110”;--X“5E”?13 WHEN “1110” => LED7S <= “1111001”;--X“79”?14 WHEN “1111” => LED7S <= “1110001”;--X“71”?15 WHEN OTHERS => NULL;END CASE;END PROCESS;END;
圖3-1 共陰數碼管及其電路
2、引腳鎖定以及硬件下載測試。建議選實驗電路模式6,用數碼8顯示譯碼輸出(PIO46--PIO40),鍵
8、鍵
7、鍵
6、鍵5四位控制輸入,硬件驗證譯碼器的工作性能。
3、用VHDL完成四位二進制加法計數器設計,命名為CNT4B.4、用VHDL例化語句(參考實驗1中的1位全加VHDL文本輸入設計)按圖3-2 的方式,完成頂層文件設計,并重復以上實驗過程。注意圖3-2中的tmp是4位總線,led是7位總線。對于引腳鎖定和實驗,建議仍選實驗電路模式6,用數碼8顯示譯碼輸出,用鍵3作為時鐘輸入(每按2次鍵為1個時鐘脈沖),或直接時鐘信號clock0。
圖3-2 計數器和譯碼器連接電路的頂層文件原理圖
(提示:
1、將教材P89頁程序和P154頁程序讀懂,分別建立工程、生成各自原理圖。
2、將上述兩個原理圖按教材P155頁圖6-19連接起來建立新的原理圖設計文件。
3、將上述原理圖文件編譯、仿真、引腳綁定,下載到實驗箱驗證。)
四、實驗報告要求
1、總結Quartus II 6.0 VHDL 中CASE語句應用及多層次設計方法
2、根據以上的實驗內容寫出實驗報告,包括程序設計、軟件編譯、仿真分析、硬件測試和實驗過程;設計程序、程序分析報告、仿真波形圖及其分析報告;
3、心得體會――本次實驗中你的感受;你從實驗中獲得了哪些收益;本次實驗你的成功之處;本次實驗中還有待改進的地方;下次實驗應該從哪些地方進行改進;怎樣提高自的實驗效率和實驗水平等等。
五、問題與思考:
只要求譯出數字0~9和“-”,怎樣修改程序?
第五篇:EDA實驗六1315212017
《電子設計自動化實驗》課程設計
題 目: 十六位硬件乘加器電路 姓 名: 江 璐 學院班級: 13級電子信息工程2班 學 號: 1315212017 指導老師: 邱應強老師 時 間: 20151122 目 錄 一:摘要……………………………………………………3 二: 正文……………………………………………………3(一)系統設計………………………………………………3(二)單元電路設計…………………………………………4(三)仿真結果………………………………………………9(四)軟件設計………………………………………………11(五)系統測試………………………………………………11(六)結論……………………………………………………14 三:參考文獻………………………………………………14 四:附錄……………………………………………………15 六:心得體會………………………………………………16 一:摘要
1.實驗要求:采用并行、串行或流水線方式來實現對8個16位數據進行乘法和加法運算(yout=a0?b0+a1?b1+a2?b2+a3?b3),位寬16位。
2.實驗方法:使用乘法器lpm_mult2、16位加法器ADDER16B、計數器cnt16以及鎖存器en_dff四個模塊。當clock出現上升沿時,對輸入端輸入的兩個數dataa、datab進行乘法運算。將結果輸入鎖存器中,鎖存上一階段計算得到的值,16位加法器ADDER16B將鎖存器鎖存的上一階段的值與進行完乘法計算得到的值dataa*datab加起來,并輸出結果。計數器cnt16用于區分四組乘加所得數,當有一個上升沿脈沖送入cnt16時,若計數不到5,則進行計數+1,若計數達到5,COUT輸出進位信號到鎖存器en_dff的reset端口,將鎖存器復位清零,重新進行計數。
3.實驗結論:經過仿真與硬件測試檢驗后證實可行,但是是對8個8位數據進行乘法和加法運算。
二:正文
(一)系統設計
1.設計要求
采用并行、串行或流水線方式來實現對8個16位數據進行乘法和加法運算(yout=a0*b0+a1*b1+a2*b2+a3*b3),位寬16位。
2.系統設計方案
(1)系統設計思路:由十六位加法器構成以時序邏輯方式設計的十六位乘加器,流水線方式,以移位加法為核心器件。(2)總體方案的論證與比較
方案一:采用四個乘法器,以串行方式輸入各數據。
方案二:采用一個乘法器,先輸入兩數據進行運算,將得到結果保存,并與下一組乘法運算得到的結果相加。
方案的選擇:第一種方案浪費大量的資源,考慮到實驗箱條件限制,采用第二種方案。盡管速度較慢,但可省下相當多的資源,并且實驗室可以實現。(3)各功能塊的劃分與組成
共有4個設計模塊,分別是乘法器lpm_mult0、16位加法器ADDER16B、計數器cnt16以及鎖存器en_dff。(4)系統的工作原理
以上是電路原理圖。乘數dataa與被乘數datab輸入乘法器lpm_mult0中,當START有上升沿出現時,乘法器計算出dataa*datab的結果并有result[15..0]輸出。result[15..0]輸出的結果送入8位加法器ADDER8B的A[15..0]輸入端,加法器的B[15..0]輸入端連接到鎖存器en_dff的輸出端q[15..0],這樣鎖存器鎖存的值就可以與加法器所得到的值相加,得到兩對乘法計算后值得和,以此類推,可以得到不斷累加的值。而CIN端口接地,這樣可以確保CIN端口不影響加法器的計算。加法器計算A[15..0](dataa*datab)和鎖存器鎖存的值B[15..0]的和從輸出端S[15..0]輸出,輸入鎖存器en_dff的輸入端d[15..0],將數值鎖存起來,同時輸出端S[15..0]接到輸出端YOUT[15..0],從而從仿真中可以看到每一階段累加的結果。而計數器cnt16的作用是區分四組乘加所得數與四組乘加所得數。EN接高電平,rst接低電平,保證計數器可用,clk接到START,每當有一個上升沿脈沖送入cnt16時,若計數不到5,則進行計數+1,若計數達到5,COUT輸出進位信號到鎖存器en_dff的reset端口,將鎖存器復位清零,重新進行計數。
(二)單元電路設計
總共有四大模塊,分別為乘法器lpm_mult0、16位加法器ADDER16B、計數器cnt16以及鎖存器en_dff。
1.乘法器lpm_mult0:當clock出現上升沿時,對輸入端輸入的兩個數dataa、datab進行乘法運算。程序:
--megafunction wizard: %LPM_MULT% 4--GENERATION: STANDARD--VERSION: WM1.0--MODULE: lpm_mult--==============--File Name: lpm_mult0.vhd--Megafunction Name(s):------Simulation Library Files(s):--lpm--==============--************************************************************--THIS IS A WIZARD-GENERATED FILE.DO NOT EDIT THIS FILE!----7.2 Build 151 09/26/2007 SJ Full Version--************************************************************--Copyright(C)1991-2007 Altera Corporation--Your use of Altera Corporation's design tools, logic functions--and other software and tools, and its AMPP partner logic--functions, and any output files from any of the foregoing--(including device programming or simulation files), and any--associated documentation or information are expressly subject--to the terms and conditions of the Altera Program License--Subscription Agreement, Altera MegaCore Function License--Agreement, or other applicable license agreement, including,--without limitation, that your use is for the sole purpose of--programming logic devices manufactured by Altera and sold by--Altera or its authorized distributors.Please refer to the--applicable agreement for further details.LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY lpm;USE lpm.all;ENTITY lpm_mult0 IS PORT();END lpm_mult0;ARCHITECTURE SYN OF lpm_mult0 IS SIGNAL sub_wire0 : STD_LOGIC_VECTOR(15 DOWNTO 0);clock dataa datab result
: IN STD_LOGIC;
: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)lpm_mult 5 COMPONENT lpm_mult GENERIC();PORT();END COMPONENT;BEGIN result <= sub_wire0(15 DOWNTO 0);lpm_mult_component : lpm_mult GENERIC MAP()PORT MAP();END SYN;--==============--CNX file retrieval info--==============--Retrieval info: PRIVATE: AutoSizeResult NUMERIC “1”--Retrieval info: PRIVATE: B_isConstant NUMERIC “0”--Retrieval info: PRIVATE: ConstantB NUMERIC “0”--Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING “Cyclone II”--Retrieval info: PRIVATE: LPM_PIPELINE NUMERIC “1” dataa => dataa, datab => datab, clock => clock, result => sub_wire0 lpm_hint => “DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5”, lpm_pipeline => 1, lpm_representation => “UNSIGNED”, lpm_type => “LPM_MULT”, lpm_widtha => 8, lpm_widthb => 8, lpm_widthp => 16
dataa datab clock result
: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC;
: OUT STD_LOGIC_VECTOR(15 DOWNTO 0)lpm_hint
: STRING;
: NATURAL;
: STRING;lpm_pipeline lpm_type lpm_widtha lpm_widthb lpm_widthp lpm_representation
: STRING;
: NATURAL;: NATURAL;: NATURAL 6--Retrieval info: PRIVATE: Latency NUMERIC “1”--Retrieval info: PRIVATE: OptionalSum NUMERIC “0”--Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING “1”--Retrieval info: PRIVATE: SignedMult NUMERIC “0”--Retrieval info: PRIVATE: USE_MULT NUMERIC “1”--Retrieval info: PRIVATE: ValidConstant NUMERIC “0”--Retrieval info: PRIVATE: WidthA NUMERIC “8”--Retrieval info: PRIVATE: WidthB NUMERIC “8”--Retrieval info: PRIVATE: WidthP NUMERIC “16”--Retrieval info: PRIVATE: WidthS NUMERIC “1”--Retrieval info: PRIVATE: aclr NUMERIC “0”--Retrieval info: PRIVATE: clken NUMERIC “0”--Retrieval info: PRIVATE: optimize NUMERIC “0”--Retrieval
info:
CONSTANT:
LPM_HINT
STRING “DEDICATED_MULTIPLIER_CIRCUITRY=YES,MAXIMIZE_SPEED=5”--Retrieval info: CONSTANT: LPM_PIPELINE NUMERIC “1”--Retrieval info: CONSTANT: LPM_REPRESENTATION STRING “UNSIGNED”--Retrieval info: CONSTANT: LPM_TYPE STRING “LPM_MULT”--Retrieval info: CONSTANT: LPM_WIDTHA NUMERIC “8”--Retrieval info: CONSTANT: LPM_WIDTHB NUMERIC “8”--Retrieval info: CONSTANT: LPM_WIDTHP NUMERIC “16”--Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL clock--Retrieval info: USED_PORT: dataa 0 0 8 0 INPUT NODEFVAL dataa[7..0]--Retrieval info: USED_PORT: datab 0 0 8 0 INPUT NODEFVAL datab[7..0]--Retrieval info: USED_PORT: result 0 0 16 0 OUTPUT NODEFVAL result[15..0]--Retrieval info: CONNECT: @dataa 0 0 8 0 dataa 0 0 8 0--Retrieval info: CONNECT: result 0 0 16 0 @result 0 0 16 0--Retrieval info: CONNECT: @datab 0 0 8 0 datab 0 0 8 0--Retrieval info: CONNECT: @clock 0 0 0 0 clock 0 0 0 0--Retrieval info: LIBRARY: lpm lpm.lpm_components.all--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.vhd TRUE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.inc FALSE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.cmp TRUE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0.bsf TRUE FALSE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_inst.vhd FALSE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_waveforms.html TRUE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_wave*.jpg FALSE--Retrieval info: GEN_FILE: TYPE_NORMAL lpm_mult0_syn.v TRUE--Retrieval info: LIB_FILE: lpm
2.16位加法器ADDER16B:將鎖存器鎖存的上一階段的值與進行完乘法計算得到的值dataa*datab加起來,并輸出結果。程序:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER16B IS PORT(CIN:IN STD_LOGIC;A,B :IN STD_LOGIC_VECTOR(15 DOWNTO 0);S :OUT STD_LOGIC_VECTOR(15 DOWNTO 0);COUT:OUT STD_LOGIC);END ADDER16B;ARCHITECTURE behav OF ADDER16B IS SIGNAL SINT,AA,BB:STD_LOGIC_VECTOR(16 DOWNTO 0);BEGIN AA <= '0' & A;BB <= '0' & B;SINT <= AA+BB+CIN;S <= SINT(15 DOWNTO 0);COUT <= SINT(4);END behav;
3.計數器cnt16:區分每兩組乘加所得數。clk接到START,每當有一個上升沿脈沖送入cnt16時,若計數不到5,則進行計數+1,若計數達到5,COUT輸出進位信號到鎖存器en_dff的reset端口,將鎖存器復位清零,重新進行計數。程序:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY cnt16 IS PORT(CLK,RST,EN:IN STD_LOGIC;CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);COUT:OUT STD_LOGIC);END cnt16;ARCHITECTURE behav OF cnt16 IS BEGIN PROCESS(CLK,RST,EN)vARIABLE CQI:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN IF RST='1' THEN CQI:=(OTHERS=>'0');ELSIF CLK'EVENT AND CLK='1'THEN IF EN='1' THEN IF CQI < 5 THEN CQI:=CQI+1;ELSE CQI:=(OTHERS=>'0');END IF;END IF;END IF;IF CQI=5 THEN COUT<='1';ELSE COUT<='0';END IF;CQ<=CQI;8 END PROCESS;END behav;4.鎖存器en_dff:鎖存上一階段計算得到的值,從而使加法器實現累加功能。程序:
library ieee;use ieee.std_logic_1164.all;entity en_dff is port(d: in std_logic_VECTOR(15 DOWNTO 0);reset,EN,clk:in std_logic;q: buffer std_logic_VECTOR(15 DOWNTO 0));end en_dff;architecture behavior of en_dff is begin process(reset,clk)begin if reset='1' then q<=“***0”;elsif clk'event and clk='1'then if EN='1'then q<=d;else q<=q;end if;end if;end process;end behavior;
(三)仿真結果
(1)乘法器
給clock一個時鐘信號,驗證得當clock處于上升沿時result=dataa*datab
(2)16位加法器ADDER16B 將CIN接低電平,隨意設置A、B的值,S為A、B的和。
(3)計數器cnt16 給CLK一個時鐘信號。首先將RST置低電平,EN置高電平,驗證計數器的計數功能。再分別將RST置高電平、EN置低電平,驗證計數器的復位清零以及使能端控制功能。
(4)鎖存器en_dff 給clk一個時鐘信號。當reset=1時,鎖存器清零,當reset=0時有上升沿且使能端EN=1時,d鎖存進鎖存器中;當有上升沿但是使能端EN=0時,d值不鎖存進鎖存器中,鎖存器的值不改變。
(四)軟件設計
1.軟件設計平臺:QuartusII 7.2 2.實現方法:通過QuartusII 7.2進行VHDL語言編程、方陣、引腳配置,然后燒入 GW48實驗平臺,選擇模式NO.1,進行硬件驗證。
3.程序的流程方框圖:
4.實現的功能:位寬16位;能對8個16位數據進行乘法和加法運算(yout=a0*b0+a1*b1+a2*b2+a3*b3),并行、串行或流水線方式。
(五)系統測試
1.系統的性能指標(1)總圖(2)乘法器lpm_mult0
(3)8位加法器ADDER8B
(4)計數器cnt16(5)鎖存器en_dff
2.功能仿真
3.引腳綁定
確定波形仿真成功后,再配置管腳,將程序燒錄進EP2C5T144C8中,進行測試。選擇模式1,管腳配置圖如下(START設置為鍵8,使得人為可控,更方便調試)
(六)結論
根據硬件驗證:鍵1和鍵2輸入一個十六位數,鍵3和鍵4輸入另一個十六位數,數碼管1、2顯示第一個數,3、4顯示第二個數,鍵8是運算鍵,每點擊一次運算一次,為一組運算,運算結果顯示在數碼管5、6、7、8,將顯示這兩個數的積,再次輸入兩個十六位數,數碼管5、6、7、8將顯示這兩個數的積與前一組數積的和,依次輸入四組十六位數,完成一次十六位乘加的運算,且結果顯示在數碼管5、6、7、8。能夠實現對8個16位數據進行乘法和加法運算(yout=a0*b0+a1*b1+a2*b2+a3*b3)
三:參考文獻
潘松,黃繼業.EDA技術與VHDL(第3版)——清華大學出版社
潘松,黃繼業.EDA技術實用教程—VHDL版(第4班)——科學出版社 四:附錄
1.實驗電路結構圖
2.GW48系統引腳對照表
五.心得體會
本次的課程設計選題時間較短,由于不怎么會寫程序,所以乘法器使用Quartus II生成,而其他模塊是在網上找的資料,自己輸入編譯反復修改而成。總體來說過程比較順利,但不足之處是不能完全實現設計要求。