eda技術課程設計---8位加法器設計_第1頁
已閱讀1頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p><b>  EDA技術課程設計</b></p><p>  課題: 8位加法器設計 </p><p>  系 別: 電氣與電子工程系</p><p>  專 業(yè): 電子信息工程</p><p>  姓 名: </p><p>  學 號:

2、 </p><p><b>  指導教師: </b></p><p>  2011年6月24日</p><p><b>  一、設計目的3</b></p><p><b>  二、設計要求3</b></p><p>  三、總體設計原理與內容

3、3</p><p>  1、設計的總體原理3</p><p><b>  2、設計內容5</b></p><p>  四、EDA設計及仿真6</p><p>  1、8位加法器源程序6</p><p>  2、仿真結果及數據分析13</p><p><b&

4、gt;  五、硬件實現15</b></p><p>  1、硬件實現步驟15</p><p>  2、硬件實現照片16</p><p><b>  六、設計總結16</b></p><p>  1、設計過程中遇到的問題及解決方法16</p><p><b>  2、

5、設計體會17</b></p><p>  3、對設計的建議17</p><p>  七、設計生成的電路圖17</p><p><b>  八、參考文獻17</b></p><p><b>  一、設計目的</b></p><p>  通過對FPGA(現場可

6、編程門陣列)芯片的設計實踐,使學生掌握一般的PLD(可編程邏輯器件)的設計過程、設計要求、設計內容、設計方法,能根據用戶的要求及工藝需要進行電子芯片設計并制定有關技術文件。培養(yǎng)學生綜合運用已學知識解決實際工程技術問題的能力、查閱圖書資料和各種工具書的能力、工程繪圖能力、撰寫技術報告和編制技術資料的能力,受到一次電子設計自動化方面的基本訓練。</p><p>  培養(yǎng)學生利用EDA技術知識,解決電子設計自動化中常見

7、實際問題的能力,使學生積累實際EDA編程。通過本課程設計的學習,學生將復習所學的專業(yè)知識,使課堂學習的理論知識應用于實踐,通過本課程設計的實踐使學生具有一定的實踐操作能力。</p><p><b>  二、設計要求</b></p><p>  1、由兩個4位二進制并行加法器級聯設計一個8位二進制并行加法器。</p><p>  2、要求加數、被

8、加數、和都在數碼管上以十進制數顯示出來。</p><p>  3、完成該系統的硬件和軟件的設計,調試好后并能實際運用。</p><p>  三、總體設計原理與內容</p><p><b>  1、設計的總體原理</b></p><p>  8位加法器采用兩個4位二進制并行加法器級聯而成,輸入一個8位二進制數,用兩個控制信

9、號EN1,EN2控制其是加數還是被加數,和用十進制顯示.</p><p>  設計一個8位二進制顯示為十進制的子程序,并用蜂鳴器來指示是否有進位。</p><p>  部分算法如下,低位相加并產生進位:</p><p>  qq(0):= not(A(0)XOR(NOT(B(0))));</p><p>  sq(0):= not(qq(0)

10、 XOR (NOT(ci))); </p><p>  if ((A(0) xor B(0))='1') then cq(0):= ci; </p><p>  ELSE cq(0):=A(0); </p><p><b>  END if;</b>&l

11、t;/p><p><b>  流程框圖:</b></p><p><b>  圖1</b></p><p><b>  2、設計內容</b></p><p>  第一步,用按鍵輸入一個8位二進制數,然后根據EN1,EN2的按鍵,選擇輸入的是加數還是被加數,最后根據位選值動態(tài)顯示其值

12、。</p><p>  第二步,根據算法進行相加運算,并且由第一步所得cout數值決定數碼管顯示和,最后根據位選值動態(tài)顯示。</p><p>  根據以上,需要設計一個四位加法器,十進制轉換程序和動態(tài)顯示程序。</p><p>  四、EDA設計及仿真</p><p>  1、8位加法器源程序</p><p>  --

13、--------------------COMPONENT ADD4:------------------------</p><p>  LIBRARY IEEE; --二進制四位加法器</p><p>  USE IEEE.STD_LOGIC_1164.ALL;</p><p>  US

