【正文】
O 0)。8 WHEN0001100=IS_RUNYEAR:=39。24 WHEN0011100=IS_RUNYEAR:=39。30 WHEN0101100=IS_RUNYEAR:=39。56 WHEN0111100=IS_RUNYEAR:=39。72 WHEN1001100=IS_RUNYEAR:=39。88 WHEN1011100=IS_RUNYEAR:=39。1YUE WHEN0011=TOTAL_DAYS=11111。6YUE WHEN1001=TOTAL_DAYS=11110。 END CASE。THEN CURRUT_MONTH_DAYS=TOTAL_DAYS。 END IF。 CLK_SEC : IN STD_LOGIC。 LED_YEAR : OUT STD_LOGIC。 MIN_CUR : IN STD_LOGIC_VECTOR(5 DOWNTO 0)。 DAY_EN : OUT STD_LOGIC。 SEC : OUT STD_LOGIC_VECTOR(5 DOWNTO 0)。 NUM : OUT STD_LOGIC_VECTOR(5 DOWNTO 0) )。 COMPONENT CNT30A PORT(LD : IN STD_LOGIC。 END COMPONENT。 CLK : IN STD_LOGIC。 CO : OUT STD_LOGIC。 SEC : IN STD_LOGIC_VECTOR(5 DOWNTO 0)。 SIGNAL HOUR_CUR : STD_LOGIC_VECTOR(4 DOWNTO 0)。 SIGNAL YEAR_CUR : STD_LOGIC_VECTOR(6 DOWNTO 0)。 SIGNAL SYNTHESIZED_WIRE_7 : STD_LOGIC_VECTOR(4 DOWNTO 0)。 SIGNAL SYNTHESIZED_WIRE_15 : STD_LOGIC。 LED_MON = SYNTHESIZED_WIRE_11。 B2V_INST5 : CNT12 PORT MAP(LD = SYNTHESIZED_WIRE_11, CLK = SYNTHESIZED_WIRE_12, DATA = SYNTHESIZED_WIRE_13, CO = SYNTHESIZED_WIRE_15, NUM = MON_CUR)。 21 圖 6 從圖 7仿真圖可以直觀的看出 , 本程序首先要讀當(dāng)前年和月,在對(duì)該月的最大天數(shù)進(jìn)行判斷并將結(jié)果向外輸出。 十 系統(tǒng)拓展思路 對(duì)于系統(tǒng)的各種控制時(shí)鐘信號(hào),可以通過分頻電路對(duì)一個(gè)給定的合適平率信號(hào)進(jìn)行分頻產(chǎn)生。最后參照每個(gè)模塊把輸入和輸出引腳設(shè)定,運(yùn)用我們所學(xué)的 VHDL語言進(jìn)行編程。 同時(shí)我也掌握了做課程設(shè)計(jì)的一般流程,為以后的電子設(shè)計(jì)這塊積累了一定的經(jīng)驗(yàn),為以后從事相關(guān)工作一些幫助。 在調(diào)整控制電路的設(shè)計(jì)中,通過讀入系統(tǒng)當(dāng)前工作的各種時(shí)間信息進(jìn)行自加調(diào)整,簡化了預(yù)置值的設(shè) 計(jì),利用狀態(tài)機(jī)非常簡單的實(shí)現(xiàn)了 8鐘調(diào)整的循環(huán)變化。同時(shí)當(dāng) LD 端有低電平輸入時(shí),說明置數(shù)信號(hào)( LD)有效。 B2V_INST3 : CNT24 PORT MAP(LD = SYNTHESIZED_WIRE_5, 20 CLK = SYNTHESIZED_WIRE_6, DATA = SYNTHESIZED_WIRE_7, CO = SYNTHESIZED_WIRE_20, NUM = HOUR_CUR)。 LED_SEC = SYNTHESIZED_WIRE_0。 SIGNAL SYNTHESIZED_WIRE_13 : STD_LOGIC_VECTOR(3 DOWNTO 0)。 SIGNAL SYNTHESIZED_WIRE_5 : STD_LOGIC。 SIGNAL SEL_OUT : STD_LOGIC_VECTOR(2 DOWNTO 0)。 SIGNAL BCD_DATA : STD_LOGIC_VECTOR(7 DOWNTO 0)。 MIN : IN STD_LOGIC_VECTOR(5 DOWNTO 0)。 CLK : IN STD_LOGIC。 END COMPONENT。 CURRUT_MONTH_DAYS : OUT STD_LOGIC_VECTOR(4 DOWNTO 0)。 NUM : OUT STD_LOGIC_VECTOR(4 DOWNTO 0) )。 DATA : IN STD_LOGIC_VECTOR(5 DOWNTO 0)。 MIN : OUT STD_LOGIC_VECTOR(5 DOWNTO 0)。 MIN_EN : OUT STD_LOGIC。 HOUR_CUR : IN STD_LOGIC_VECTOR(4 DOWNTO 0)。 LED_DAY : OUT STD_LOGIC。 LIBRARY WORK。139。ANDCLK=39。28 END IF。12YUE WHEN0100=TOTAL_DAYS=11110。 END CASE。84 WHEN1011000=IS_RUNYEAR:=39。68 WHEN1001000=IS_RUNYEAR:=39。52 WHEN0111000=IS_RUNYEAR:=39。36 WHEN0101000=IS_RUNYEAR:=39。20 WHEN0011000=IS_RUNYEAR:=39。4 WHEN0001000=IS_RUNYEAR:=39。 CO:OUT STD_LOGIC)。 USE 。CO=39。)THEN NUM=DATA。 ENTITY CNT60 IS PORT(LD:IN STD_LOGIC。 END CASE。IF99 ELSE YEAR=YEAR+1。 WHEN MON_SET=MON_EN=39。 IF HOUR=11000THEN HOUR=00000。 END IF。WEEK_EN=39。MON_EN=39。 WHEN DAY_SET=MODE=MON_SET。HOUR_EN=39。SEC_EN=39。 WEEK_EN=39。HOUR_EN=39。 SIGNAL MODE:STATETYPE。 SEC,MIN:BUFFER STD_LOGIC_VECTOR(5 DOWNTO 0)。 KEY:IN STD_LOGIC_VECTOR(1 DOWNTO 0)。 END PROCESS。 WHEN 94=BCD_DATA=10010100。 WHEN 86=BCD_DATA=10000110。 WHEN 78=BCD_DATA=01111000。 WHEN 70=BCD_DATA=01110000。 WHEN 62=BCD_DATA=01100010。 WHEN 54=BCD_DATA=01010100。 WHEN 46=BCD_DATA=01000110。 WHEN 38=BCD_DATA=00111000。 WHEN 30=BCD_DATA=00110000。 9 WHEN 22=BCD_DATA=00100010。 WHEN 14=BCD_DATA=00010100。 WHEN 6=BCD_DATA=00000110。 WHEN OTHERS=NULL。 PROCESS(CNT)IS BEGIN CASE CNT IS WHEN000=TEMP=CONV_INTEGER(SEC)。139。 WEEK:IN STD_LOGIC_VECTOR(2 DOWNTO 0)。 USE 。 XSKZQ的輸入、輸出端口如圖 3所示。 將計(jì)月電路的進(jìn)位信號(hào)作為計(jì)年電路的計(jì)數(shù)時(shí)鐘信號(hào),每當(dāng)計(jì)滿 100就會(huì)溢出,計(jì)年電路返回加 1并重新計(jì)數(shù)。 二、系統(tǒng)設(shè)計(jì)方案 根據(jù)系統(tǒng)的設(shè)計(jì)要求,綜合設(shè)計(jì)系統(tǒng)可分為三個(gè)主要模塊:綜合計(jì)時(shí)電路模塊、顯示控制電路模塊和調(diào)整控制電路模塊。 將計(jì)秒電路的進(jìn)位信號(hào)作為計(jì)分電路的計(jì)數(shù)時(shí)鐘信號(hào),每當(dāng)計(jì)滿 60就會(huì)溢出,同時(shí)進(jìn)位位進(jìn)位,計(jì)時(shí)電路加 1,同時(shí)計(jì)分電路清零并重新計(jì)數(shù)。由于該計(jì)數(shù)模塊涉及到大小月及閏年問題,所以CNT30的計(jì)數(shù)范圍并不是固定不變,存在 2 2 30和 31四種計(jì)數(shù)情況。 TZKZQ的輸入、輸出 圖 4是其輸入、輸出端口圖,其中輸入信號(hào) KEY[1..0]為鍵盤信號(hào),當(dāng) KEY=10時(shí)表示按下了設(shè)置鍵,系統(tǒng)切換到下一狀態(tài),當(dāng) KEY=10時(shí)表示按下了調(diào)整鍵,系統(tǒng)進(jìn)行自加一。 SEC,MIN:IN STD_LOGIC_VECTOR(5 DOWNTO 0)。 END ENTITY DISPLAY。139。 WHEN011=TEMP=CONV_INTEGER(DAY)。 WHEN 1=BCD_DATA=00000001。 WHEN 9=BCD_DATA=00001001。 WHEN 17=BCD_DATA=00010111。 WHEN 25=BCD_DATA=00100101。 WHEN 33=BCD_DATA=00110011。 WHEN 41=BCD_DATA=01000001。 WHEN 49=BCD_DATA=01001001。 WHEN 57=BCD_DATA=01010111。 WHEN 65=BCD_DATA=01100101。 WHEN 73=BCD_DATA=01110011。 WHEN 81=BCD_DATA=10000001。 WHEN 89=BCD_DATA=10001001。 WHEN 97=BCD_DATA=10010111。 USE 。 MIN_CUR:IN STD_LOGIC_VECTOR(5 DOWNTO 0)。 MON:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)。139。139。SEC=SEC_CUR。039。 DAY=DAY_CUR。139。039。 END CASE。 IF MIN=111011THEN MIN=000000。 WHEN DAY_SET=DAY_EN=39。IF12 ELSE MON=MON+1。039。 END PROCESS。