数据生成模块

module data_gen
#(parameter CNT_MAX = 23'd4999_999 ,parameter DATA_MAX = 20'd999_999
)
(   input    wire         sys_clk     ,input    wire         sys_rst_n   ,output   reg   [19:0] data        ,output   wire  [5:0]  point       ,output   wire         sign        ,output   reg          seg_en      );reg [22:0] cnt_100ms;
reg cnt_flag ;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_100ms <= 23'd0;else if(cnt_100ms == CNT_MAX)cnt_100ms <= 23'd0;elsecnt_100ms <= 1'b1 + cnt_100ms;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_flag <= 1'b0;else if (cnt_100ms == CNT_MAX - 1)cnt_flag <= 1'b1;else cnt_flag <= 1'b0;    always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)data <= 20'd0;else if((data == DATA_MAX)&&(cnt_flag == 1'b1))data <= 20'd0;else if(cnt_flag == 1'b1)data <= data + 1'b1;else data <= data;assign point = 6'b000_000;
assign sign  = 1'b0;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)seg_en <= 1'b0;else seg_en <= 1'b1;endmodule         
`timescale 1ns/1ns
module tb_data_gen();reg   sys_clk     ;
reg   sys_rst_n   ;wire [19:0] data   ;
wire [5:0]  point  ;
wire        sign   ;
wire        seg_en ;initial begin sys_clk =1'b1;sys_rst_n <= 1'b0;#20 sys_rst_n <= 1'b1;endalways #10 sys_clk = ~sys_clk;data_gen
#(.CNT_MAX (9)   ,.DATA_MAX(9)
)
data_gen_inst
(.sys_clk   (sys_clk  ) , .sys_rst_n (sys_rst_n) ,.data  (data  ),.point (point ),.sign  (sign  ),.seg_en(seg_en));
endmodule

计数器 cnt_flag

data

加入BCD码模块

module bcd_8421
(input       sys_clk     ,input       sys_rst_n   ,input wire [19:0] data  ,output reg [3:0] unit  ,output reg [3:0] ten   ,output reg [3:0] hun   , output reg [3:0] tho   ,output reg [3:0] t_tho ,output reg [3:0] h_hun
);
reg [4:0]   cnt_shift;
reg [43:0]  data_shift;
reg         shift_flag;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_shift <= 5'd0;else if ((cnt_shift == 5'd21)&&(shift_flag == 1'b1))cnt_shift <= 5'd0;else if(shift_flag == 1'b1)cnt_shift <= cnt_shift + 1'b1;else cnt_shift <= cnt_shift ;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0) data_shift <= 44'b0;else if(cnt_shift == 5'd0)data_shift <= {24'b0,data};else if((cnt_shift <= 20)&&(shift_flag ==1'b0))begindata_shift[23:20] <= (data_shift[23:20] > 4) ? (data_shift[23:20] + 2'd3) : (data_shift[23:20]);data_shift[27:24] <= (data_shift[27:24] > 4) ? (data_shift[27:24] + 2'd3) : (data_shift[27:24]);data_shift[31:28] <= (data_shift[31:28] > 4) ? (data_shift[31:28] + 2'd3) : (data_shift[31:28]);data_shift[35:32] <= (data_shift[35:32] > 4) ? (data_shift[35:32] + 2'd3) : (data_shift[35:32]);data_shift[39:36] <= (data_shift[39:36] > 4) ? (data_shift[39:36] + 2'd3) : (data_shift[39:36]);data_shift[43:40] <= (data_shift[43:40] > 4) ? (data_shift[43:40] + 2'd3) : (data_shift[43:40]);endelse if((cnt_shift <= 20)&&(shift_flag ==1'b1))data_shift <= data_shift << 1;else    data_shift <= data_shift ;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)     shift_flag <= 1'b0;else shift_flag <= ~shift_flag;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)     beginunit   <= 4'b0;ten    <= 4'b0;hun    <= 4'b0;tho    <= 4'b0;t_tho  <= 4'b0;h_hun  <= 4'b0;endelse if(cnt_shift == 5'd21)beginunit   <= data_shift[23:20];ten    <= data_shift[27:24];hun    <= data_shift[31:28];tho    <= data_shift[35:32];t_tho  <= data_shift[39:36];h_hun  <= data_shift[43:40];end
endmodule
`timescale 1ns/1ns
module tb_bcd_8421();
reg     sys_clk;
reg     sys_rst_n;
reg [19:0] data;
wire [3:0] unit   ;
wire [3:0] ten    ;
wire [3:0] hun    ;
wire [3:0] tho    ;
wire [3:0] t_tho  ;
wire [3:0] h_hun  ;
initial begin sys_clk =1'b1;sys_rst_n <= 1'b0;data <= 20'd0;#30 sys_rst_n <= 1'b1;data <= 20'd123_456;#3000data <= 20'd654_321;#3000data <= 20'd987_654;#3000data <= 20'd999_999;endalways #10 sys_clk = ~sys_clk;bcd_8421 bcd_8421_inst
(.  sys_clk   ( sys_clk   ) ,.  sys_rst_n ( sys_rst_n ) ,. data       (data       ) ,. unit       (unit       ) ,. ten        (ten        ) ,. hun        (hun        ) , . tho        (tho        ) ,. t_tho      (t_tho      ) ,. h_hun      (h_hun      )
);
endmodule