14、E IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p>  ENTITY ADD4 IS </p><p>  Port(A,B:in STD_logic_vector(3 downto 0); --輸入四位二進制</p><p>  ci:in STD_logic; --輸入進位</p

15、><p>  co: out STD_logic; --輸出進位</p><p>  so:out STD_logic_vector(3 downto 0) ); --輸出和</p><p><b>  end;</b></p><p>  ARCHITECTURE h1 of

16、ADD4 is</p><p><b>  begin</b></p><p>  process(A,B)</p><p>  variable cq, qq, sq: STD_logic_vector(3 downto 0); </p><p><b>  begin</b>

17、</p><p>  qq(0):= not(A(0) XOR (NOT (B(0)))); </p><p>  sq(0):= not(qq(0) XOR (NOT(ci))); --低位相加并產生進位 </p><p>  if((A(0)xorB(0))='1')then cq(0):= ci; </p&

18、gt;<p>  ELSE cq(0):=A(0); </p><p><b>  END if;</b></p><p>  qq(1):= not(A(1) xor (NOT(B(1)))); </p><p>  sq(1):= not(qq(1) xor (NOT(cq(0)))); --第二位于前一進

19、位相加 </p><p>  if((A(1) xor B(1))='1') Then cq(1):= cq(0);--產生進位</p><p>  ELSE cq(1):=A(1); </p><p><b>  END if;</b></p><p>  qq(2):= not(A(2)

20、 XOR (NOT(B(2))));</p><p>  sq(2):= not(qq(2) XOR (NOT(cq(1))));</p><p>  if ((A(2) xor B(2))='1') then cq(2):= cq(1); </p><p>  ELSE cq(2):=A(2); </p><p>

21、;<b>  END if;</b></p><p>  qq(3):=not(A(3) XOR (NOT B(3))); </p><p>  sq(3):=not(qq(3) XOR (NOT(cq(2)))); --前一位進位與高位相加 </p><p>  if ((A(3) xor B(3))='1')

22、then cq(3):= cq(2);--產生進位</p><p>  ELSE cq(3):=A(3); </p><p><b>  END if;</b></p><p>  Co<=cq(3); </p><p>  So<=sq; </p><p>  En

23、d process; </p><p>  End architecture h1;</p><p>  ------------COMPONENT look:--------</p><p>  library ieee; --二進制轉換為十進制顯示</p><p>

24、;  use ieee.std_logic_1164.all; </p><p>  use ieee.std_logic_unsigned.all;</p><p>  use ieee.std_logic_arith.all;</p><p>  entity look is</p><p>  port(d:in std_logic_v

25、ector(7 downto 0); --輸入要轉換的二進制</p><p>  clk3:in std_logic;</p><p>  smg: out std_logic_vector(2 downto 0);--位選,分別顯示個位,十位,百位</p><p>  led7s:out std_logic_vector(6 downto 0));

26、 </p><p><b>  end;</b></p><p>  architecture one of look is</p><p>  signal ai,bi,ci:integer range 0 to 9;</p><p>  signal xi:std_logic_vector(2 downto 0);&

27、lt;/p><p>  signal led7s1:std_logic_vector(20 downto 0);</p><p>  signal di:integer range 0 to 256;</p><p><b>  begin</b></p><p>  di<=conv_integer(d);

28、 --把8位二進制加進位轉為整型</p><p>  process(di)</p><p>  variable a,b,c:integer range 0 to 9;</p><p><b>  begin</b></p><p>  a:=di rem 10;

29、 --把整型數的個位賦值給a</p><p>  b:=((di-a) rem 100)/10; --把整型數的十位賦值給b</p><p>  c:=(di-a-10*b)/100; --把整型數的百位賦值給c</p><p><b>  ai<=a;</b>

30、;</p><p><b>  bi<=b;</b></p><p>  ci<=c; </p><p>  end process;</p><p>  process(ai) --把個位賦值給led7s1顯示出來</p>&

31、lt;p><b>  begin</b></p><p>  case ai is</p><p>  when 0=>led7s1(6 downto 0)<="1000000";</p><p>  when 1=>led7s1(6 downto 0)<="1111001"

32、;</p><p>  when 2=>led7s1(6 downto 0)<="0100100";</p><p>  when 3=>led7s1(6 downto 0)<="0110000";</p><p>  when 4=>led7s1(6 downto 0)<="00

