全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 可编程逻辑 >

如何在HLS中描述数字时钟?

时间:2023-06-12 09:01

人气:

作者:admin

标签: HLS  数字时钟 

导读:它有两种操作模式:时钟和设置。时钟模式是标准模式,在此模式下,当前时间显示在数码管上。...

绪论

该项目的目标是展示 HLS 在设计数字系统方面的能力。为此,本文展示如何在 HLS 中描述数字时钟

时钟在 7 段数码管上显示小时、分钟和秒。

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

它有两种操作模式:时钟和设置。时钟模式是标准模式,在此模式下,当前时间显示在数码管上。在设置模式下,可以使用按钮设置时间。

下图显示开发板上的时钟配置。

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

如下图所示,该设计主要分为三个模块:秒时钟发生器、数字时钟引擎和显示驱动。

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

下面的流水线循环用于实现秒时钟发生器。

booldelay(longlongintn){
#pragmaHLSINLINEoff
staticbooldummy=0;
for(longlongintj=0;j< n; j++) {
#pragma HLS pipeline
dummy = !dummy;
}
return dummy;
}
void one_second_clock_generator(bool &second) {
#pragma HLS INTERFACE ap_none port=second
#pragma HLS INTERFACE ap_ctrl_none port=return
static bool s = 0;
s=!s;
second = s;
delay(50000000L);
}

数字时钟引擎主要是跟踪小时、分钟和秒,并在收到来自秒时钟发生器模块的时钟节拍时更新它们。以下代码完成上诉功能。

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 段数码管上显示当前时间。

#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;j< n; j++) {
#pragma HLS pipeline
dummy = !dummy;
}
return dummy;
}
void seven_segment_display(
ap_uint<5>hours,
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





审核编辑:刘清

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信