在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<abbr id="27omo"></abbr>

<menu id="27omo"><dl id="27omo"></dl></menu>
    • <label id="27omo"><tt id="27omo"></tt></label>

      新聞中心

      EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 數(shù)字萬年歷設(shè)計(jì)

      數(shù)字萬年歷設(shè)計(jì)

      作者: 時(shí)間:2023-12-15 來源:電子森林 收藏
      • 普通列表項(xiàng)目任務(wù):基于核心板 和 底板 完成數(shù)字設(shè)計(jì)并觀察調(diào)試結(jié)果
      • 普通列表項(xiàng)目要求:驅(qū)動(dòng)底板上的實(shí)時(shí)時(shí)鐘芯片DS1340Z獲取時(shí)間信息(年、月、日、周、時(shí)、分、秒),顯示在8位數(shù)碼管上,分兩頁顯示,第一頁顯示年月日周信息,第二頁顯示時(shí)分秒信息,通過旋轉(zhuǎn)編碼器調(diào)節(jié)數(shù)字和控制顯示,具體控制如下:
        • 有8個(gè)狀態(tài)(常態(tài)、調(diào)年、調(diào)月、調(diào)日、調(diào)周、調(diào)時(shí)、調(diào)分、調(diào)秒)
        • 按動(dòng)旋轉(zhuǎn)編碼器在8個(gè)狀態(tài)中依次循環(huán)切換
        • 常態(tài)下,轉(zhuǎn)動(dòng)編碼器切換顯示頁,逆時(shí)針轉(zhuǎn)顯示第一頁,順時(shí)針轉(zhuǎn)顯示第二頁
        • 調(diào)節(jié)狀態(tài)下,旋轉(zhuǎn)調(diào)節(jié)時(shí)間,逆時(shí)針轉(zhuǎn)減,順時(shí)針轉(zhuǎn)加
        • 調(diào)節(jié)狀態(tài)下,顯示被調(diào)節(jié)選項(xiàng)所在頁,同時(shí)被調(diào)節(jié)選項(xiàng)閃爍顯示
      • 普通列表項(xiàng)目解析:通過編程驅(qū)動(dòng)實(shí)時(shí)時(shí)鐘芯片DS1340Z,實(shí)現(xiàn)時(shí)間寫入和讀出的功能,驅(qū)動(dòng)旋轉(zhuǎn)編碼器獲取操作信息,設(shè)計(jì)一個(gè)控制模塊根據(jù)編碼器操作信息控制數(shù)字萬年歷的邏輯(包括時(shí)間調(diào)節(jié),顯示控制),最后驅(qū)動(dòng)數(shù)碼管顯示數(shù)字萬年歷信息。

      根據(jù)前面的實(shí)驗(yàn)解析我們可以得知,該設(shè)計(jì)可以拆分成幾個(gè)功能模塊實(shí)現(xiàn),

      • Encoder:驅(qū)動(dòng)旋轉(zhuǎn)編碼器旋轉(zhuǎn)功能實(shí)現(xiàn),獲取轉(zhuǎn)動(dòng)信息
      • Debounce:驅(qū)動(dòng)旋轉(zhuǎn)編碼器按鍵功能實(shí)現(xiàn),實(shí)現(xiàn)按鍵消抖
      • modectrl:根據(jù)編碼器操作信息控制萬年歷時(shí)間調(diào)節(jié)和顯示控制邏輯 * DS1340Zdriver:驅(qū)動(dòng)實(shí)時(shí)時(shí)鐘芯片DS1340Z完成時(shí)間寫入和讀出功能
      • Segment_scan:通過驅(qū)動(dòng)掃描式數(shù)碼管將萬年歷信息顯示出來。

      Top-Down層次設(shè)計(jì)

       

      模塊結(jié)構(gòu)設(shè)計(jì)

      實(shí)驗(yàn)原理

      DS1340Z模塊介紹

      從DS1340Z芯片手冊(cè)可以得到如下信息,DS1340Z芯片典型電路連接如下:

      典型電路連接

      DS1340Z芯片管腳功能描述如下(SO-8封裝):

      管腳功能描述

      DS1340Z芯片內(nèi)部結(jié)構(gòu)圖如下:

      芯片內(nèi)部結(jié)構(gòu)圖

      DS1340Z模塊連接

      底板上的實(shí)時(shí)時(shí)鐘芯片DS1340Z模塊電路圖如下(上拉電阻未顯示):

      DS1340Z模塊電路

      我們的實(shí)時(shí)時(shí)鐘芯片為DS1340Z-33,模塊電路中有電池座,電池電壓范圍為1.3V~5.5V,當(dāng)安裝電池后底板掉電不影響實(shí)時(shí)時(shí)鐘芯片的運(yùn)行,重新上電后讀取實(shí)時(shí)時(shí)鐘數(shù)據(jù)。

      DS1340Z電壓范圍

      實(shí)時(shí)時(shí)鐘芯片DS1340Z需要外置32.768KHz的晶體,芯片內(nèi)部集成起振電阻電容等電路,晶體直接連接即可。

      DS1340Z晶振連接

      DS1340Z驅(qū)動(dòng)設(shè)計(jì)

      前面實(shí)驗(yàn)中我們已經(jīng)講述學(xué)習(xí)過I2C總線驅(qū)動(dòng)的設(shè)計(jì),本實(shí)驗(yàn)可以上原來的基礎(chǔ)上調(diào)整,首先來了解DS1340Z時(shí)序中的參數(shù)要點(diǎn)。

      DS1340Z時(shí)序圖

      DS1340Z時(shí)序參數(shù)

      通過DS1340Z時(shí)序參數(shù)了解,DS1340Z支持I2C通信400KHz快速模式同時(shí)兼容100KHz的標(biāo)準(zhǔn)模式,還有兩種模式下時(shí)序中的各種時(shí)間參數(shù),所以通信速度不需要調(diào)整。

      • 普通列表項(xiàng)目分頻得到400KHz的時(shí)鐘,程序?qū)崿F(xiàn)同智能接近系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)。

      I2C時(shí)序基本單元(啟動(dòng)、停止、發(fā)送、接收、發(fā)應(yīng)答、讀應(yīng)答)協(xié)議里統(tǒng)一的,所以所以基本單元狀態(tài)的設(shè)計(jì)也是不需要調(diào)整的。

      • 啟動(dòng)時(shí)序狀態(tài)設(shè)計(jì)程序?qū)崿F(xiàn)同智能接近系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)。
      • 發(fā)送單元和讀應(yīng)答單元合并,時(shí)序狀態(tài)設(shè)計(jì)程序?qū)崿F(xiàn)同智能接近系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)。
      • 接收單元和寫應(yīng)答單元合并,時(shí)序狀態(tài)設(shè)計(jì)程序?qū)崿F(xiàn)同智能接近系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)。
      • 停止時(shí)序狀態(tài)設(shè)計(jì)程序?qū)崿F(xiàn)同智能接近系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)。

      DS1340Z芯片有很多寄存器,用于存儲(chǔ)實(shí)時(shí)時(shí)鐘的時(shí)間信息,例如地址為00H的寄存器中,bit7為晶體使能控制位,低有效,默認(rèn)使能,bit6~bit0為秒鐘數(shù)據(jù),且是BCD碼的格式(bit6~bit4代表秒鐘的十位,bit3~bit0代表秒鐘的個(gè)位),當(dāng)需要調(diào)整秒鐘時(shí)間時(shí),對(duì)00H寄存器寫操作,當(dāng)讀取秒鐘時(shí)間時(shí), 對(duì)00H寄存器讀操作。其他寄存器也是一樣,詳細(xì)請(qǐng)參考每個(gè)寄存器的功能說明。

      DS1340Z寄存器布局

      本實(shí)驗(yàn)涉及DS1340Z的寫寄存器和讀寄存器操作,查看手冊(cè)給出的操作時(shí)序流程。

      芯片支持連續(xù)寫寄存器操作(寄存器地址自加1),時(shí)序流程如下:

      DS1340Z連續(xù)寫操作

      根據(jù)連續(xù)寫寄存器時(shí)序流程,其設(shè)計(jì)程序?qū)崿F(xiàn)如下:

      MAIN:begin
              if(cnt_main >= 6'd11) //對(duì)MAIN中的子狀態(tài)執(zhí)行控制cnt_main
                  cnt_main <= 6'd0;   //
              else cnt_main <= cnt_main + 1'b1;   
              case(cnt_main)
                  6'd0:   begin state <= START; end   //I2C通信時(shí)序中的START
                  6'd1:   begin data_wr <= 8'hd0; state <= WRITE; end     //寫地址為8'hd0
                  6'd2:   begin data_wr <= 8'h00; state <= WRITE; end     //8'h00,起始寄存器
                  6'd3:   begin data_wr <= adj_sec; state <= WRITE; end   //00寄存器地址,寫秒
                  6'd4:   begin data_wr <= adj_min; state <= WRITE; end   //01寄存器地址,寫分
                  6'd5:   begin data_wr <= adj_hour; state <= WRITE; end  //02寄存器地址,寫時(shí)
                  6'd6:   begin data_wr <= adj_week; state <= WRITE; end  //03寄存器地址,寫周
                  6'd7:   begin data_wr <= adj_day; state <= WRITE; end   //04寄存器地址,寫日
                  6'd8:   begin data_wr <= adj_mon; state <= WRITE; end   //05寄存器地址,寫月
                  6'd9:   begin data_wr <= adj_year; state <= WRITE; end  //06寄存器地址,寫年
                  6'd10:  begin data_wr <= 8'h40; state <= WRITE; end   //07寄存器地址,8'h40
                  6'd11:  begin state <= STOP; end    //I2C通信時(shí)序中的STOP
                  default: state <= IDLE; //如果程序失控,進(jìn)入IDLE自復(fù)位狀態(tài)
              endcase
          end

      芯片支持連續(xù)讀寄存器操作(寄存器地址自加1),時(shí)序流程如下:

      DS1340Z連續(xù)讀操作

      根據(jù)連續(xù)寫寄存器時(shí)序流程,其設(shè)計(jì)程序?qū)崿F(xiàn)如下:

      MAIN:begin
              if(cnt_main >= 6'd32) //對(duì)MAIN中的子狀態(tài)執(zhí)行控制cnt_main
                  cnt_main <= 6'd12;         //否則只執(zhí)行時(shí)間讀取操作
              else cnt_main <= cnt_main + 1'b1;   
              case(cnt_main)
                  6'd12:  begin state <= START; end   //I2C通信時(shí)序中的START
                  6'd13:  begin data_wr <= 8'hd0; state <= WRITE; end //寫地址為8'hd0
                  6'd14:  begin data_wr <= 8'h00; state <= WRITE; end //8'h00,寄存器初始地址
                  6'd15:  begin state <= START; end   //I2C通信時(shí)序中的START
                  6'd16:  begin data_wr <= 8'hd1; state <= WRITE; end //讀地址為8'hd1
                  6'd17:  begin ack <= ACK; state <= READ; end    //讀秒
                  6'd18:  begin rtc_sec <= rtc_data_r; end
                  6'd19:  begin ack <= ACK; state <= READ; end    //讀分
                  6'd20:  begin rtc_min <= rtc_data_r; end
                  6'd21:  begin ack <= ACK; state <= READ; end    //讀時(shí)
                  6'd22:  begin rtc_hour <= rtc_data_r; end
                  6'd23:  begin ack <= ACK; state <= READ; end    //讀周
                  6'd24:  begin rtc_week <= rtc_data_r; end
                  6'd25:  begin ack <= ACK; state <= READ; end    //讀日
                  6'd26:  begin rtc_day <= rtc_data_r; end
                  6'd27:  begin ack <= ACK; state <= READ; end    //讀月
                  6'd28:  begin rtc_mon <= rtc_data_r; end
                  6'd29:  begin ack <= ACK; state <= READ; end    //讀年
                  6'd30:  begin rtc_year <= rtc_data_r; end
                  6'd31:  begin ack <= NACK; state <= READ; end   //控制
                  6'd32:  begin state <= STOP; end    //I2C通信時(shí)序中的STOP,讀取完成標(biāo)志
                  default: state <= IDLE; //如果程序失控,進(jìn)入IDLE自復(fù)位狀態(tài)
              endcase
          end

      上面兩段程序就是對(duì)于DS1340Z芯片的兩種操作,調(diào)時(shí)間和讀時(shí)間,對(duì)于萬年歷來說因?yàn)橛须姵毓╇?,?shí)時(shí)時(shí)鐘一直都處于工作狀態(tài),當(dāng)給上電時(shí)只需要讀時(shí)間即可,只有遇到時(shí)間不對(duì)的時(shí)候才需要調(diào)時(shí)間,所以DS1340Z驅(qū)動(dòng)模塊平時(shí)都在循環(huán)讀取時(shí)間,所以如果將調(diào)時(shí)間和讀時(shí)間的時(shí)序操作融合到同一個(gè)狀態(tài)下時(shí),對(duì)于cntmain要加以控制,cntmain初值為12,且運(yùn)行軌跡在12~32之間,控制程序調(diào)整如下:

      if(cnt_main >= 6'd32) //對(duì)MAIN中的子狀態(tài)執(zhí)行控制cnt_main
          if(set_flag)cnt_main <= 6'd0;   //當(dāng)set_flag被置位時(shí)才會(huì)執(zhí)行時(shí)間寫入操作
          else cnt_main <= 6'd12;         //否則只執(zhí)行時(shí)間讀取操作
          else cnt_main <= cnt_main + 1'b1;

      上面setflag為時(shí)間調(diào)整標(biāo)志位,只有按動(dòng)編碼器在調(diào)時(shí)間模式時(shí)需要用到寫時(shí)間數(shù)據(jù)的操作流程,可以根據(jù)按鍵脈沖置位setflag并自鎖,每次完成寫入操作后再將set_flag復(fù)位。程序?qū)崿F(xiàn)如下:

      reg                 set_flag;
      always@(posedge clk or negedge rst_n) begin
          if(!rst_n) set_flag <= 1'b0;
          else if(cnt_main==5'd11) set_flag <= 1'b0;  //完成寫入時(shí)間操作復(fù)位set_flag
          else if(key_set) set_flag <= 1'b1;          //按鍵脈沖控制set_flag置位
          else set_flag <= set_flag;
          end

      模塊端口如下:

      module DS1340Z_driver
      (
      input clk, rst_n, //系統(tǒng)時(shí)鐘和復(fù)位 
      input key_set,  //按動(dòng)脈沖輸入
      input [7:0] adj_hour, adj_min, adj_sec, //時(shí)分秒調(diào)整輸入
      input [7:0] adj_year, adj_mon, adj_day, adj_week, //年份調(diào)整輸入 
      output i2c_scl, //I2C總線SCLinout  i2c_sda, //I2C總線SDA 
      output [7:0] rtc_hour, rtc_min, rtc_sec, //實(shí)時(shí)時(shí)鐘輸出
      output [7:0] rtc_year, rtc_mon, rtc_day, rtc_week //實(shí)時(shí)年份輸出
      );

      到這里就完成了萬年歷中DS1340Z模塊的驅(qū)動(dòng)設(shè)計(jì),宏觀上講,該模塊的功能可以這樣描述:

      • 正常模式下循環(huán)讀取時(shí)間信息,并把時(shí)間數(shù)據(jù)輸出
      • 由旋轉(zhuǎn)編碼器按動(dòng)脈沖信號(hào)key_set觸發(fā)進(jìn)行一次寫操作,用于調(diào)節(jié)時(shí)間
      • 每次寫操作調(diào)節(jié)時(shí)間的時(shí)間數(shù)據(jù)由其他模塊提供

      萬年歷控制模塊實(shí)現(xiàn)

      控制模塊包含多個(gè)功能的設(shè)計(jì):模式控制、調(diào)時(shí)控制、顯示控制,可以細(xì)化成多個(gè)模塊實(shí)現(xiàn),本實(shí)驗(yàn)例程中就寫在了一個(gè)模塊下,我們會(huì)針對(duì)這三個(gè)功能分別講解其實(shí)現(xiàn)方法及原理。

      模式控制

      項(xiàng)目要求設(shè)計(jì)成8個(gè)模式(常態(tài)、調(diào)年、調(diào)月、調(diào)日、調(diào)周、調(diào)時(shí)、調(diào)分、調(diào)秒),對(duì)8個(gè)狀態(tài)編碼,常態(tài)—0、調(diào)秒—1、調(diào)分—2、調(diào)時(shí)—3、調(diào)周—4、調(diào)日—5、調(diào)月—6、調(diào)年—7,通過按動(dòng)旋轉(zhuǎn)編碼器切換,按照常識(shí)調(diào)時(shí)間從大到小調(diào)節(jié),先調(diào)節(jié)年份最后調(diào)秒鐘,所以我們這8個(gè)狀態(tài)的狀態(tài)機(jī)跳轉(zhuǎn)順序是固定的(0→7→6→5→4→3→2→1→0),依次循環(huán)跳轉(zhuǎn),程序?qū)崿F(xiàn)如下:

      //時(shí)鐘運(yùn)行狀態(tài)控制
      always@(posedge clk or negedge rst_n )
          if(!rst_n) state <= 3'd0;
          else if(O_pulse) //按鍵脈沖控制時(shí)鐘運(yùn)行狀態(tài)的跳變,
              if(state) state <= state - 3'd1;
              else state <= 3'd7;
          else state <= state;

      調(diào)時(shí)控制

      調(diào)時(shí)控制在不同的調(diào)節(jié)模式對(duì)不同時(shí)間進(jìn)行調(diào)整,我們分別以常態(tài)模式和調(diào)秒模式為例進(jìn)行分析。

      萬年歷時(shí)間調(diào)節(jié)要以當(dāng)時(shí)的時(shí)間為基礎(chǔ),常態(tài)模式下不需要調(diào)整任何時(shí)間,但是可以將實(shí)時(shí)時(shí)鐘讀出的時(shí)間數(shù)據(jù)賦給調(diào)節(jié)變量,這樣等跳轉(zhuǎn)到調(diào)節(jié)模式時(shí)對(duì)調(diào)節(jié)變量的控制就是以當(dāng)時(shí)的時(shí)間為基礎(chǔ)了,程序?qū)崿F(xiàn)如下:

      3'd0:       //正常模式
          begin
              if(O_pulse)begin  //在常態(tài)下按動(dòng)編碼器將當(dāng)前實(shí)時(shí)時(shí)間賦值給調(diào)節(jié)寄存器
                  adj_sec  <= rtc_sec;
                  adj_min  <= rtc_min;
                  adj_hour <= rtc_hour;
                  adj_week <= rtc_week;
                  adj_day  <= rtc_day;
                  adj_mon  <= rtc_mon;
                  adj_year <= rtc_year;
              end
          end

      調(diào)秒模式與其他調(diào)節(jié)模式操作一樣,不同的是調(diào)節(jié)的規(guī)則不同,例如秒和分的調(diào)節(jié)范圍為0~59,小時(shí)調(diào)節(jié)范圍0~11或0~23,日期調(diào)節(jié)范圍需要考慮年和月的值(1、3、5、7、8、10、12月范圍1~31,4、6、9、11月范圍1~30,2月平年范圍1~28,2月閏年范圍1~29),周調(diào)節(jié)范圍1~7,月調(diào)節(jié)范圍1~12,年調(diào)節(jié)范圍0~99。對(duì)秒鐘數(shù)據(jù)進(jìn)行調(diào)節(jié),程序?qū)崿F(xiàn)如下:

      3'd1:       //調(diào)秒模式
          begin
              if(L_pulse) begin    //逆時(shí)針轉(zhuǎn)
                  if(adj_sec[3:0]) adj_sec <= adj_sec - 1'h1;
                  else if(adj_sec[7:4]) adj_sec <= {adj_sec[7:4]-1'h1,4'h9};
                  else adj_sec <= 8'h59;
              end else if(R_pulse) begin    //順時(shí)針轉(zhuǎn)
                  if(adj_sec[3:0]!=4'h9) adj_sec <= adj_sec + 1'h1;
                  else if(adj_sec[7:4]!=4'h5) adj_sec <= {adj_sec[7:4]+1'h1,4'h0};
                  else adj_sec <= 8'h00;
              end else adj_sec <= adj_sec;
          end

      顯示控制

      首先來看看一下數(shù)碼管要顯示的效果,8位數(shù)碼管分兩頁顯示萬年歷數(shù)據(jù),第一頁顯示年月日周,第二頁顯示時(shí)分秒。

      萬年歷頁碼規(guī)劃

      我們看到任何一項(xiàng)時(shí)間選項(xiàng)都由兩位數(shù)碼管顯示,每頁最多顯示4個(gè)時(shí)間選項(xiàng),我們可以使用4位的變量dispen[3:0]控制4個(gè)時(shí)間選項(xiàng)的點(diǎn)亮或熄滅,dispen[3]控制最左側(cè)兩個(gè)數(shù)碼管,disp_en[0]控制最右側(cè)兩個(gè)數(shù)碼管,我們分別以常態(tài)模式和調(diào)秒模式為例進(jìn)行顯示使能控制的分析。

      常態(tài)模式下,轉(zhuǎn)動(dòng)編碼器控制顯示頁碼,兩個(gè)頁碼對(duì)應(yīng)的顯示控制,程序?qū)崿F(xiàn)如下:

      3'd0:   //正常模式
          if(L_pulse) disp_en <= 4'b1111;   //逆時(shí)針轉(zhuǎn)顯示第一頁,數(shù)碼管全亮
          else if(R_pulse) disp_en <= 4'b0111; //順時(shí)針轉(zhuǎn)顯示第二頁,時(shí)分秒亮
          else disp_en <= disp_en;

      調(diào)秒模式下,小時(shí)和分鐘數(shù)碼管點(diǎn)亮,秒鐘閃爍顯示,轉(zhuǎn)動(dòng)編碼器時(shí)秒鐘強(qiáng)制顯示,最后按動(dòng)旋轉(zhuǎn)編碼器切到常態(tài)模式時(shí),時(shí)分秒數(shù)碼管都回復(fù)顯示,程序?qū)崿F(xiàn)如下:

      3'd1: begin     //調(diào)秒模式
              disp_en[3:1] <= 3'b011; //時(shí)和分顯示
              if(L_pulse|R_pulse) disp_en[0] <= 1'b1; //轉(zhuǎn)動(dòng)時(shí)強(qiáng)制顯示
              else if(sec_pulse) disp_en[0] <= ~disp_en[0]; //秒鐘閃爍顯示
              else if(O_pulse) disp_en <= 4'b0111; //返回常態(tài)時(shí)顯示時(shí)分秒
              else disp_en[0] <= disp_en[0];
            end

      系統(tǒng)總體實(shí)現(xiàn)

      前面分析了顯示控制,主要對(duì)時(shí)間選項(xiàng)的點(diǎn)亮還是熄滅做控制,對(duì)應(yīng)到數(shù)碼管上就轉(zhuǎn)化成數(shù)碼管位的點(diǎn)亮和熄滅控制。另外還包含顯示數(shù)據(jù)的控制,而這部分設(shè)計(jì)我們放到頂層模塊中實(shí)現(xiàn)了,我們來分析一下。

      數(shù)碼管點(diǎn)亮控制

      數(shù)碼管與時(shí)間選項(xiàng)是對(duì)應(yīng)關(guān)系,每個(gè)選項(xiàng)對(duì)應(yīng)兩位數(shù)碼管,程序?qū)崿F(xiàn)如下:

      wire [7:0] data_en = {{2{disp_en[3]}},{2{disp_en[2]}},{2{disp_en[1]}},{2{disp_en[0]}}};    //數(shù)碼管位選控制     
      wire [7:0] dot_en  = {1'b0,disp_en[3],1'b0,disp_en[2],1'b0,disp_en[1],1'b0,disp_en[0]};    //數(shù)碼管小數(shù)點(diǎn)顯示控制

      數(shù)碼管內(nèi)容控制

      萬年歷的顯示分兩頁實(shí)現(xiàn),我們以最右側(cè)兩個(gè)數(shù)碼管顯示內(nèi)容為例,這兩位數(shù)碼管在第一頁中顯示周數(shù)據(jù),在第二頁中顯示秒數(shù)據(jù),那么我們?cè)趺纯刂骑@示內(nèi)容呢?分析,萬年歷8中模式,

      1.常態(tài)模式下,顯示讀取的實(shí)時(shí)時(shí)鐘數(shù)據(jù),具體顯示周還是秒再次細(xì)化

      • dispen等于4'b1111的時(shí)候,對(duì)應(yīng)第一頁,顯示周數(shù)據(jù) * dispen等于4'b0111的時(shí)候,對(duì)應(yīng)第二頁,顯示秒數(shù)據(jù)

      常態(tài)模式下,根據(jù)disp_en選擇顯示周數(shù)據(jù)還是秒數(shù)據(jù),程序?qū)崿F(xiàn)如下:

      wire [7:0] data_rtc0 = disp_en[3]? rtc_week:rtc_sec; //常態(tài)下數(shù)碼管顯示數(shù)據(jù)

      2.調(diào)節(jié)模式下,顯示寫入的調(diào)節(jié)時(shí)鐘數(shù)據(jù),具體顯示周還是秒再次細(xì)化

      • 調(diào)年、調(diào)月、調(diào)日、調(diào)周 狀態(tài)下(state>=3),對(duì)應(yīng)第一頁,顯示周數(shù)據(jù)
      • 調(diào)時(shí)、調(diào)分、調(diào)秒 狀態(tài)下(state<3),對(duì)應(yīng)第二頁,顯示秒數(shù)據(jù)

      調(diào)節(jié)模式下,根據(jù)state選擇顯示周數(shù)據(jù)還是秒數(shù)據(jù),程序?qū)崿F(xiàn)如下:

      wire [7:0] data_adj0 = state[2]? adj_week:adj_sec;  //調(diào)節(jié)狀態(tài)下數(shù)碼管顯示數(shù)據(jù)

      3.最后根據(jù)常態(tài)模式還是調(diào)節(jié)模式控制數(shù)碼管顯示實(shí)時(shí)時(shí)鐘數(shù)據(jù)還是調(diào)節(jié)時(shí)鐘數(shù)據(jù)

      根據(jù)state選擇顯示實(shí)時(shí)時(shí)鐘數(shù)據(jù)還是調(diào)節(jié)時(shí)鐘數(shù)據(jù),程序?qū)崿F(xiàn)如下:

      assign {data_7,data_8} = state? data_adj0:data_rtc3;  //根據(jù)狀態(tài)選擇顯示常態(tài)數(shù)據(jù)還是調(diào)節(jié)狀態(tài)數(shù)據(jù)

      綜合后的設(shè)計(jì)框圖如下:

      RTL設(shè)計(jì)框圖

      實(shí)驗(yàn)步驟

      1. 雙擊打開Quartus Prime工具軟件;
      2. 新建工程:File → New Project Wizard(工程命名,工程目錄選擇,設(shè)備型號(hào)選擇,EDA工具選擇);
      3. 新建文件:File → New → Verilog HDL File,鍵入設(shè)計(jì)代碼并保存;
      4. 設(shè)計(jì)綜合:雙擊Tasks窗口頁面下的Analysis & Synthesis對(duì)代碼進(jìn)行綜合;
      5. 管腳約束:Assignments → Assignment Editor,根據(jù)項(xiàng)目需求分配管腳;
      6. 設(shè)計(jì)編譯:雙擊Tasks窗口頁面下的Compile Design對(duì)設(shè)計(jì)進(jìn)行整體編譯并生成配置文件;
      7. 程序燒錄:點(diǎn)擊Tools → Programmer打開配置工具,Program進(jìn)行下載;
      8. 觀察設(shè)計(jì)運(yùn)行結(jié)果。

      將程序下載到中,按照設(shè)計(jì)要求的功能操作調(diào)節(jié)萬年歷的時(shí)間,觀察數(shù)碼管萬年歷顯示,如圖時(shí)間為18年6月27日,周三,19點(diǎn)15分14秒。

      實(shí)驗(yàn)現(xiàn)象

       

      實(shí)驗(yàn)現(xiàn)象



      評(píng)論


      相關(guān)推薦

      技術(shù)專區(qū)

      關(guān)閉