33、11001";</p><p>  when 5=>led7s1(6 downto 0)<="0010010";</p><p>  when 6=>led7s1(6 downto 0)<="0000010";</p><p>  when 7=>led7s1(6 downto 0)&l

34、t;="1111000";</p><p>  when 8=>led7s1(6 downto 0)<="0000000";</p><p>  when 9=>led7s1(6 downto 0)<="0010000";</p><p>  when others=>led7

35、s1(6 downto 0)<="XXXXXXX";</p><p>  end case; </p><p>  end process;</p><p>  process(bi) --把十位賦值給led7s1顯示出來 </p><p>&

36、lt;b>  begin</b></p><p>  case bi is</p><p>  when 0=>led7s1(13 downto 7)<="1000000"; </p><p>  when 1=>led7s1(13 downto 7)<="1111001"

37、;;</p><p>  when 2=>led7s1(13 downto 7)<="0100100";</p><p>  when 3=>led7s1(13 downto 7)<="0110000";</p><p>  when 4=>led7s1(13 downto 7)<=&quo

38、t;0011001";</p><p>  when 5=>led7s1(13 downto 7)<="0010010";</p><p>  when 6=>led7s1(13 downto 7)<="0000010";</p><p>  when 7=>led7s1(13 down

39、to 7)<="1111000";</p><p>  when 8=>led7s1(13 downto 7)<="0000000";</p><p>  when 9=>led7s1(13 downto 7)<="0010000";</p><p>  when others

40、=>led7s1(13 downto 7)<="XXXXXXX";</p><p>  end case; </p><p>  end process;</p><p>  process(ci) --把百位賦值給led7s1顯示出來</p><p>

41、;<b>  begin</b></p><p>  case ci is</p><p>  when 0=>led7s1(20 downto 14)<="1000000";</p><p>  when 1=>led7s1(20 downto 14)<="1111001";&l

42、t;/p><p>  when 2=>led7s1(20 downto 14)<="0100100";</p><p>  when 3=>led7s1(20 downto 14)<="0110000";</p><p>  when 4=>led7s1(20 downto 14)<="

43、;0011001";</p><p>  when 5=>led7s1(20 downto 14)<="0010010";</p><p>  when 6=>led7s1(20 downto 14)<="0000010";</p><p>  when 7=>led7s1(20 dow

44、nto 14)<="1111000";</p><p>  when 8=>led7s1(20 downto 14)<="0000000";</p><p>  when 9=>led7s1(20 downto 14)<="0010000";</p><p>  when ot

45、hers=>led7s1(20 downto 14)<="XXXXXXX";</p><p>  end case; </p><p>  end process;</p><p>  process(clk3)</p><p>  variable x:std_logic_vector(2 downt

46、o 0); --定義一個變量控制位選 </p><p><b>  begin</b></p><p>  if clk3'event and clk3='1' then</p><p>  if x<5 then x:=x+1; </p><p>  else x:=(othe

47、rs=>'0'); </p><p>  end if; </p><p><b>  end if;</b></p><p>  xi<=x; </p><p>  end process;</p><p>  process(xi,led7s1)<

48、;/p><p><b>  begin</b></p><p>  case xi is</p><p>  when "001"=>led7s<=led7s1(6 downto 0);smg<="001"; --控制數碼管顯示個位</p><p>  when &q

49、uot;010"=>led7s<=led7s1(13 downto 7);smg<="010";--控制數碼管顯示十位</p><p>  when "100"=>led7s<=led7s1(20 downto 14);smg<="100";--控制數碼管顯示百位</p><p>  

50、when others=> led7s<="XXXXXXX";smg<="XXX";</p><p>  end case; </p><p>  end process; </p><p><b>  end;</b></p><p>  ----

51、--------------------COMPONENT counter:-------------------</p><p>  LIBRARY ieee; </p><p>  USE ieee.std_logic_1164.all; </p><p>  use ieee.std_logic_unsig

52、ned.all;</p><p>  ENTITY counter IS </p><p>  PORT ( e1,e2,clk3: IN STD_LOGIC ; </p><p>  q1: OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); </p><p>  END counter; </p>&

53、lt;p>  ARCHITECTURE bhv OF counter IS </p><p><b>  BEGIN </b></p><p>  PROCESS(clk3,e1,e2)</p><p>  VARIABLE cout:INTEGER:=0;</p><p><b>  BEGIN <