cnt_shift

 

动态显示模块

module seg_dynamic
(   input   wire    sys_clk     ,input   wire    sys_rst_n   ,input   wire [19:0] data    ,input   wire [5:0]  point   ,input   wire        sign    ,input   wire        seg_en  ,output reg [5:0]   sel     ,output reg [7:0]   seg
);parameter CNT_MAX = 16'd49_999;wire     [3:0]   unit;
wire     [3:0]   ten ;
wire     [3:0]   hun ;
wire     [3:0]   tho ;
wire     [3:0]   t_tho;
wire     [3:0]   h_hun;
reg     [23:0]  data_reg;
reg     [15:0]  cnt_1ms;
reg             flag_1ms;
reg     [2:0]   cnt_sel;
reg     [5:0]   sel_reg;
reg     [3:0]   data_disp;
reg             dot_disp;    always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0) data_reg <= 24'b0;else if((h_hun)||(point[5]))data_reg <= {h_hun,t_tho,tho,hun,ten,unit};else if(((t_tho)||(point[4]))&&(sign == 1'b1))data_reg <= {4'd10,t_tho,tho,hun,ten,unit};else if(((t_tho)||(point[4]))&&(sign == 1'b0))data_reg <= {4'd11,t_tho,tho,hun,ten,unit};else if(((tho)||(point[3]))&&(sign == 1'b1))data_reg <= {4'd11,4'd10,tho,hun,ten,unit};else if(((tho)||(point[3]))&&(sign == 1'b0))data_reg <= {4'd11,4'd11,tho,hun,ten,unit};  else if(((hun)||(point[2]))&&(sign == 1'b1))data_reg <= {4'd11,4'd11,4'd10,hun,ten,unit};else if(((hun)||(point[2]))&&(sign == 1'b0))data_reg <= {4'd11,4'd11,4'd11,hun,ten,unit};  else if(((ten)||(point[1]))&&(sign == 1'b1))data_reg <= {4'd11,4'd11,4'd11,4'd10,ten,unit};else if(((ten)||(point[1]))&&(sign == 1'b0))data_reg <= {4'd11,4'd11,4'd11,4'd11,ten,unit};  else if(((unit)||(point[0]))&&(sign == 1'b1))data_reg <= {4'd11,4'd11,4'd11,4'd11,4'd10,unit};elsedata_reg <= {4'd11,4'd11,4'd11,4'd11,4'd11,unit};  always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)    cnt_1ms <= 16'd0;else if (cnt_1ms == CNT_MAX)cnt_1ms <= 16'd0; else    cnt_1ms <= cnt_1ms + 1'b1;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)   flag_1ms <= 1'b0;else if (cnt_1ms == CNT_MAX - 1'b1)flag_1ms <= 1'b1;else flag_1ms <= 1'b0;        always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0) cnt_sel <= 3'd0;else if ((cnt_sel == 3'd5)&&(flag_1ms == 1'b1))cnt_sel <= 3'd0;else if (flag_1ms == 1'b1)cnt_sel <= cnt_sel + 1'b1;else cnt_sel <= cnt_sel;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0) sel_reg <= 6'b000_000;else if((cnt_sel == 3'd0)&&(flag_1ms == 1'b1)) sel_reg <= 6'b000_001;else if (flag_1ms == 1'b1)sel_reg <= sel_reg <<1;else sel_reg <= sel_reg;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0) data_disp <= 4'd0;else if((seg_en == 1'b1)&&(flag_1ms == 1'b1))case(cnt_sel)3'd0 : data_disp <= data_reg[3:0];3'd1 : data_disp <= data_reg[7:4];3'd2 : data_disp <= data_reg[11:8];3'd3 : data_disp <= data_reg[15:12];3'd4 : data_disp <= data_reg[19:16];3'd5 : data_disp <= data_reg[23:20];default:data_disp <= 4'd0; endcaseelsedata_disp <= data_disp;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)    dot_disp <= 1'b1;else if(flag_1ms == 1'b1)dot_disp <= ~point[cnt_sel];else dot_disp <= dot_disp;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)     seg <= 8'b111_111;else case(data_disp)4'd0 : seg <= {dot_disp,7'b100_0000} ;4'd1 : seg <= {dot_disp,7'b111_1001} ;4'd2 : seg <= {dot_disp,7'b010_0100} ;4'd3 : seg <= {dot_disp,7'b011_0000} ;4'd4 : seg <= {dot_disp,7'b001_1001} ;4'd5 : seg <= {dot_disp,7'b001_0010} ;4'd6 : seg <= {dot_disp,7'b000_0010} ;4'd7 : seg <= {dot_disp,7'b111_1000} ;4'd8 : seg <= {dot_disp,7'b000_0000} ;4'd9 : seg <= {dot_disp,7'b001_0000} ;4'd10: seg <= 8'b1011_1111;4'd11: seg <= 8'b111_111;default: seg <= 8'b1100_0000;endcasealways@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)  sel <= 6'b000_000;else sel <= sel_reg;bcd_8421 bcd_8421_inst
(.  sys_clk   ( sys_clk   ) ,.  sys_rst_n ( sys_rst_n ) ,. data       (data       ) ,. unit       (unit       ) ,. ten        (ten        ) ,. hun        (hun        ) , . tho        (tho        ) ,. t_tho      (t_tho      ) ,. h_hun      (h_hun      )
);
endmodule
`timescale 1ns/1ns
module tb_seg_dynamic();
reg    sys_clk     ;
reg    sys_rst_n   ;
reg [19:0] data    ;
reg [5:0]  point   ;
reg        sign    ;
reg        seg_en  ;wire  [5:0]   sel     ;
wire  [7:0]   seg     ;initial begin sys_clk =1'b1;sys_rst_n <= 1'b0;data <= 20'd0;point <= 6'b0;sign <= 1'b0;seg_en <= 1'b0;#30 sys_rst_n <= 1'b1;data <= 20'd9876;point <= 6'b0;sign <= 1'b1;seg_en <= 1'b1;endalways #10 sys_clk = ~sys_clk;
defparam  seg_dynamic_inst.CNT_MAX = 20'd5;
seg_dynamic seg_dynamic_inst
(   .sys_clk   (sys_clk   ) ,.sys_rst_n (sys_rst_n ) ,. data     ( data     ) ,. point    ( point    ) ,. sign     ( sign     ) ,. seg_en   ( seg_en   ) ,. sel      ( sel      ) ,. seg      ( seg      )
);
endmodule

b没有使用最高位 a符号位

数据显示

module hc595_ctrl
(input   wire    sys_clk     ,input   wire    sys_rst_n   ,input   wire [5:0]  sel     ,input   wire [7:0]  seg     ,output  reg        ds      ,output  reg        shcp    ,output  reg        stcp    ,output  wire        oe
);wire [13:0] data    ;
reg  [1:0]  cnt     ;
reg  [3:0]  cnt_bit ;assign data = {seg[0],seg[1],seg[2],seg[3],seg[4],seg[5],seg[6],seg[7],sel};always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt <= 2'd0;else if (cnt == 2'd3)cnt <= 2'd0;else cnt <= cnt + 1'b1;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)cnt_bit <= 4'd0;else if ((cnt_bit == 4'd13)&&(cnt == 2'd3))cnt_bit <= 4'd0;else if (cnt == 2'd3)cnt_bit <= cnt_bit + 1'b1;else    cnt_bit <= cnt_bit;always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0)ds <= 1'b0;else if(cnt == 2'd0)ds <= data[cnt_bit];elseds <= ds;
//移位时钟
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0) shcp <= 1'b0;else if (cnt == 2'd2)shcp <= 1'b1;else if (cnt == 2'd0)shcp <= 1'b0;else shcp <= shcp;
//存储寄存器时钟
always@(posedge sys_clk or negedge sys_rst_n)if(sys_rst_n == 1'b0) stcp <= 1'b0;else if ((cnt_bit == 4'd0)&&(cnt == 2'd0))stcp <= 1'b1;else if ((cnt_bit == 4'd0)&&(cnt == 2'd2)) stcp <= 1'b0;else stcp <= stcp;assign oe = 1'b0;endmodule
module seg_595_dynamic
(input   wire    sys_clk     ,input   wire    sys_rst_n   ,input   wire [19:0] data    ,input   wire [5:0]  point   ,input   wire        sign    ,input   wire        seg_en  ,output  wire        ds      ,output  wire        oe      , output   wire       shcp   ,output  wire        stcp
);
wire [5:0] sel;
wire [7:0] seg;seg_dynamic seg_dynamic_inst
(   .sys_clk   (sys_clk   ) ,.sys_rst_n (sys_rst_n ) ,. data     ( data     ) ,. point    ( point    ) ,. sign     ( sign     ) ,. seg_en   ( seg_en   ) ,. sel      ( sel      ) ,. seg      ( seg      )
);hc595_ctrl hc595_ctrl_inst
(.sys_clk  (sys_clk  )  ,.sys_rst_n(sys_rst_n)  ,.  sel    (  sel    )  ,.  seg    (  seg    )  ,.ds       (ds       )  ,.shcp     (shcp     )  ,.stcp     (stcp     )  ,. oe      ( oe      )
);
endmodule
module top_seg_595
(input   wire    sys_clk     ,input   wire    sys_rst_n   ,output  wire       ds      ,output  wire       shcp    ,output  wire       stcp    ,output  wire        oe      );
wire [19:0] data;
wire [5:0] point;
wire  sign;
wire seg_en;data_gen
#(.CNT_MAX(23'd9),.DATA_MAX(20'd999_999)
)
data_gen_inst
(.sys_clk   (sys_clk   ) ,.sys_rst_n (sys_rst_n ) ,. data     ( data     ) ,. point    ( point    ) ,. sign     ( sign     ) ,. seg_en   ( seg_en   ) ,);
seg_595_dynamic seg_595_dynamic_inst
(.sys_clk   (sys_clk   ) ,.sys_rst_n (sys_rst_n ) ,. data     ( data     ) ,. point    ( point    ) ,. sign     ( sign     ) ,. seg_en   ( seg_en   ) ,.ds   (ds  ), .shcp (shcp), .stcp (stcp),    . oe  ( oe )
);endmodule
`timescale 1ns/1ns
module tb_top_seg_595();reg         sys_clk   ;
reg         sys_rst_n ;wire       ds        ;wire       shcp      ;wire       stcp      ;wire        oe       ;initial begin sys_clk =1'b1;sys_rst_n <= 1'b0;#20 sys_rst_n <= 1'b1;endalways #10 sys_clk = ~sys_clk;
defparam top_seg_595_inst.data_gen_inst.CNT_MAX = 23'd49;
defparam top_seg_595_inst.seg_595_dynamic_inst.seg_dynamic_inst.CNT_MAX =16'd19;top_seg_595 top_seg_595_inst
(
.sys_clk   (sys_clk   ),
.sys_rst_n (sys_rst_n ),
.ds        (ds        ),
.shcp      (shcp      ),
.stcp      (stcp      ),
. oe       ( oe       )
);
endmodule

FPGA学习日记(18)--数码管动态显示相关推荐

  1. 210学习日记(18)_ARM基础知识

    210学习日记(18) --ARM基础知识 注意: 以下大部分类容都来自网上现成的(直接拷贝过来的,然后经整理)!!!! 问1:ARM处理器工作模式有几种?各种工作模式下分别有什么特点? 答1:ARM ...

  2. 【FPGA开发笔记】—— 数码管动态显示项目详细剖析+个人心得体会

    文章目录 一.项目要求 二.问题分析与思路设计 2.1 从基本的动态显示入手 2.2 算法设想 三.实际操作 3.1 程序架构 3.2 Verilog代码 3.2.1 main模块 3.2.2 100 ...

  3. FPGA驱动74HC595实现数码管动态显示

    数码管原理 图a为单个数码管的原理图,实际上和点灯差不多,不过这8个灯按照数字8的形状进行排布. 数码管分共阴极和共阳极两种,图b左边是共阴极数码管,需要给对应的引脚高电平以点亮,右边是共阳极数码管, ...

  4. FPGA学习日记(八)SDRAM的读写测试

    目的:对SDRAM进行读写测试,使用FIFO对SDRAM进行封装. SDRAM功能框图: SDRAM原理图: 初始化状态机: 工作状态机: 代码如下: SDRAM顶层模块:连接外部芯片与测试灯,并通过 ...

  5. ABP VNext学习日记18

    1.IAuthorizationService 解析:IAuthorizationService具有两个AuthorizeAsync方法重载:一个接受资源和策略名称,另一个接受资源并提供要评估的要求的 ...

  6. JAVA学习日记(18)——反射和枚举

    1.反射 1.1 定义 Java的反射(reflection)机制是在运行状态下,对于任何一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意属性和方法,既然能够拿到那么我们 ...

  7. FPGA学习日记(七)HDMI图像数据传输

    一.实现目标 将像素数据通过HDMI传输,在显示器上显示. 二.数据流传输 HDMI常采用TMDS传输(上升沿复位)方式: (1)通过三个通道分别可传入8位的rgb视频信号,2位的控制信号,4位的音频 ...

  8. FPGA学习日记(九)ZYNQ的GPIO—MIO接口控制

    一.GPIO简介 在ZYNQ中,PS端的引脚资源ZYNQ PS 中的外设可以通过 MIO( 54pin,Multiuse I/O,多用输入/输出)模块连接到 PS 端的引脚上,也可以通过 EMIO 连 ...

  9. 基于STC15W4K32S4单片机仿真《74HC595驱动数码管动态显示》

    1. 编 程 软 件:keil5版本. 2.仿 真 软 件:Proteus8.12 3.单片机选型:STC15W4K32S4 4.学 习 目 标:1.学习74HC595驱动数码管动态显示 5.程 序 ...

最新文章

  1. 张尧学:祝YOCSEF越办越好
  2. Wtm Blazor来了!
  3. 【软考高项】信息系统项目管理师 论文写作技巧分享 (上)
  4. 二维绕任意点旋转_解析几何|对称,平移和旋转
  5. ft2232驱动安装方法_win7系统无法安装打印机驱动程序的解决方法
  6. 变量声明提升和函数声明提升
  7. 那些年被我坑过的Python——不得不知(第二章)
  8. 备课好帮手,免费分享 下载
  9. 百度关键词抓取工具_企业网站SEO营销工具大全,快来看看你的网站到底是什么水平!...
  10. 黑域BreventAutoPatcher 打补丁出错 Java Runtime not eligible
  11. git commit 参数详解 --amend
  12. C++实现会议安排问题(贪心问题)
  13. grunt,gulp
  14. 1.list倒叙输出
  15. codewars练习(javascript)-2021/2/24
  16. 看《西游记》谈团队管理(超博好领导系列)
  17. 数据探查平台-元数据对标专利 -- 普帝
  18. STM32 之三 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)
  19. matlab画出拟合的曲线,matlab画出拟合曲线
  20. PS 运行错误代码: 16 的解决方法

热门文章

  1. 万彩动画大师的JAVA安装不了_【动画视频制作软件】万彩动画大师教程 | 安装万彩动画大师...
  2. Unity GoogleVR(一)—— 解决安卓打包黑屏、闪退
  3. PLSQL Developer调试 存储过程和触发器
  4. 奶奶都能轻松入门的 Puppeteer 教程
  5. 二,我的大学生活(1)
  6. ubuntu-14.10 输入法切换设置
  7. vue里tab菜单横向展示,可分页功能组件实现
  8. Vue2 操作Element表格单列数据
  9. iphone12录屏功能在哪儿(如何录屏)
  10. 公平锁和非公平锁使用和解析