刚看完小梅哥的视频,花了几个钟头写成了作业,就两个功能,24小时计时和用串口设置时间。默认波特率为115200,上电开始从00:00:00计时,开发板是720,漏洞坑定有,还请各位指正。话不多说上代码,最下面还有工程的压缩包

这是最顶层文件


module digital_clock(clk,reset_n,sh_cp,st_cp,rx,ds);input clk;input reset_n;input rx;output sh_cp;output st_cp;output ds;reg [31:0] disp_data;reg [25:0] counter;parameter second_cnt = 26'h2FAF080;smg_top smg_top_demo(.clk(clk),.reset_n(reset_n),.sh_cp(sh_cp),.st_cp(st_cp),.ds(ds),.disp_data(disp_data));wire [7:0] data;wire rx_done;uart_byte_rx uart_byte_rx_demo(.clk(clk),.reset_n(reset_n),.baud_set(3'd4),.uart_rx(rx),.data_byte(data),.rx_done(rx_done)
);reg [1:0] set_done;reg [7:0]second;reg [7:0]minute;reg [7:0]hour;always@(posedge clk or negedge reset_n)beginif(!reset_n)set_done <= 0;else if(set_done == 2'd3)set_done <= 1'd0;else if(rx_done)set_done <= set_done + 1'd1;endalways@(posedge clk or negedge reset_n)beginif(!reset_n)counter <= 0;else if(counter == second_cnt - 1'b1)counter <= 0;elsecounter <= counter + 1'b1;  endreg clk_second;always@(posedge clk or negedge reset_n)begin//产生秒脉冲if(!reset_n)clk_second <= 1'b0;else if(counter == second_cnt - 1'b1)clk_second <= 1'b1;elseclk_second <= 1'b0;endalways@(posedge clk or negedge reset_n)beginif(!reset_n)second <= 8'd0;else if((rx_done )&&(set_done == 2'd2))second <= data;else if(clk_second)beginif((second[7:4] == 4'd5)&&(second[3:0] == 4'd9))beginsecond <=8'd0;endelse if(second[3:0] == 4'd9)beginsecond[7:4] <= second[7:4] + 1;second[3:0] <= 4'd0;endelsesecond[3:0] <= second[3:0] + 1'b1;endendalways@(posedge clk or negedge reset_n)beginif(!reset_n)minute <= 8'd0;else if((rx_done )&&(set_done == 2'd1))minute <= data;else if(clk_second)beginif((second[7:4] == 4'd5)&&(second[3:0] == 4'd9))beginif((minute[7:4]== 4'd5)&&(minute[3:0]== 4'd9))minute <= 8'd0;else if(minute[3:0] == 4'd9)beginminute[7:4] <= minute[7:4] + 1'b1;minute[3:0] <= 4'd0;end   elseminute[3:0] <= minute[3:0] + 1'b1;endendendalways@(posedge clk or negedge reset_n)beginif(!reset_n)hour <= 8'd0;else if((rx_done )&&(set_done == 2'd0))hour <= data;else if(clk_second)beginif((second[7:4] == 4'd5)&&(second[3:0] == 4'd9)&&(minute[7:4] == 4'd5)&&(minute[3:0] == 4'd9))beginif((hour[7:4]==4'd2)&&(hour[3:0] == 4'd3))hour <= 8'd0;else if(hour[3:0] == 4'd9)beginhour[3:0] <= 4'd0;hour[7:4] <= hour[7:4] + 1'b1;endelsehour[3:0] <= hour[3:0] + 1'b1;endendendalways@(posedge clk or negedge reset_n)beginif(!reset_n)disp_data <= 32'd0;else if(clk_second)disp_data <= {second[3:0],second[7:4],minute[3:0],minute[7:4],hour[3:0],hour[7:4],8'd0};end
endmodule

这是smg_top模块


module smg_top(clk,reset_n,sh_cp,st_cp,ds,disp_data);input clk;input reset_n;input [31:0]disp_data;output sh_cp;output st_cp;output ds;wire[7:0] sel;wire[7:0] seg;wire [15:0] data;assign data = {seg,sel};smg_dispaly smg_display_demo(.clk(clk),.reset_n(reset_n),.disp_data(disp_data),.sel(sel),.seg(seg));smg_hc595 smg_hc595_demo(.clk(clk),.reset_n(reset_n),.data(data),.sh_cp(sh_cp),.st_cp(st_cp),.en(1'b1),.ds(ds));
endmodule

这是smg译码和hc595驱动模块,都被例化在smg_top文件中


module smg_dispaly(clk,reset_n,disp_data,sel,seg);input clk;input reset_n;input [31:0] disp_data;//要现实的数据一共对应八位数码管的八位output reg [7:0] sel;//位选输出output reg [7:0] seg;//译码输出 a-h : seg[0]-seg[7]reg clk_div;reg [14:0]div_cnt;reg [2:0]num_cnt;always@(posedge clk or negedge reset_n)beginif(!reset_n)div_cnt <= 15'd0;else if(div_cnt == 24999)div_cnt <= 15'd0;elsediv_cnt <= div_cnt + 1'd1;endalways@(posedge clk or negedge reset_n)beginif(!reset_n)clk_div <= 1;else if(div_cnt == 24999)clk_div <= 1'b1;else clk_div <= 0;endalways@(posedge clk or negedge reset_n)beginif(!reset_n)num_cnt <= 0;else if(clk_div)num_cnt <= num_cnt + 1;endalways@(*)begincase(num_cnt)0: sel <= 8'b00000001;1: sel <= 8'b00000010;2: sel <= 8'b00000100;3: sel <= 8'b00001000;4: sel <= 8'b00010000;5: sel <= 8'b00100000;6: sel <= 8'b01000000;7: sel <= 8'b10000000;endcaseendreg [3:0]disp_temp;always@(*)begincase(num_cnt)0: disp_temp <= disp_data[31:28];1: disp_temp <= disp_data[27:24];2: disp_temp <= disp_data[23:20];3: disp_temp <= disp_data[19:16];4: disp_temp <= disp_data[15:12];5: disp_temp <= disp_data[11:8];6: disp_temp <= disp_data[7:4];7: disp_temp <= disp_data[3:0];endcaseendalways@(*)begincase(disp_temp)4'h0:  seg = 8'hc0;4'h1:    seg = 8'hf9;4'h2:    seg = 8'ha4;4'h3:    seg = 8'hb0;4'h4:    seg = 8'h99;4'h5:    seg = 8'h92;4'h6:    seg = 8'h82;4'h7:    seg = 8'hf8;4'h8:    seg = 8'h80;4'h9:    seg = 8'h90;4'ha: seg = 8'h88;4'hb: seg = 8'h83;4'hc: seg = 8'hc6;4'hd: seg = 8'ha1;4'he: seg =  8'h86;4'hf : seg =  8'h8e;endcaseend
endmodule

module smg_hc595(clk,reset_n,data,sh_cp,st_cp,en,ds);input clk;input reset_n;input [15:0] data;input en;output reg sh_cp;output reg st_cp;output reg ds;reg [5:0] shcp_edge_cnt;reg [15:0] r_data;always@(posedge clk)beginif(en)r_data <= data;endreg[2:0] div_cnt;always@(posedge clk or negedge reset_n)beginif(!reset_n)div_cnt <= 0;else  if(div_cnt == 1'b1)div_cnt <= 0;elsediv_cnt <= div_cnt + 1'b1;endwire sck;assign sck = (div_cnt == 1'b1);always@(posedge clk or negedge reset_n)beginif(!reset_n)shcp_edge_cnt <= 0;else if(sck)beginif(shcp_edge_cnt == 6'd32)shcp_edge_cnt <= 0;else shcp_edge_cnt <= shcp_edge_cnt + 1'b1;endelseshcp_edge_cnt <= shcp_edge_cnt;endalways@(posedge clk or negedge reset_n)beginif(!reset_n)beginsh_cp <= 1'b0;st_cp <= 1'b0;ds <= 1'b0;endelse begincase(shcp_edge_cnt)0:begin sh_cp <= 1'd0; ds <= r_data[15];end1:begin sh_cp <= 1'd1;st_cp <= 1'd0;end2:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[14];end3:sh_cp <= 1'd1;4:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[13];end5:sh_cp <= 1'd1;6:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[12];end7:sh_cp <= 1'd1;8:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[11];end9:sh_cp <= 1'd1;10:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[10];end11:sh_cp <= 1'd1;12:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[9];end13:sh_cp <= 1'd1;14:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[8];end15:sh_cp <= 1'd1;16:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[7];end17:sh_cp <= 1'd1;18:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[6];end19:sh_cp <= 1'd1;20:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[5];end21:sh_cp <= 1'd1;22:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[4];end23:sh_cp <= 1'd1;24:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[3];end25:sh_cp <= 1'd1;26:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[2];end27:sh_cp <= 1'd1;28:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[1];end29:sh_cp <= 1'd1;30:begin sh_cp <= 1'd0; st_cp <= 1'd0;ds <= r_data[0];end31:sh_cp <= 1'd1;32:st_cp <= 1'd1;default : begin sh_cp <= 1'b0;st_cp <= 1'b0;ds <= 1'b0;endendcase   endend
endmodule

最后的是串口接收模块,和smg_top一起被例化在digital_clock顶层文件中


module uart_byte_rx(clk,reset_n,baud_set,uart_rx,data_byte,rx_done
);assign reset=~reset_n;input clk;    //模块全局时钟输入,50Minput reset_n;   //复位信号输入,低有效input [2:0]baud_set;  //波特率设置input uart_rx;   //串口输入信号output [7:0]data_byte; //串口接收的1byte数据output rx_done;   //1byte数据接收完成标志reg [7:0]data_byte;reg rx_done;reg uart_rx_sync1;   //同步寄存器reg uart_rx_sync2;   //同步寄存器reg uart_rx_reg1;    //数据寄存器reg uart_rx_reg2;    //数据寄存器reg [15:0]bps_DR;    //分频计数最大值reg [15:0]div_cnt;   //分频计数器reg bps_clk;   //波特率时钟reg [7:0] bps_cnt;   //波特率时钟计数器reg uart_state;//接收数据状态wire uart_rx_nedge;  reg [2:0]START_BIT;reg [2:0]STOP_BIT;reg [2:0]data_byte_pre [7:0];//同步串行输入信号,消除亚稳态always@(posedge clk or posedge reset)if(reset)beginuart_rx_sync1 <= 1'b0;uart_rx_sync2 <= 1'b0;endelse beginuart_rx_sync1 <= uart_rx;uart_rx_sync2 <= uart_rx_sync1;end//数据寄存器always@(posedge clk or posedge reset)if(reset)beginuart_rx_reg1 <= 1'b0;uart_rx_reg2 <= 1'b0;endelse beginuart_rx_reg1 <= uart_rx_sync2;uart_rx_reg2 <= uart_rx_reg1;end//下降沿检测assign uart_rx_nedge = !uart_rx_reg1 & uart_rx_reg2;always@(posedge clk or posedge reset)if(reset)bps_DR <= 16'd324;else begincase(baud_set)0:bps_DR <= 16'd324;1:bps_DR <= 16'd162;2:bps_DR <= 16'd80;3:bps_DR <= 16'd53;4:bps_DR <= 16'd26;default:bps_DR <= 16'd324;      endcaseend//counteralways@(posedge clk or posedge reset)if(reset)div_cnt <= 16'd0;else if(uart_state)beginif(div_cnt == bps_DR)div_cnt <= 16'd0;elsediv_cnt <= div_cnt + 1'b1;endelsediv_cnt <= 16'd0;// bps_clk genalways@(posedge clk or posedge reset)if(reset)bps_clk <= 1'b0;else if(div_cnt == 16'd1)bps_clk <= 1'b1;elsebps_clk <= 1'b0;//bps counteralways@(posedge clk or posedge reset)if(reset)bps_cnt <= 8'd0;else if(bps_cnt == 8'd159 | (bps_cnt == 8'd12 && (START_BIT > 2)))bps_cnt <= 8'd0;else if(bps_clk)bps_cnt <= bps_cnt + 1'b1;elsebps_cnt <= bps_cnt;always@(posedge clk or posedge reset)if(reset)rx_done <= 1'b0;else if(bps_cnt == 8'd159)rx_done <= 1'b1;elserx_done <= 1'b0;   always@(posedge clk or posedge reset)if(reset)beginSTART_BIT <= 3'd0;data_byte_pre[0] <= 3'd0;data_byte_pre[1] <= 3'd0;data_byte_pre[2] <= 3'd0;data_byte_pre[3] <= 3'd0;data_byte_pre[4] <= 3'd0;data_byte_pre[5] <= 3'd0;data_byte_pre[6] <= 3'd0;data_byte_pre[7] <= 3'd0;STOP_BIT <= 3'd0;endelse if(bps_clk)begincase(bps_cnt)0:beginSTART_BIT <= 3'd0;data_byte_pre[0] <= 3'd0;data_byte_pre[1] <= 3'd0;data_byte_pre[2] <= 3'd0;data_byte_pre[3] <= 3'd0;data_byte_pre[4] <= 3'd0;data_byte_pre[5] <= 3'd0;data_byte_pre[6] <= 3'd0;data_byte_pre[7] <= 3'd0;STOP_BIT <= 3'd0;      end6 ,7 ,8 ,9 ,10,11:START_BIT <= START_BIT + uart_rx_sync2;22,23,24,25,26,27:data_byte_pre[0] <= data_byte_pre[0] + uart_rx_sync2;38,39,40,41,42,43:data_byte_pre[1] <= data_byte_pre[1] + uart_rx_sync2;54,55,56,57,58,59:data_byte_pre[2] <= data_byte_pre[2] + uart_rx_sync2;70,71,72,73,74,75:data_byte_pre[3] <= data_byte_pre[3] + uart_rx_sync2;86,87,88,89,90,91:data_byte_pre[4] <= data_byte_pre[4] + uart_rx_sync2;102,103,104,105,106,107:data_byte_pre[5] <= data_byte_pre[5] + uart_rx_sync2;118,119,120,121,122,123:data_byte_pre[6] <= data_byte_pre[6] + uart_rx_sync2;134,135,136,137,138,139:data_byte_pre[7] <= data_byte_pre[7] + uart_rx_sync2;150,151,152,153,154,155:STOP_BIT <= STOP_BIT + uart_rx_sync2;default:beginSTART_BIT <= START_BIT;data_byte_pre[0] <= data_byte_pre[0];data_byte_pre[1] <= data_byte_pre[1];data_byte_pre[2] <= data_byte_pre[2];data_byte_pre[3] <= data_byte_pre[3];data_byte_pre[4] <= data_byte_pre[4];data_byte_pre[5] <= data_byte_pre[5];data_byte_pre[6] <= data_byte_pre[6];data_byte_pre[7] <= data_byte_pre[7];STOP_BIT <= STOP_BIT;endendcaseendalways@(posedge clk or posedge reset)if(reset)data_byte <= 8'd0;else if(bps_cnt == 8'd159)begindata_byte[0] <= data_byte_pre[0][2];data_byte[1] <= data_byte_pre[1][2];data_byte[2] <= data_byte_pre[2][2];data_byte[3] <= data_byte_pre[3][2];data_byte[4] <= data_byte_pre[4][2];data_byte[5] <= data_byte_pre[5][2];data_byte[6] <= data_byte_pre[6][2];data_byte[7] <= data_byte_pre[7][2];endalways@(posedge clk or posedge reset)if(reset)uart_state <= 1'b0;else if(uart_rx_nedge)uart_state <= 1'b1;else if(rx_done || (bps_cnt == 8'd12 && (START_BIT > 2)) || (bps_cnt == 8'd155 && (STOP_BIT < 3)))uart_state <= 1'b0;elseuart_state <= uart_state;  endmodule

基于小梅哥的Xlinx FPGA开发视频的布置作业--用串口控制一个24小时数字钟相关推荐

  1. 基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程移植到自己做的板子上

    原程序是运行在小梅哥AC620开发板上的:基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程_ZLK1214的专栏-CSDN博客_小梅哥ac620[开发板]开发板型号:小梅哥AC620 ...

  2. FPGA系统性学习笔记连载_Day19【综合实验】之【数字钟】【Intel Cycle IV FPGA平台验证】

    FPGA系统性学习笔记连载_Day19[综合实验]之[数字钟][Intel Cycle IV FPGA平台验证] 本系列为FPGA系统性学习学员学习笔记整理分享,如有学习或者购买开发板意向,可加交流群 ...

  3. 基于SSH2做一个24小时订单分析表格

    基于SSH2做一个24小时订单分析表格 以下为要实现的最终效果截图: ps:没有时间优化前段页面样式,对前段美化有要求的小伙伴可以自行引用BOOtStrap.esayUi 或者 layUi 自行优化. ...

  4. 【小月电子】安路国产FPGA开发板系统学习教程-LESSON7串口通信

    串口通信例程讲解 若要观看该博客配套的视频教程,可点击此链接 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如非常简单的项目,我们可以 ...

  5. 【小月电子】ALTERA FPGA开发板系统学习教程-LESSON7串口通信

    串口通信例程讲解 若要观看该博客配套的视频教程,可点击此链接 开发板实物图 图1.FPGA设计流程 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中 ...

  6. 串行DAC——基于小梅哥AC620

    导读: DAC(Digital to Analog Conver ),是指将数字信号转变为模拟信号的电子元件. 分类: 电压型(TLV5618):常作为高速 DAC 使用. 电流型(AD7533): ...

  7. 毛姆《月亮与六便士》

    做自己最想做的事,生活在自己喜爱的环境里,淡薄宁静.与世无争,这难道是糟蹋自己吗?与此相反,做一个著名的外科医生,年薪一万镑,娶一位美丽的妻子,就是成功吗?我想,这一切都取决于一个人如何看待生活的意义 ...

  8. 【SoC FPGA学习】一、AC501-SOC FPGA开发板介绍

       少一些功利主义的追求,多一些不为什么的坚持. [SoC FPGA开发常见问题合集]SoC FPGA开发过程中常见问题   本系列学习笔记基于小梅哥SOC Cyclone V SoC开发板. 一. ...

  9. CASE_02 基于FPGA的数字钟万年历

             该系类博客序言和资源简介可浏览该博客:PREFACE FPGA经典案例序言 快速了解该系列博客的内容与可用 资源. 目录 1 简介 2 数字钟计数方案 2.1 计数方案一 2.2 计 ...

最新文章

  1. [centos][ntp][administrator] chrony ntp
  2. 博客转移至 https://www.babac.cn/
  3. arcgis 获取json经纬度_干货|ArcGIS的矢量化操作——ArcGis中进行地形图的配准
  4. 前端用sql 还是mysql_前端小白安装MySQL的踩坑路
  5. Oracle对表的基本操作
  6. 从JAVA内存到垃圾回收,带你深入理解JVM
  7. 真人拳皇项目第七次Scrum总结——史经浩
  8. Python之路--协程/IO多路复用
  9. 热文:if(a==1且a==2且a==3),有没有可能为true?
  10. Js中去除数组中重复元素的4种方法
  11. proteus三输入与非门名字_商标取名大全-有创意的2020商标名字大全
  12. java 全排列非递归算法_我的字典序全排列java程序,怎么改成非递归算法
  13. wxpython学习笔记
  14. mysql转储表_Mysql导出表结构及表数据 mysqldump用法
  15. oracle startup open ora 03113,Oracle 11g startup时报ORA-03113通信通道的文件结尾
  16. 计算机专业认识实习目的,计算机专业实习目的与意义
  17. php特殊字体生成,生成艺术字体图片水印代码_PHP教程
  18. 百度智能云服务网格产品 CSM 发布 | 火热公测中
  19. 淘宝API接口:item_search - 按关键字搜索淘宝商品
  20. node项目部署到云服务器

热门文章

  1. Eclipse汉化教程2021年最新
  2. 【docker】解决docker启动centos镜像不成功问题
  3. 用c++实现3d引擎-超详细(附源码)
  4. PPT的逻辑思考方式
  5. 论文笔记:Sequential Recommendation with Relation-Aware Kernelized Self-Attention
  6. 免费crm系统能帮企业解决什么问题?
  7. linespace. matlab,Matlab基础
  8. mysql workbench 显示查询结果_MySQLWorkbench如何导出查询结果?(图文)
  9. 一楼二楼教师办公室图书馆操场计算机房,新PEP人教版四年级英语下册常用单词、常用表达法默写用纸...
  10. .入职薪水10K,每年涨幅5%,50年后工资多少?