0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OpenFPGA 来源:OpenFPGA 2023-06-12 09:01 次阅读

绪论

该项目的目标是展示 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





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1602

    文章

    21320

    浏览量

    593194
  • 数码管
    +关注

    关注

    31

    文章

    1827

    浏览量

    89948
  • 时钟发生器
    +关注

    关注

    1

    文章

    169

    浏览量

    66965
  • 数字时钟
    +关注

    关注

    2

    文章

    144

    浏览量

    20118
  • HLS
    HLS
    +关注

    关注

    1

    文章

    126

    浏览量

    23683

原文标题:HLS 设计数字时钟

文章出处:【微信号:Open_FPGA,微信公众号:OpenFPGA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于HLS之任务级并行编程

      HLS任务级编程第一篇文章可看这里: HLS之任务级并行编程 HLS的任务级并行性(Task-level Parallelism)分为两种:一种是控制驱动型;一种是数据驱动型。对于控制驱动
    的头像 发表于 07-27 09:22 794次阅读
    基于<b class='flag-5'>HLS</b>之任务级并行编程

    何在HLS 14.3编写pow功能?

    嗨〜 如何在HLS 14.3编写pow功能? HLS 14.3不支持exp和pow功能。我在我的代码写了“#include math.h
    发表于 03-05 13:40

    何在AISGEN设置EMIFA的时钟以及时序?

    1 页花费的时间相差4倍;1.AISgenD800K008软件的具体配置如下:想知道,其中,哪些设置是有关nand emifa接口时钟,时序设置的?2.手册EMIFA 时钟描述
    发表于 09-25 07:02

    合成的Vivado HLS的Pragma错误怎么解决

    模拟过程完成没有0错误,但在合成期间显示错误。我无法找到错误。我在合成期间在HLS工具收到这样的错误“在E包含的文件:/thaus / fact_L / facoriall
    发表于 05-21 13:58

    【正点原子FPGA连载】第一章HLS简介-领航者ZYNQ之HLS 开发指南

    的ARM处理器或MicroBlaze软核处理器)的软件代码是截然不同的。在HLS,所有的C设计都是要在可编程逻辑实现的,也就是说,我们仍然是在进行硬件设计,只不过使用的不再是硬件
    发表于 10-10 16:44

    vivado高层次综合HLS定义及挑战

    数字电路(digitalcircuits)的过程里,这个数字电路可以在高级规范的制造过程合成。这个术语是行为和电子系统的结合:是一门技术,也是一门科学,它把设计意图抽象化,抽象视图可以自动地将人类
    发表于 07-06 08:00

    HLS高阶综合的定义与解决办法

    数字电路(digitalcircuits)的过程里,这个数字电路可以在高级规范的制造过程合成。这个术语是行为和电子系统的结合:是一门技术,也是一门科学,它把设计意图抽象化,抽象视图可以自动地将人类
    发表于 07-10 08:00

    数字时钟设计功能描述

    数字时钟设计功能描述1、初始化1)关闭蜂鸣器、继电器等无关外设;2)DS1302设备初始化时钟为 23 时 59 分 50 秒。2、显示功能3、按键功能1)按键 S4 定义为
    发表于 02-18 06:09

    FPGA高层次综合HLS之Vitis HLS知识库简析

    1、HLS最全知识库介绍高层次综合(High-level Synthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。对于AMD Xi
    发表于 09-07 15:21

    使用Vitis HLS创建属于自己的IP相关资料分享

    1、使用Vitis HLS创建属于自己的IP高层次综合(High-level Synthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过
    发表于 09-09 16:45

    嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(4)

    ) xapp890-zynq-sobel-vivado-hls.pdf5.1 HLS 工程说明(1) 时钟HLS 工程配置的时钟为 100M
    发表于 01-01 23:46

    嵌入式HLS 案例开发步骤分享——基于Zynq-7010/20工业开发板(4)

    ) xapp890-zynq-sobel-vivado-hls.pdf 5.1 HLS 工程说明(1) 时钟HLS 工程配置的时钟为 100
    发表于 08-24 14:54

    何在Vitis HLS中使用C语言代码创建AXI4-Lite接口

    在本教程中,我们将来聊一聊有关如何在 Vitis HLS 中使用 AXI4-Lite 接口创建定制 IP 的基础知识。
    的头像 发表于 09-13 10:04 6026次阅读
    如<b class='flag-5'>何在</b>Vitis <b class='flag-5'>HLS</b>中使用C语言代码创建AXI4-Lite接口

    HLS协议实现

    HLS,Http Live Streaming 是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一是M3U8描述文件,二是TS媒体文件。
    的头像 发表于 04-06 09:29 481次阅读

    何在Vitis HLS GUI中使用库函数?

    Vitis™ HLS 2023.1 支持新的 L1 库向导,本文将讲解如何下载 L1 库、查看所有可用功能以及如何在 Vitis HLS GUI 中使用库函数。
    的头像 发表于 08-16 10:26 620次阅读
    如<b class='flag-5'>何在</b>Vitis <b class='flag-5'>HLS</b> GUI中使用库函数?