54、;/b></p><p>  IF clk3'EVENT AND clk3='1' THEN cout:=cout+1; </p><p><b>  END IF;</b></p><p>  if e1='1' then q1<="001"; cout:=0;

55、 </p><p>  END IF; --輸入加數,數碼管顯示加數</p><p>  if e2='1' then q1<="010"; cout:=10; </p><p>  END IF;

56、 --輸入被加數,數碼管顯示被加數。</p><p>  IF cout > 10 THEN q1<="100"; </p><p>  END IF; --數碼管顯示和。</p><p>  END PROCESS; </p><

57、;p><b>  END bhv;</b></p><p>  -----------------------project ADD8(main code):------------------</p><p>  LIBRARY IEEE;</p><p>  USE IEEE.STD_LOGIC_1164.ALL;</p>

58、;<p>  USE IEEE.STD_LOGIC_UNSIGNED.ALL;</p><p>  ENTITY ADD8 IS </p><p>  Port(A:in STD_logic_vector(7 downto 0); --輸入加數和被加數。</p><p>  EN1,EN2,clk:in std_logic;

59、 --控制輸入數為加數或被加數</p><p>  wx: out std_logic_vector(2 downto 0); --位選。</p><p>  led:out std_logic_vector(6 downto 0)); --數碼管顯示。</p><p><b>  END;</b></p><

60、;p>  architecture h2 of ADD8 is</p><p>  COMPONENT ADD4 --調用四位加法器。</p><p>  Port(A,B:in STD_logic_vector(3 downto 0);</p><p>  ci:in STD_logic

61、; </p><p>  co: out STD_logic;</p><p>  so:out STD_logic_vector(3 downto 0) );</p><p>  END COMPONENT;</p><p>  COMPONENT look --調用十進制顯示

62、環(huán)節(jié)。</p><p>  Port(d:in STD_logic_vector(7 downto 0);</p><p>  clk3:in std_logic;</p><p>  smg: out std_logic_vector(2 downto 0);</p><p>  led7s:out std_logic_vector(6 d

63、ownto 0));</p><p>  END COMPONENT;</p><p>  COMPONENT counter --調用動態(tài)顯示環(huán)節(jié)。</p><p>  PORT(e1,e2,clk3: IN STD_LOGIC ;</p><p>  q1: OUT STD_LOG

64、IC_VECTOR(2 DOWNTO 0));</p><p>  END COMPONENT;</p><p>  Signal AI,BI:STD_logic_vector(7 downto 0); --定義兩信號,表示加數和被加數。</p><p>  Signal e,cout:std_logic;</p><p>  Signal

65、SUM:STD_logic_vector(7 downto 0); --定義信號,表示和;</p><p>  Signal pp:STD_logic_vector(7 downto 0);</p><p>  Signal clk2:STD_LOGIC_VECTOR(2 DOWNTO 0);</p><p><b>  BEGIN</b>

66、</p><p>  u1:add4 port map(A=>AI(3 downto 0), B=>BI(3 downto 0),ci=>'0',co=>e,so=>SUM(3 downto 0));</p><p>  u2:add4 port map(A=>AI(7 downto 4), B=>BI(7 downto 4),ci

67、=>e,co=>cout,so=>sum(7 downto 4));</p><p>  u3:look port MAP(d=>PP,clk3=>clk, led7s=>led,smg=>wx); </p><p>  u4:counter port MAP(clk3=>clk,q1=>clk2,e1=&

68、gt;en1,e2=>en2); </p><p>  process(en1,en2)</p><p><b>  begin</b></p><p>  if en1'event and en1='1' then AI<=A; </p><p>  END IF;

69、 --輸入加數,賦值給AI</p><p>  if en2'event and en2='1' then BI<=A; </p><p>  END IF; --輸入被加數,賦值給BI</p><p>  end process;</

70、p><p>  process(clk2)</p><p><b>  begin</b></p><p>  if clk2="001" then pp<=AI; </p><p>  END IF; --顯示加數;</p>

71、<p>  if clk2="010" then pp<=BI; </p><p>  END IF; --顯示被加數;</p><p>  if clk2="100" then pp<=sum; </p><p>  END IF;

72、 --顯示和;</p><p>  END PROCESS; </p><p><b>  End h2;</b></p><p>  2、仿真結果及數據分析</p><p><b>  四位加法器子程序:</b></p><

