0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在HLS中描述數(shù)字時鐘?

OpenFPGA ? 來源:OpenFPGA ? 2023-06-12 09:01 ? 次閱讀

緒論

該項目的目標是展示 HLS 在設(shè)計數(shù)字系統(tǒng)方面的能力。為此,本文展示如何在 HLS 中描述數(shù)字時鐘。

時鐘在 7 段數(shù)碼管上顯示小時、分鐘和秒。

1442a2fa-08b9-11ee-962d-dac502259ad0.png

它有兩種操作模式:時鐘和設(shè)置。時鐘模式是標準模式,在此模式下,當前時間顯示在數(shù)碼管上。在設(shè)置模式下,可以使用按鈕設(shè)置時間。

下圖顯示開發(fā)板上的時鐘配置。

147375ba-08b9-11ee-962d-dac502259ad0.png

如下圖所示,該設(shè)計主要分為三個模塊:秒時鐘發(fā)生器、數(shù)字時鐘引擎和顯示驅(qū)動。

1495eece-08b9-11ee-962d-dac502259ad0.png

下面的流水線循環(huán)用于實現(xiàn)秒時鐘發(fā)生器。

booldelay(longlongintn){
#pragmaHLSINLINEoff
staticbooldummy=0;
for(longlongintj=0;j

數(shù)字時鐘引擎主要是跟蹤小時、分鐘和秒,并在收到來自秒時鐘發(fā)生器模塊的時鐘節(jié)拍時更新它們。以下代碼完成上訴功能。

voiddebounce(boolpulse,bool&out){
#pragmaHLSINLINEoff
staticboolout0=0;
staticboolout1=0;
staticboolout2=0;
staticboolstate=0;
if(state==0){
out2=out1;
out1=out0;
out0=pulse;
state=1;
}else{
delay(2500000);
state=0;
}
out=out0&out1&out2;
}
voidset_time(
ap_uint<6>&seconds,
ap_uint<6>&minutes,
ap_uint<5>&hours,
boolset_second,
boolset_minute,
boolset_hour)
{
//--------------------------------------------------
staticboolsecond_state=0;
if(second_state==0&&set_second==1){
seconds++;
if(seconds==60){
seconds=0;
}
second_state=1;
}
if(second_state==1&&set_second==0){
second_state=0;
}
//---------------------------------------------------
staticboolminute_state=0;
if(minute_state==0&&set_minute==1){
minutes++;
if(minutes==60){
minutes=0;
}
minute_state=1;
}
if(minute_state==1&&set_minute==0){
minute_state=0;
}
//----------------------------------------------------
staticboolhour_state=0;
if(hour_state==0&&set_hour==1){
hours++;
if(hours==24){
hours=0;
}
hour_state=1;
}
if(hour_state==1&&set_hour==0){
hour_state=0;
}
//----------------------------------------------------
}
voidclock_ticking(
ap_uint<5>&hours,
ap_uint<6>&minutes,
ap_uint<6>&seconds)
{
seconds++;
if(seconds==60){
seconds=0;
minutes++;
if(minutes==60){
minutes=0;
hours++;
if(hours==24)
hours=0;
}
}
}
voiddigital_clock(
boolset_time_sw,
bool&set_time_led,
boolset_second,
boolset_minute,
boolset_hour,
boolone_second_delay,
ap_uint<6>&seconds_out,
ap_uint<6>&minutes_out,
ap_uint<5>&hours_out
)
{
#pragmaHLSINTERFACEap_noneport=set_time_sw
#pragmaHLSINTERFACEap_noneport=set_time_led
#pragmaHLSINTERFACEap_noneport=set_minute
#pragmaHLSINTERFACEap_noneport=set_hour
#pragmaHLSINTERFACEap_noneport=seconds_out
#pragmaHLSINTERFACEap_noneport=minutes_out
#pragmaHLSINTERFACEap_noneport=hours_out
#pragmaHLSINTERFACEap_ctrl_noneport=return
staticap_uint<6>seconds=0;
staticap_uint<6>minutes=0;
staticap_uint<5>hours=0;
ap_uint<8>segment_data;
ap_uint<8>segment_enable;
staticboolstate_clock=0;
boolone_second=one_second_delay;
boolset_time_flag=set_time_sw;
if(one_second==1&&set_time_flag==0&&state_clock==0){
clock_ticking(hours,minutes,seconds);
state_clock=1;
}
if(one_second==0&&set_time_flag==0&&state_clock==1){
state_clock=0;
}
if(set_time_flag==1){
boolset_minute_debounce;
boolset_hour_debounce;
boolset_second_debounce;
debounce(set_minute,set_minute_debounce);
debounce(set_hour,set_hour_debounce);
debounce(set_second,set_second_debounce);
set_time(seconds,minutes,hours,set_second_debounce,set_minute_debounce,set_hour_debounce);
}
seconds_out=seconds;
minutes_out=minutes;
hours_out=hours;
set_time_led=set_time_sw;
}

最后一個 HLS 代碼在 7 段數(shù)碼管上顯示當前時間。

#include
constap_uint<8>seven_segment_code[10]={
0b11000000,
0b11111001,
0b10100100,
0b10110000,
0b10011001,
0b10010010,
0b10000010,
0b11111000,
0b10000000,
0b10010000
};
booldelay(longlongintn){
#pragmaHLSINLINEoff
staticbooldummy=0;
for(longlongintj=0;jhours,
ap_uint<6>minutes,
ap_uint<6>seconds,
ap_uint<8>&seven_segment_data,
ap_uint<8>&seven_segment_enable)
{
#pragmaHLSINTERFACEap_noneport=hours
#pragmaHLSINTERFACEap_noneport=minutes
#pragmaHLSINTERFACEap_noneport=seconds
#pragmaHLSINTERFACEap_noneport=seven_segment_data
#pragmaHLSINTERFACEap_noneport=seven_segment_enable
#pragmaHLSINTERFACEap_ctrl_noneport=return
ap_uint<4>second_digit_1=seconds%10;
ap_uint<4>second_digit_2=seconds/10;
ap_uint<4>minute_digit_1=minutes%10;
ap_uint<4>minute_digit_2=minutes/10;
ap_uint<4>hours_digit_1=hours%10;
ap_uint<4>hours_digit_2=hours/10;
ap_uint<8>segment_data;
ap_uint<8>segment_enable;
staticap_uint<3>state=0;
switch(state){
//second
case0:
segment_data=seven_segment_code[second_digit_1];
segment_enable=0b11111110;
delay(250000L);
state=1;
break;
case1:
segment_data=seven_segment_code[second_digit_2];
segment_enable=0b11111101;
state=2;
delay(250000L);
break;
//minutes
case2:
segment_data=seven_segment_code[minute_digit_1];
segment_enable=0b11110111;
state=3;
delay(250000L);
break;
case3:
segment_data=seven_segment_code[minute_digit_2];
segment_enable=0b11101111;
state=4;
delay(250000L);
break;
//hours
case4:
segment_data=seven_segment_code[hours_digit_1];
segment_enable=0b10111111;
state=5;
delay(250000L);
break;
case5:
segment_data=seven_segment_code[hours_digit_2];
segment_enable=0b01111111;
state=0;
delay(250000L);
break;
default:
segment_data=seven_segment_code[0];
segment_enable=0b11111111;
state=0;
delay(250000L);
break;
}
seven_segment_data=segment_data;
seven_segment_enable=segment_enable;
}

綜合這些代碼后,使用 Vivado 工具將它們連接在一起并生成 FPGA 比特流。

14b36ef4-08b9-11ee-962d-dac502259ad0.png

對電路板編程后,可以看到下圖:

14c874f2-08b9-11ee-962d-dac502259ad0.gif





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1624

    文章

    21542

    瀏覽量

    600549
  • 數(shù)碼管
    +關(guān)注

    關(guān)注

    32

    文章

    1872

    瀏覽量

    90732
  • 時鐘發(fā)生器
    +關(guān)注

    關(guān)注

    1

    文章

    191

    瀏覽量

    67177
  • 數(shù)字時鐘
    +關(guān)注

    關(guān)注

    2

    文章

    149

    瀏覽量

    20287
  • HLS
    HLS
    +關(guān)注

    關(guān)注

    1

    文章

    128

    瀏覽量

    23968

原文標題:HLS 設(shè)計數(shù)字時鐘

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    HLS組合電路對設(shè)計的影響

    該項目通過一個示例演示了 HLS 組合電路對設(shè)計的影響。
    的頭像 發(fā)表于 11-03 09:04 ?682次閱讀
    <b class='flag-5'>HLS</b><b class='flag-5'>中</b>組合電路對設(shè)計的影響

    何在HLS 14.3編寫pow功能?

    嗨? 如何在HLS 14.3編寫pow功能? HLS 14.3不支持exp和pow功能。我在我的代碼寫了“#include math.h
    發(fā)表于 03-05 13:40

    合成的Vivado HLS的Pragma錯誤怎么解決

    模擬過程完成沒有0錯誤,但在合成期間顯示錯誤。我無法找到錯誤。我在合成期間在HLS工具收到這樣的錯誤“在E包含的文件:/thaus / fact_L / facoriall
    發(fā)表于 05-21 13:58

    【正點原子FPGA連載】第一章HLS簡介-領(lǐng)航者ZYNQ之HLS 開發(fā)指南

    的ARM處理器或MicroBlaze軟核處理器)的軟件代碼是截然不同的。在HLS,所有的C設(shè)計都是要在可編程邏輯實現(xiàn)的,也就是說,我們?nèi)匀皇窃谶M行硬件設(shè)計,只不過使用的不再是硬件
    發(fā)表于 10-10 16:44

    數(shù)字時鐘設(shè)計功能描述

    數(shù)字時鐘設(shè)計功能描述1、初始化1)關(guān)閉蜂鳴器、繼電器等無關(guān)外設(shè);2)DS1302設(shè)備初始化時鐘為 23 時 59 分 50 秒。2、顯示功能3、按鍵功能1)按鍵 S4 定義為
    發(fā)表于 02-18 06:09

    FPGA高層次綜合HLS之Vitis HLS知識庫簡析

    1、HLS最全知識庫介紹高層次綜合(High-level Synthesis)簡稱HLS,指的是將高層次語言描述的邏輯結(jié)構(gòu),自動轉(zhuǎn)換成低抽象級語言描述的電路模型的過程。對于AMD Xi
    發(fā)表于 09-07 15:21

    使用Vitis HLS創(chuàng)建屬于自己的IP相關(guān)資料分享

    1、使用Vitis HLS創(chuàng)建屬于自己的IP高層次綜合(High-level Synthesis)簡稱HLS,指的是將高層次語言描述的邏輯結(jié)構(gòu),自動轉(zhuǎn)換成低抽象級語言描述的電路模型的過
    發(fā)表于 09-09 16:45

    Vivado環(huán)境下如何在IP Integrator中正確使用HLS IP

    testbench來驗證設(shè)計。 Integrate帶有Xilinx IP Block的 HLS IP 這里展示了在IP Integrator,如何將兩個HLS IP blocks跟Xilinx IP FFT結(jié)合在一起 ,并且
    發(fā)表于 02-07 17:59 ?4357次閱讀
    Vivado環(huán)境下如<b class='flag-5'>何在</b>IP Integrator中正確使用<b class='flag-5'>HLS</b> IP

    HLS系列–High Level Synthesis(HLS)的端口綜合2

    Interface:內(nèi)存訪問型的端口協(xié)議 接下來的幾章,我們重點介紹下AXI接口類型如何在HLS實現(xiàn),首先看Lite端口: AXI-Lite端口的實現(xiàn) 使用Vivado HLS的A
    發(fā)表于 02-08 03:27 ?558次閱讀
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口綜合2

    FPGA設(shè)計HLS 工具應用

    HLS,高層綜合)。這個工具直接使用C、C++或SystemC 開發(fā)的高層描述來綜合數(shù)字硬件,這樣就不再需要人工做出用于硬件的設(shè)計,像是VHDL 或Verilog 這樣的文件,而是由HLS
    發(fā)表于 06-04 01:43 ?7353次閱讀
    FPGA設(shè)計<b class='flag-5'>中</b>的<b class='flag-5'>HLS</b> 工具應用

    關(guān)于Vivado HLS錯誤理解

    盡管 Vivado HLS支持C、C++和System C,但支持力度是不一樣的。在v2017.4版本ug871 第56頁有如下描述??梢姡斣O(shè)計如果使用到任意精度的數(shù)據(jù)類型時,采用C++ 和System C 是可以使用Viv
    的頭像 發(fā)表于 07-29 11:07 ?5433次閱讀
    關(guān)于Vivado <b class='flag-5'>HLS</b>錯誤理解

    何在Vitis HLS中使用C語言代碼創(chuàng)建AXI4-Lite接口

    在本教程,我們將來聊一聊有關(guān)如何在 Vitis HLS 中使用 AXI4-Lite 接口創(chuàng)建定制 IP 的基礎(chǔ)知識。
    的頭像 發(fā)表于 09-13 10:04 ?6331次閱讀
    如<b class='flag-5'>何在</b>Vitis <b class='flag-5'>HLS</b>中使用C語言代碼創(chuàng)建AXI4-Lite接口

    詳解數(shù)字設(shè)計時鐘與約束

    數(shù)字設(shè)計時鐘與約束 本文作者 IClearner 在此特別鳴謝 最近做完了synopsys的DC workshop,涉及到時鐘的建模/約束,這里就來聊聊
    的頭像 發(fā)表于 01-28 07:53 ?2795次閱讀
    詳解<b class='flag-5'>數(shù)字</b>設(shè)計<b class='flag-5'>中</b>的<b class='flag-5'>時鐘</b>與約束

    HLS協(xié)議實現(xiàn)

    HLS,Http Live Streaming 是由Apple公司定義的用于實時流傳輸?shù)膮f(xié)議,HLS基于HTTP協(xié)議實現(xiàn),傳輸內(nèi)容包括兩部分,一是M3U8描述文件,二是TS媒體文件。
    的頭像 發(fā)表于 04-06 09:29 ?751次閱讀

    何在Vitis HLS GUI中使用庫函數(shù)?

    Vitis? HLS 2023.1 支持新的 L1 庫向?qū)?,本文將講解如何下載 L1 庫、查看所有可用功能以及如何在 Vitis HLS GUI 中使用庫函數(shù)。
    的頭像 發(fā)表于 08-16 10:26 ?1051次閱讀
    如<b class='flag-5'>何在</b>Vitis <b class='flag-5'>HLS</b> GUI中使用庫函數(shù)?