北郵 數字邏輯實驗報告
《北郵 數字邏輯實驗報告》由會員分享,可在線閱讀,更多相關《北郵 數字邏輯實驗報告(30頁珍藏版)》請在裝配圖網上搜索。
1、數字邏輯課程設計 北京郵電大學課程設計報告 課程設計 名稱 數字邏輯 學 院 計算機 指導教師 班 級 班內序號 學 號 學生姓名 成績 -- -- -- 楊楊 -- -- -- 陳陳 -- -- -- 金金 課 程 設 計 內 容 教學目的:掌握isp LEVER 軟件的使用方法,掌握isp器件的使用方法,用VHDL進行較復雜邏輯電路的設計和調試,熟練掌握isp器件的下載方法。 基本內容:1.交通燈控制 2.電子鐘顯示 3.藥片裝瓶系統 實驗方法:先用VHDL進行軟件編程,然后下載
2、到ISP器件,進行硬件仿真實驗。 組員分工:詳見各實驗報告實驗分工。 學生 課程設計 報告 (附頁) 課 程 設 計 成 績 評 定 遵照實踐教學大綱并根據以下四方面綜合評定成績: 1、課程設計目的任務明確,選題符合教學要求,份量及難易程度 2、團隊分工是否恰當與合理 3、綜合運用所學知識,提高分析問題、解決問題及實踐動手能力的效果 4、是否認真、獨立完成屬于自己的課程設計內容,課程設計報告是否思路清晰、文字通順、書寫規(guī)范 評語: 成績: 指導教師簽名: 年 月 日 注:
3、評語要體現每個學生的工作情況,可以加頁。 目錄 實驗一:交通燈控制器設計 實驗二:電子鐘設計 實驗三:藥片裝瓶系統設計 附:數字邏輯課程設計調試日志及個人心得體會 實驗一:交通燈控制器設計 一、實驗目的 ①學習采用狀態(tài)機方法設計時序邏輯電路。 ②掌握ispLEVER軟件的使用方法。 ③掌握用VHDL語言設計數字邏輯電路。 ④掌握ISP器件的使用。 二、實驗所用器件和設備 在系統可編程邏輯器件ISP1032 一片 示波器 一臺 萬用
4、表或邏輯筆 一只 TEC-5實驗系統,或TDS-2B數字電路實驗系統 一臺 三、實驗內容 以實驗臺上的4個紅色電平指示燈,4個綠色電平指示燈模仿路口的東南西北4個方向的紅,綠,黃交通燈??刂七@些交通燈,使它們按下列規(guī)律亮,滅。 (1) 初始狀態(tài)為4個方向的紅燈全亮,時間1s。 (2) 東,西方向綠燈亮,南,北方向紅燈亮。東,西方向通車,時間5s。 (3) 東,西方向黃燈閃爍,南,北方向紅燈,時間2s。 (4) 東,西方向紅燈亮,南,北方向綠燈亮。南,北方向通車,時間5s。 (5) 東,西方向紅燈閃爍,南,北方向黃燈閃爍,時間2s。 (6) 返回(2),繼續(xù)運行。 (7)
5、 如果發(fā)生緊急事件,例如救護車,警車通過,則按下單脈沖按鈕,使得東,南,西,北四個方向紅燈亮。緊急事件結束后,松開單脈沖按鈕,將恢復到被打斷的狀態(tài)繼續(xù)運行。 四、設計思路 (1) 將本實驗分為分頻,狀態(tài)計數器,led輸出三大模塊; (2) 分頻模塊需要注意到占空比,采用when-else語句; (3) 狀態(tài)計數器都分為5s,2s,5s,2s,四個狀態(tài)時間,通過計數器作狀 態(tài)轉移; (5) led輸出模塊的黃燈閃爍可通過2HZ的方波信號實現。 (6) 選擇實驗臺上的5kHz頻率時鐘,作為設計中分頻的初始時鐘。 (5) 緊急事件發(fā)生時,要注意保存必要的信息,已被緊急事件結束后
6、,恢復到原狀態(tài)繼續(xù)運行使用。 五、設計方案 模塊圖 1、tralight(頂層模塊代碼) library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;
7、entity tralight is port(clk,emg: in std_logic; --5KHZ時鐘輸入,緊急輸入 tout: out std_logic_vector(11 downto 0); --12盞led燈輸出 tout2,tout1: out std_logic_vector(3 downto 0));--倒計時 end tralight; architecture top of tralight is component fenpin --分頻模塊 port( clkin: in st
8、d_logic; --5KHZ時鐘輸入 clkout1: out std_logic; --1HZ時鐘 clkout2: out std_logic); --2HZ時鐘 end component; component ztjishuqi --狀態(tài)計數器模塊 port( emg1,clk1: in std_logic; --緊急輸入,1HZ時鐘輸入 stateout: out std_logic_vector(1 downto 0); --2
9、位狀態(tài)輸出 daoout2,daoout1: out std_logic_vector(3 downto 0));--倒計時 end component; component led --led交通燈顯示模塊 port(emg2,clk2: in std_logic; --緊急輸入,2HZ時鐘輸入(方波閃爍) statein: in std_logic_vector(1 downto 0); --2位狀態(tài)輸入 ledout: out std_logic_v
10、ector(11 downto 0)); --12盞led燈輸出 end component; signal fenpin1: std_logic; signal fenpin2: std_logic; signal state: std_logic_vector(1 downto 0); begin u1: fenpin PORT MAP(clkin=>clk, clkout1=>fenpin1, clkout2=>fenpin2); u2:ztjishuqi PORTMAP(emg1=>emg,clk1=>fenpin1,st
11、ateout=>state,daoout2=>tout2, daoout1=>tout1); u3: led PORT MAP(emg2=>emg, clk2=>fenpin2, statein=>state, ledout=>tout); end; 2、fenpin(底層分頻模塊) library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity fenpin is port( clkin: in std_logic; --5KHZ
12、時鐘輸入 clkout1: out std_logic; --1HZ時鐘 clkout2: out std_logic); --2HZ時鐘 end fenpin; architecture art of fenpin is signal temp: integer range 0 to 4999; begin process(clkin) begin if(clkin'event and clkin='1') then if(temp=4999) then
13、 temp<=0; else temp<=temp+1; end if; end if; end process; clkout1<='1' when(temp<2500) else '0'; clkout2<='1' when(temp<1250 or(temp>=2500 and temp<3750)) else '0'; end art; 3、ztjishuqi(底層狀態(tài)計數器模塊
14、) library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ztjishuqi is port( emg1,clk1: in std_logic; --緊急輸入,1HZ時鐘輸入 stateout: out std_logic_vector(1 downto 0); --2位狀態(tài)輸出 daoout2,daoout1: out std_logic_vector(3 downto 0));--倒計時 en
15、d ztjishuqi; architecture art of ztjishuqi is signal temp: integer range 0 to 13; type State IS (s0,s1,s2,s3); signal current_state, next_state: State; begin process(emg1, clk1) begin if(emg1='0') then if(clk1'event and clk1 ='1' ) then
16、if(temp=0 ) then stateout<="00"; temp<=temp+1; daoout2<="0100"; daoout1<="0110"; elsif(temp>0 and temp<=4) then stateout<="00";temp<=temp+1;daoout2<=daoout2-1; daoout1<=daoout1-1; elsif(temp=5 or temp=6) then
17、 stateout<="01"; temp<=temp+1; daoout1<=daoout1-1; elsif(temp=7) then stateout<="10"; temp<=temp+1; daoout2<="0110";daoout1<="0100"; elsif(temp>7 and temp<=11) then stateout<="10";temp<=temp+1;da
18、oout2<=daoout2-1; daoout1<=daoout1-1; elsif(temp=12) then stateout<="11"; temp<=temp+1; daoout2<=daoout2-1; elsif(temp=13) then stateout<="11"; temp<=0; daoout2<=daoout2-1; end if; e
19、nd if; end if; end process; end art; 4、led(底層led輸出模塊) library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity led is port(emg2,clk2: in std_logic; --緊急輸入,2HZ時鐘輸入(方波閃爍),1HZ時鐘輸入 statein: in std_logic_vector(1 downto 0); --2位狀態(tài)輸入
20、 ledout: out std_logic_vector(11 downto 0)); --12盞led燈輸出 end led; architecture art of led is begin process(emg2,statein,clk2) begin if(emg2='1') then ledout<="001001001001"; else case statein is when "00" => l
21、edout<="100100001001"; when "01" => case clk2 is when '1' => ledout<="010010001001"; when others => ledout<= "000000001001"; end case; when "10" => ledout<="001
22、001100100"; when others => case clk2 is when '1' => ledout<="001001010010"; when others => ledout<= "001001000000"; end case; end case; end if; end
23、process; end art; 六、調試中出現的問題及解決方法 在編寫交通的的程序的時候,本人沒有碰到太大的技術上的問題(因為本身程序的要求比較簡單,模塊數也不多)。主要的一些碰到挫折的地方有1、方波閃爍問題:在編譯成功連上線之后,發(fā)現紅綠燈正常,但是黃燈不出現閃爍也不亮。經分析代碼后發(fā)現,黃燈的信號輸入并沒有產生方波,而只是一個一個的脈沖,要產生方波需要信號具有一定的占空比。改進代碼后此問題迎刃而解。 clkout1<='1' when(temp<2500) else '0'; clkout2<='1' when(temp<1250 or(temp>=2500 a
24、nd temp<3750)) else '0'; 2、警報使能無效:黃燈問題解決后,我發(fā)現在警報情況下,紅燈全亮,但是狀態(tài)計數器并沒有暫停,警報解除后狀態(tài)不能回到警報之前的狀態(tài)。后發(fā)現是if語句的條件關系。時鐘上升沿信號和警報使能信號不能“與”在一個if里,需要將他們已嵌套的方式放在兩個if語句里當條件。 在經過一天的編寫和調試,交通燈的模型已經達到了老師及課本上的要求。因為其他兩名組員暫時還沒有碰到什么問題,我開始著手增加功能的事情。我給交通燈增加了一個倒計時功能,這并不難實現,只需在狀態(tài)計數器的后面增加相應的語句,利用七段譯碼器實現倒計時的實現。
25、 七、層次設計的體會 實驗思路比較簡單,我們沒有采用元件例化的方法,但是模塊劃分仍然很清晰。程序可分為分頻,狀態(tài)計數器,led輸出三大模塊(控制燈亮滅)。層次設計將大問題分解為較小的問題,可以提高效率,使思路清晰。 八、比較不同種描述方式的心得 實驗中結構體的三種描述方式都用到了:數據流描述、結構描述、行為描述。數據流描述邏輯清晰、描述簡單。結構描述使程序模塊劃分清晰,便于從宏觀上把握程序功能,便于整體設計。行為描述更容易把握程序對于不同輸入或者信號所做的動作。根據不同情況選擇不同描述方法可以使程序得到優(yōu)化。 九、本次設計的收獲和不足 程序中多個進程同時進行,使我們更加
26、理解了硬件的執(zhí)行方式,什么是并行執(zhí)行。本次是實驗小組成員共同討論的成果,一些問題的調試,每個人都提出了自己的看法,使得程序更加完善,效率更高。同時,提高了我們的團隊合作意識,在實驗設計過程中,我們得到了很多工作經驗。 在狀態(tài)計數器模塊中,大量采用了if-else語句,幸好本實驗規(guī)模不大,其實這是比較危險的。如果能夠采用標準的current-state,next-state,進行狀態(tài)轉移可以顯得更規(guī)范。 十、實驗分工 本實驗由金金主編,調試及記錄文檔。改進功能由金金完成。 實驗二:電子鐘設計 一、實驗目的 (1)掌握復雜的邏輯設計和調試 (2)學習用原理圖+VHDL語言
27、設計邏輯電路。 (3)學習數字電路模塊層次設計。 (4)掌握ispLEVER軟件的只用方法。 (5)熟悉ISP器件的使用 二、實驗所用器件和設備 在系統可編程邏輯器件ISP1032 一片 示波器 一臺 萬用表或邏輯筆 一只 TEC-5實驗系統,或TDS-2B數字電路實驗系統 一臺 三、實驗內容 (1)設計并用ISP1032實現一個電子鐘。電子鐘具有下述功能: a) 試驗臺上的6個數碼管顯示時、分、秒。 b) 能使電子鐘復位(清零)。 c) 能啟動或者停止電子鐘運行。 d) 再電子鐘停止運行狀態(tài)下,能夠修改時、分、秒的值。 e) 具有報時功能,整點時喇叭鳴叫
28、。 (2)要求整個設計分為若干模塊。頂層模塊用原理圖設計,底層模塊用VHDL語言設計。 (3)在試驗臺上調試設計。 電子鐘設計框圖 四、設計思路 實驗要求以VHDL和原理圖兩種方式設計。時鐘用一個模24的計數器來實現;分鐘和秒鐘則分別用一個模60的計數器來實現;要實現自動計時,則需要連上實驗臺的5KHz提供脈沖,還需要一個分頻的模塊dclk,使其吻合時鐘速度;整點報時則用一個ring的模塊實現,分鐘進位時開始計數從而實現報時5秒。 clock24 (時鐘計數) clock(頂層模塊) cloc
29、k60 (分鐘和秒鐘計數 dclk (分頻,提供1Hz的時鐘脈沖) ring (實現整點報時) 五、代碼實現 原理圖設計 頂層模塊,用于整合整個時鐘系統 library ieee; use ieee.std_logic_unsigned.all; use ieee.std_logic_1164.all; entity clock is port( clr,clk,tclk,timing: in std_logic; --清零,5KHz,QD,暫停 con: in std_
30、logic_vector(2 downto 0); --校時時選擇時,分,秒 h0,m1,m0,s1,s0: out std_logic_vector(3 downto 0); --分別對應時鐘,分鐘,秒鐘 h1: out std_logic_vector(6 downto 0); c,speaker,light: out std_logic); --時鐘進位,響鈴,上下午燈 end clock; architecture arc of clock is componen
31、t clock60 --模60計數器 Port ( clks,sclr,sclk,stiming: in std_logic; v1,v0 : out std_logic_vector(3 downto 0); co : out std_logic ); END component; component dclk --分頻,提供1Hz脈沖 port( high,con1: in std_logic; --con1表示校時按鈕 low: out std
32、_logic); end component; component clock24 --模24計數器 port( clkh,hclr,hclk,htiming: in std_logic; y0: out std_logic_vector(3 downto 0); Y: out std_logic_vector(6 downto 0); co,noon: out std_logic); end component; component ring is --實現響鈴
33、 port( cclk,cc1,cc2: in std_logic; loud: out std_logic); end component; signal c1,c2,clk1: std_logic; begin u1: dclk port map (high=>clk,low=>clk1,con1=>timing);--提供脈沖(校時時不提供) u2: clock60 port map (sclr=>clr,stiming=>con(0),sclk=>tclk,clks=>clk1,v0=>s0,v1=>s1,co=>c1); u3: c
34、lock60 port map (sclr=>clr,stiming=>con(1),sclk=>tclk,clks=>c1,v0=>m0,v1=>m1,co=>c2); u4: clock24 port map (hclr=>clr,htiming=>con(2),hclk=>tclk,clkh=>c2,y0=>h0,Y=>h1,co=>c,noon=>light); u5: ring port map (cclk=>clk1,cc1=>c1,cc2=>c2,loud=>speaker); end arc; 底層模塊clock24,用于時鐘計時、校時及顯示 library
35、ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity clock24 is port( clkh,hclr,hclk,htiming: in std_logic; y0: out std_logic_vector(3 downto 0); --個位 Y: out std_logic_vector(6 downto 0); --十位 co,noon: out std_logic); --進位,上
36、下午燈 end clock24; architecture arc2 of clock24 is signal t1,t0: std_logic_vector(3 downto 0); signal bibibi: std_logic; begin bibibi<= clkh when (htiming='0') else hclk; --判斷是否處于校時狀態(tài) process(bibibi,hclr) begin if (hclr='1') then --清零 t0<="0000"; t1<="0000"; elsif (bi
37、bibi'event and bibibi='1') then if (t1=2 and t0=3 and htiming='0') then --模24進位 co<='1'; else co<='0'; end if; --計數器 if (t0=9) then t0<="0000"; t1<=t1+1; elsif (t1=2 and t0=3) then t0<="0000"; t1<="0000"; else t0<=t0+1; end if; --計數器 END IF
38、; end process; y0<=t0; noon<='1' when (t1<1 or (t1=1 and t0<3)) else '0'; --上午亮燈,下午燈滅 Y <= "1111110" when t1="0000" else --0 "0110000" when t1="0001" else --1 "1101101" when t1="0010" else --2 "0000000" ; end arc2; 底層模塊clock60,用于分鐘、秒鐘的
39、計時與校時 library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity clock60 is Port ( clks,sclr,sclk,stiming: in std_logic; v0,v1: out std_logic_vector(3 downto 0); --個位,十位 co : out std_logic ); --進位 end
40、clock60; architecture arc1 of clock60 is signal t1,t0: std_logic_vector(3 downto 0); signal bibibi: std_logic; begin bibibi<= clks when (stiming='0') else sclk; --判斷是否處于校時狀態(tài) process(bibibi,sclr) begin if (sclr='1') then --清零 t0<="0000"; t1<="0000"; elsif (bibibi'eve
41、nt and bibibi='1') then if (t1=5 and t0=9 and stiming='0') then --模24進位 co<='1'; else co<='0'; end if; --計數器 if (t0=9) then t0<="0000"; if (t1=5) then t1<="0000"; else t1<=t1+1; end if; else t0<=t0+1; end if; --計數器 end if; end proces
42、s; v0<=t0; v1<=t1; end arc1; 底層模塊dclk,用于提供1Hz脈沖 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity dclk is port(high,con1: in std_logic; --con1表示校時按鈕 low: out std_logic); --輸出1Hz脈沖 end dclk; architecture arc2 of dclk is signal tem
43、p: integer range 0 to 4999; begin process(high,temp,con1) begin if (high'event and high='1' and con1='0') then –在非校時狀態(tài) if (temp=4999) then --分頻,將5KHz做一個模5000的計數器輸出 temp<=0; low<='1'; else temp<=temp+1; low<='0'; end if; end if; end process; end arc2;
44、 底層模塊ring,用于整點報時 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity ring is port( cclk,cc1,cc2: in std_logic; loud: out std_logic); --響鈴 end; architecture behavioral of ring is signal count: integer range 0 to 5; signal loud1: std_logic; b
45、egin process(cclk,cc1,cc2) begin if (cclk'event and cclk='1') then --每到一個時鐘脈沖,如果count符合條件便開始響鈴 if (count<5) then count<=count+1; loud1<=not loud1; --響鈴維持5秒,這樣可做到一聲一聲地響 else loud1<='0'; end if; end if; if (cc1='1' and cc2='1') then --分鐘進位的時
46、候count歸0 count<=0; end if; end process; loud<=loud1; end behavioral; 六、實驗中遇到的主要問題及解決方法 問題 解決方案 如何模擬時鐘系統 以低位的進位做高位的時鐘脈沖(即秒鐘進位做分鐘的clk,分鐘進位做時鐘的clk) 如何對應時鐘輸出 由于每個計數器都是采用“個位”和“十位”分別計數,則使該位連接到相應的燈上輸出即可,最高位則使用七段譯碼器進行轉換,因此增加一個LED的模塊實現該功能 如何顯示上下午 兩個層面:1.時鐘采用24進制計時;2.增加一個管腳連燈,判
47、斷當時鐘為[0,12]區(qū)間內則亮燈,否則滅燈。 如何提供1Hz的時鐘脈沖 在dclk模塊里做一個模5000的計數器,使得5KHz做輸入,進位做1Hz時鐘輸出。 如何實現校時功能 加入一個暫停鍵和三個控制鍵,當需要校時的時候則停下時、分、秒的計時,同時選擇相應的控制按鈕來分別調節(jié)時鐘,此時的脈沖由手動摁下QD給出 如何實現整點報時 采用秒鐘的clk做時鐘脈沖,每來一個時鐘時如果count<5,則count加1同時響鈴,否則不響鈴。每當有分鐘進位的時候,讓count=0,則count又可以繼續(xù)計數,再次響鈴。 具體問題可見調試日志 七、層次設計的體會 本實驗由一個頂層模
48、塊clock來整合實現整個時鐘系統的所有功能,其下有四個模塊:dclk(提供1Hz脈沖),clock24(時鐘計數器),clock60(分鐘、秒鐘計數器),ring(實現整點報 時),其中clock60會在主模塊中調用兩次,對應不同的參數以分別實現分鐘、秒鐘的功能。 在頂層模塊中調用其他底層模塊,使得各部分功能并發(fā)進行。 八、實驗分工 本實驗由陳陳主編,調試及記錄文檔。 實驗五:藥片裝瓶系統設計 一、實驗目的 ⑴掌握較復雜邏輯的設計、調試。 ⑵采用VHDL語言,或原理圖+VHDL語言來設計數字系統。 ⑶學習數字系統設計方法。 ⑷掌握ispLEVER軟
49、件的使用方法。 ⑸熟悉ISP器件的使用。 二、實驗所用器件和設備 在系統可編程邏輯器件ISP1032 一片 示波器 一臺 萬用表或邏輯筆 一只 TEC-5實驗系統,或TDS-2B數字電路實驗系統 一臺 三、實驗內容 如圖5-1左面所示,藥片由輸送管送入漏斗裝置中,后者頸部每次只允許一粒藥片掉進傳送帶上的瓶子里。漏斗的頸部有一個光傳感器,它探測到每一粒藥片后產生一個電脈沖信號。這個脈沖傳送到計數器中,使其計數加1,這樣在藥片裝入瓶子過程的任一時刻,計數器都保存著瓶子中藥片數量的二進制數。這個二進制數以計數器通過并行導線傳送到比較器的輸入端B。 另一方面,每個瓶子中要裝入
50、的固定藥片數量(例如50片)通過鍵盤手動設置。按鍵信號經過編碼器編碼后送到寄存器A保存,而代碼轉換器A將寄存器A中的BCD數變成二進制數送到比較器輸入端A。 假設每個瓶子要裝50粒藥片,當計數器的數值達到50后,比較器的A=B輸出端出現高電平,指示瓶子已裝滿,立即關閉漏斗頸上的閥門使藥片停止下落,與此同時它使傳送帶移動下一個瓶子到漏斗的下面。當瓶子到達漏斗頸正下方時,傳送帶的控制電路產生一個脈沖信號使計數器清0,比較器A=B輸出端變成低電平,打開漏斗閥門,重新開始藥片滴落。 圖5-1 藥片裝瓶計數顯示系統框圖 結合上面的藥片裝瓶系統設計實例,采用VHDL設計,并用ISP1032E
51、大容量器件實現如圖5-2所示的藥片裝瓶系統。 ⑴實驗臺上的5個數碼管作為顯示系統,顯示每瓶藥片及總藥片的數量。 ⑵用實驗臺的紅綠發(fā)光二極管來模擬對機電裝置系統的輸出,綠色燈亮表示啟動機電裝置,裝瓶進行中;紅色燈亮表示裝瓶完成,機電裝置關閉。 ⑶輸入子系統為包括BCD碼每瓶裝藥數輸入與裝瓶開始脈沖輸入,設計要求每瓶最大藥片數50粒,最多裝18瓶。 ⑷啟動裝瓶開始脈沖后,如果輸入數量超出最大裝瓶數或者為零,要求顯示系統出現告警提示。 ⑸漏斗感應器送來的藥片裝瓶信號用2s信號模擬,可以用實驗臺提供的5kHz的時鐘分頻產生。 ⑹在實驗臺上調試設計。 圖5-2 藥片裝瓶系統
52、四、設計思路 圖5-3示出了藥片裝瓶控制與顯示系統的組成總框圖,它可以劃分為如下七個子系統: 裝瓶量計數模塊 用進位來對總瓶數進行計數 單瓶藥片計數模塊 用時鐘脈沖來對藥片數進行計數 分頻模塊 對5kHz的脈沖進行分頻 藥片總量計數模塊 用時鐘脈沖來對藥片數進行計數 選擇器模塊 對開始暫停信號進行判斷決定輸出瓶數還是當前藥片數 五、設計方案(代碼) library ieee; use ieee.std_logic_unsigned.all; use ieee.std_logic_1164.all; entity yaopian is—
53、定義接口 port( start,clk,zero: in std_logic; suminput,botnum: in std_logic_vector(7 downto 0); tabletsum2,tabletsum1,tabletsum0: out std_logic_vector(3 downto 0); warn,lighton,lightoff: out std_logic; outsum1,outsum0: out std_logic_vector(3 downto 0)); end; architecture behavioral of y
54、aopian is component divider—分頻模塊 port( clk1in: in std_logic; clk1out:out std_logic); end component; component tabsum—藥片總數計數模塊 port( start2,clk2,zero2: in std_logic; a,b: out std_logic; tabletsum22,tabletsum21,tabletsum20:out std_logic_vector(3 downto 0)); end component; component b
55、tsum—單瓶藥片數計數 port( start3,clk3,zero3: in std_logic; suminput3: in std_logic_vector(7 downto 0); co3: out std_logic; output31,output30: out std_logic_vector(3 downto 0)); end component; component botsum—藥瓶計數 port( start4,co4,zero4: in std_logic; output41,output40: out std_logic_vect
56、or(3 downto 0); botnum4: in std_logic_vector(7 downto 0); warn4: out std_logic); end component; component chooser—選擇器 port( start5:in std_logic; botsum51,botsum50,tabletsum51,tabletsum50: in std_logic_vector(3 downto 0); output51,output50: out std_logic_vector(3 downto 0)); end comp
57、onent; signal tempclk,tempco,a: std_logic; signal temptsum1,temptsum0,tempbsum1,tempbsum0: std_logic_vector(3 downto 0); begin u1: divider port map(clk,tempclk); u2: tabsum port map(start,tempclk,zero,lighton,lightoff,tabletsum2,tabletsum1,tabletsum0); u3: btsum port map(start,tempclk,zero,sum
58、input,tempco,temptsum1,temptsum0); u4: botsum port map(start,a,zero,tempbsum1,tempbsum0,botnum,warn); a<= tempclk when suminput=1 else tempco; u5: chooser port map(start,tempbsum1,tempbsum0,temptsum1,temptsum0,outsum1,outsum0); end behavioral; library ieee; use ieee.std_logic_uns
59、igned.all; use ieee.std_logic_1164.all; entity botsum is port( start4,co4,zero4: in std_logic; output41,output40: out std_logic_vector(3 downto 0); botnum4: in std_logic_vector(7 downto 0); warn4: out std_logic); end; architecture behavioral of botsum is begin process(co4,zero4,
60、start4)—當有進位時藥瓶計數 begin if(zero4='1') then output41<="0000"; output40<="0000"; elsif(co4'event and co4='1' and start4='1') then --if(output41="1001" and output40="1001") then -- output41<="0000"; -- output40<="0000"; --elsif(output40="1001") then -- output41<=output41+1;
61、 -- output40<="0000"; --else -- output40<=output40+1; --end if; if (output40="1001") then output40<="0000"; if (output41="1001") then output41<="0000"; else output41<=output41+1; end if; else output40<=output40+1; end if; --if(sum>"10001") then
62、 -- warn4<='1'; --else -- warn4<='0'; --end if; end if; end process; warn4<= '1' when((output41&output40)>=botnum4) else—超過額定瓶數時報警 '0'; --process(sum) --begin -- if(sum>18) then -- warn4<='1'; -- else -- warn4<='0'; -- end if; --end process; end behavioral; library
63、 ieee; use ieee.std_logic_unsigned.all; use ieee.std_logic_1164.all; entity btsum is port( start3,clk3,zero3: in std_logic; suminput3: in std_logic_vector(7 downto 0); co3: out std_logic; output31,output30: out std_logic_vector(3 downto 0)); end; architecture behavioral of btsum
64、is --signal tout31,output30: std_logic_vector(3 downto 0); begin process(clk3,start3,zero3)—當有時鐘脈沖時開始計數 begin if(zero3='1') then output31<="0000"; output30<="0000"; elsif(clk3'event and clk3='1' and start3='1') then if(output31&output30=(suminput3)) then co3<='1'; output31<=
65、"0000"; output30<="0001"; elsif(output31&output30<(suminput3)) then if(output30="1001") then output31<=output31+1; output30<="0000"; co3<='0'; else output30<=output30+1; co3<='0'; end if; end if; end if; end process; end behavioral; library ie
66、ee; use ieee.std_logic_unsigned.all; use ieee.std_logic_1164.all; entity chooser is port( start5:in std_logic; botsum51,botsum50,tabletsum51,tabletsum50: in std_logic_vector(3 downto 0); output51,output50: out std_logic_vector(3 downto 0)); end; architecture behavioral of chooser is begin process(start5) begin if(start5='0') then—暫停時輸出瓶數 output51<=botsum51; output50<=botsum50; else—計數時輸出單瓶藥片數 output51<=tabletsum51; output50<=tabletsum50; end if; end process
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。