73、;p><b>  圖2</b></p><p>  說明:該子程序實現四位二進制相加,運用逐位相加,并輸出進位。由波形數據可知,功能正確實現 。 </p><p><b>  十進制顯示子程序:</b></p><p><b>  圖3</b></p><p>  說明

74、:該子程序的作用是使加數和被加數及和以十進制在數碼管上顯示。</p><p>  波形圖中,d代表輸入的要轉換的8位二進制,clk3是用來控制位選信號smg的數值,smg有“001”“010”“100”,化為十進制是0 2 4,代表led7s分別顯示個位 ,十位, 百位。</p><p><b>  動態(tài)顯示子程序:</b></p><p>

75、;<b>  圖4</b></p><p>  說明:該子程序功能是控制加數. 被加數. 和的顯示問題。采用進程實現,具體如下:</p><p>  當clk由0變?yōu)?時,賦值cout=1,</p><p>  當e1由0變?yōu)?時,此時q1=“001”,數碼管顯示加數,令cout=0。</p><p>  當e2由0變?yōu)?/p>

76、1時,此時q1=“010”,數碼管顯示被加數,令cout=10</p><p>  當下一個clk信號來到時,cout=cout+1>10,此時q1=“100”,數碼管顯示和。</p><p><b>  主程序:</b></p><p><b>  圖5</b></p><p>  說明:波

77、形圖中A代表輸入的二進制,由EN1,EN2決定其是數還是被加數,smg的數值代表的是數碼管顯示是個位或十位或百位,led根據smg的數值顯示對應數據。</p><p><b>  五、硬件實現</b></p><p><b>  1、硬件實現步驟</b></p><p> ?。?)程序仿真成功后,首先開始引腳鎖定</

78、p><p>  (2)引腳鎖定完成后,需要再編譯一次,將引腳鎖定信息編譯進編程文件中</p><p> ?。?)編譯成功后并連接好試驗線路后,將編譯產生的SOF格式配置文件在編程窗中配置進FPGA中,就開始硬件測試了</p><p><b>  圖6</b></p><p>  說明:ledB1,ledB2代表加數個位和十位

79、顯示,ledC1,ledC2代表被加數個位和十位,ledS1,ledS2代表和的個位和十位。</p><p><b>  2、硬件實現照片</b></p><p><b>  圖7</b></p><p>  說明:1.從左到右,“05”顯示的是加數,“05”顯示的是被加數,“10”顯示的是和。加數和被加數通過下面的各4個

80、鍵輸入控制,并用指示燈是否點亮表示。</p><p>  2.左圖代表的是輸入進位ci=0,右圖代表的是輸入進位ci=1。</p><p><b>  六、設計總結</b></p><p>  1、設計過程中遇到的問題及解決方法</p><p>  》元件聲明及例化問題</p><p>  解決方

81、法:參考課本對其的解釋,并參照例子程序了解其具體應用。</p><p><b>  》數據類型問題</b></p><p>  解決方法:回歸課本,忽視了運算符兩邊的數據類型應該一致。</p><p><b>  》引腳配置問題</b></p><p>  解決方法:根據實驗系統的數碼管和按鍵個數和

82、程序,在輸入8位二進制加數和被加數時,需要多加控制鍵,造成控制鍵不夠,需要以十六進制輸入,1個按鍵輸入加數和被加數的四位二進制。</p><p>  》源程序代碼復雜問題</p><p>  解決方法:分部分理解,編譯仿真。</p><p><b>  2、設計體會</b></p><p>  》根據設計題目,首先要考慮

83、其實現原理,由原理將設計內容分為幾個部分。</p><p>  》分別設計各部分程序,并及時進行編譯仿真,修改程序。</p><p>  》對實驗箱有了更進一步理解,特別是數碼管顯示方法和引腳配置問題。</p><p><b>  3、對設計的建議</b></p><p>  》考試時間安排不合理,給設計造成一定的緊張程

84、度,增加學生的心理壓力。</p><p>  》實驗箱模式應用不清楚,老師應該多多講解。</p><p>  如:動態(tài)掃描能否與其它模式混用七、設計生成的電路圖(見附圖)</p><p><b>  八、參考文獻</b></p><p>  1.橋廬峰,王志功,VHDL數字電路設計教程,2.11.11</p>

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論