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

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

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

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

OpenFPGA ? 來(lái)源:OpenFPGA ? 2023-06-12 09:01 ? 次閱讀

緒論

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

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

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

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

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

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

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

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

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

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

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

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;
}

最后一個(gè) HLS 代碼在 7 段數(shù)碼管上顯示當(dāng)前時(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

對(duì)電路板編程后,可以看到下圖:

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





審核編輯:劉清

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

    關(guān)注

    1629

    文章

    21736

    瀏覽量

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

    關(guān)注

    32

    文章

    1882

    瀏覽量

    91122
  • 時(shí)鐘發(fā)生器

    關(guān)注

    1

    文章

    200

    瀏覽量

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

    關(guān)注

    2

    文章

    150

    瀏覽量

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

    關(guān)注

    1

    文章

    129

    瀏覽量

    24113

原文標(biāo)題:HLS 設(shè)計(jì)數(shù)字時(shí)鐘

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    何在HLS 14.3編寫pow功能?

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

    合成的Vivado HLS的Pragma錯(cuò)誤怎么解決

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

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

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

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

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

    FPGA高層次綜合HLS之Vitis HLS知識(shí)庫(kù)簡(jiǎn)析

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

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

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

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

    testbench來(lái)驗(yàn)證設(shè)計(jì)。 Integrate帶有Xilinx IP Block的 HLS IP 這里展示了在IP Integrator,如何將兩個(gè)HLS IP blocks跟Xilinx IP FFT結(jié)合在一起 ,并且
    發(fā)表于 02-07 17:59 ?4408次閱讀
    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)存訪問(wèn)型的端口協(xié)議 接下來(lái)的幾章,我們重點(diǎn)介紹下AXI接口類型如何在HLS實(shí)現(xiàn),首先看Lite端口: AXI-Lite端口的實(shí)現(xiàn) 使用Vivado HLS的A
    發(fā)表于 02-08 03:27 ?578次閱讀
    <b class='flag-5'>HLS</b>系列–High Level Synthesis(<b class='flag-5'>HLS</b>)的端口綜合2

    FPGA設(shè)計(jì)HLS 工具應(yīng)用

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

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

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

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

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

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

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

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

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

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

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