当前位置: 首页 > news >正文

东莞企业网站建设价格网页制做

东莞企业网站建设价格,网页制做,seo承诺排名的公司,做电影网站要多少钱文章目录 一、数码管简介二、项目分析三、项目源码及分析四、实现效果五、总结 一、数码管简介 请参阅博主以前写过的一篇电子时钟模拟#xff0c;在此不再赘述。 https://blog.csdn.net/qq_54347584/article/details/130402287 二、项目分析 项目说明#xff1a;本次项目… 文章目录 一、数码管简介二、项目分析三、项目源码及分析四、实现效果五、总结 一、数码管简介 请参阅博主以前写过的一篇电子时钟模拟在此不再赘述。 https://blog.csdn.net/qq_54347584/article/details/130402287 二、项目分析 项目说明本次项目是为了通过数码管实现秒表模拟。其中六位数码管分别显示秒表的分位秒位毫秒位由于毫秒有三位在此只取百位和十位其中分位和秒位秒位和毫秒位之间用小数点隔开本次项目拟设置四个模块分别为按键消抖模块计数模块数码管驱动模块以及顶层模块按键消抖模块要求传出两个按键的脉冲信号一个用来暂停/开始秒表的计数一个用来清空秒表的计数计数模块要求能传出秒表的各位值以及小数点位置数码管驱动模块要求能正常显示秒表各位值 三、项目源码及分析 数码管驱动模块 代码分析 由于本开发板有六位数码管每位数码管设置显示0-F因此在此模块中博主定义了一个24位的din信号六位每位能显示十六个字符因此每位需要四位位宽以此来给每位数码管赋值同时博主将八段式数码管拆分为七段加一段小数点因此设计了一个六位的point_n以此来控制小数点的显示其余代码与博主以前写的数码管动态显示0-F类似在此不再赘述如果是FPGA初学者没有数码管开发经验请仔细阅读博主动态显示及电子时钟两篇博客 /**************************************功能介绍*********************************** Date : 2023-08-01 11:08:11 Author : majiko Version : 1.0 Description: 动态数码管模块动态扫描 *********************************************************************************///---------模块及端口声名------------------------------------------------------ module seg_driver( input clk ,input rst_n ,input [23:0] din ,//输入6位数码管显示数据每位数码管占4位input [5:0] point_n ,//输入小数点控制位output reg [5:0] seg_sel ,//输出位选output reg [7:0] seg_dig //输出段选 ); //---------参数定义--------------------------------------------------------- parameter TIME_1MS 50_000;//1ms//数码管显示字符编码localparam NUM_0 7b100_0000,//0NUM_1 7b111_1001,//1NUM_2 7b010_0100,//NUM_3 7b011_0000,//NUM_4 7b001_1001,//NUM_5 7b001_0010,//NUM_6 7b000_0010,//NUM_7 7b111_1000,//NUM_8 7b000_0000,//NUM_9 7b001_1000,//A 7b000_1000,//B 7b000_0011,//bC 7b100_0110,//D 7b010_0001,//dE 7b000_1110,//E替换为FF 7b011_1111,//F替换为--DIV 7b011_1111;//---------内部信号定义-----------------------------------------------------reg [15:0] cnt_1ms ;//1ms计数器扫描间隔计数器wire add_cnt_1ms ;wire end_cnt_1ms ;reg [3:0] disp_data ;//每一位数码管显示的数值reg point_n_r ;//每一位数码管显示的小数点//**************************************************************** //--cnt_1ms //****************************************************************always (posedge clk or negedge rst_n)begin if(!rst_n)begincnt_1ms d0;end else if(add_cnt_1ms)begin if(end_cnt_1ms)begin cnt_1ms d0;endelse begin cnt_1ms cnt_1ms 1b1;end endend assign add_cnt_1ms 1b1;//数码管一直亮assign end_cnt_1ms add_cnt_1ms cnt_1ms TIME_1MS - 1;//**************************************************************** //--seg_sel //****************************************************************always (posedge clk or negedge rst_n)begin if(!rst_n)beginseg_sel 6b111_110;//循环移位实现时需要给位选赋初值end else if(end_cnt_1ms)begin seg_sel {seg_sel[4:0],seg_sel[5]};//循环左移end end//**************************************************************** //--disp_data //****************************************************************always (posedge clk or negedge rst_n)begin if(!rst_n)begindisp_data d0;point_n_r 1b1;end else begin case (seg_sel)6b111_110 : begin disp_data din[3:0] ; point_n_r point_n[0]; end//第一位数码管显示的数值6b111_101 : begin disp_data din[7:4] ; point_n_r point_n[1]; end6b111_011 : begin disp_data din[11:8] ; point_n_r point_n[2]; end6b110_111 : begin disp_data din[15:12]; point_n_r point_n[3]; end6b101_111 : begin disp_data din[19:16]; point_n_r point_n[4]; end6b011_111 : begin disp_data din[23:20]; point_n_r point_n[5]; enddefault: disp_data d0;endcaseend end//**************************************************************** //--seg_dig //****************************************************************// always (posedge clk or negedge rst_n)begin // if(!rst_n)begin// seg_dig 8hff;//数码管的段选如何赋值好// end // else begin // case (disp_data)// 0 : seg_dig {point_n_r,NUM_0};// 1 : seg_dig {point_n_r,NUM_1};// 2 : seg_dig {point_n_r,NUM_2};// 3 : seg_dig {point_n_r,NUM_3};// 4 : seg_dig {point_n_r,NUM_4};// 5 : seg_dig {point_n_r,NUM_5};// 6 : seg_dig {point_n_r,NUM_6};// 7 : seg_dig {point_n_r,NUM_7};// 8 : seg_dig {point_n_r,NUM_8};// 9 : seg_dig {point_n_r,NUM_9};// 10 : seg_dig {point_n_r,A };// 11 : seg_dig {point_n_r,B };// 12 : seg_dig {point_n_r,C };// 13 : seg_dig {point_n_r,D };// 14 : seg_dig {point_n_r,E };// 15 : seg_dig {point_n_r,F };// default: seg_dig 8hff;// endcase// end // endalways (*)begin case (disp_data)0 : seg_dig {point_n_r,NUM_0};1 : seg_dig {point_n_r,NUM_1};2 : seg_dig {point_n_r,NUM_2};3 : seg_dig {point_n_r,NUM_3};4 : seg_dig {point_n_r,NUM_4};5 : seg_dig {point_n_r,NUM_5};6 : seg_dig {point_n_r,NUM_6};7 : seg_dig {point_n_r,NUM_7};8 : seg_dig {point_n_r,NUM_8};9 : seg_dig {point_n_r,NUM_9};10 : seg_dig {point_n_r,A };11 : seg_dig {point_n_r,B };12 : seg_dig {point_n_r,C };13 : seg_dig {point_n_r,D };14 : seg_dig {point_n_r,E };15 : seg_dig {point_n_r,F };16 : seg_dig {point_n_r,DIV };default: seg_dig 8b1101_1111;endcaseendendmodule计数器模块 代码分析 由项目分析可以得出由于数码管资源有限毫秒位只能实现百位和十位的显示因此我们不妨设置一个基准单位为10ms每当计数到10ms时毫秒计数器才进行加一这样毫秒计数器只需加到100次即可除此之外秒位计数器和分位计数器的技术条件分别为毫秒计数器计满和秒位计数器计满由于本次项目需要引入按键信号进行秒表的暂停、继续以及清空因此博主引入了两位按键信号。一位按键控制秒表的暂停与继续。由上述分析可知如果想要暂停秒表的计数我们只需暂停基准单位10ms的计数即可其余三个计数器均要在10ms计数器工作的前提下才能逐级工作因此我们只需要引入一个中间信号flag用flag作为其计数的条件即可博主将flag初值设为0不计数按键按下后flag反转为1开始计数再次按下再次反转停止计数剩余一位按键用于四个计数器的清零一旦四个计数器全部清零传出的数码管数据自然为0在代码的最后博主将毫秒秒分计数器的值赋给dout再将其传入数码管驱动模块即可之所以是这个顺序是因为博主前面数码管驱动模块对位选信号赋值好像写反了不过影响不大 module counter (input wire clk ,input wire rst_n ,input wire [1:0] key_in ,//按键信号输入output wire [23:0] dout ,//数码管各位值输出output wire [5:0] point_out //小数点输出 );//内部参数定义 parameter TIME_10ms 19d500_000;//10ms计数器计满秒表毫秒位加1 parameter TIME_990ms 7d100 ;//计数器毫秒位以10ms为单位 parameter TIME_1s 6d60 ;//计数器秒位计满清零 parameter TIME_1min 6d60 ;//计数器分位计满清零//内部信号定义 reg [18:0] cnt_10ms ;//10毫秒计数器寄存器 reg [6:0] cnt_99ms ;//毫秒位计数寄存器 reg [5:0] cnt_1s ;//秒位计数器寄存器 reg [5:0] cnt_1min ;//分位计数器寄存器wire add_cnt_10ms ; wire end_cnt_10ms ;wire add_cnt_990ms ; wire end_cnt_990ms ;wire add_cnt_1s ; wire end_cnt_1s ;wire add_cnt_1min ; wire end_cnt_1min ;reg flag ;//运行/暂停标志信号寄存器 reg flag_0 ;//清零信号标志寄存器//10毫秒计数器 always (posedge clk or negedge rst_n)beginif(!rst_n)begincnt_10ms 1b0;endelse if(add_cnt_10ms)beginif(end_cnt_10ms)begincnt_10ms 1b0;endelse begincnt_10ms cnt_10ms 1b1;endendelse begincnt_10ms cnt_10ms;end endassign add_cnt_10ms 1b1 flag;//运行标志位有效 assign end_cnt_10ms (add_cnt_10ms cnt_10ms TIME_10ms - 1b1) || key_in[1];//按下清零按键也会清零//毫秒位计数器 always(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_99ms 1b0;endelse if(add_cnt_990ms)beginif(end_cnt_990ms)begincnt_99ms 1b0;endelse begincnt_99ms cnt_99ms 1b1;endendelse begincnt_99ms cnt_99ms;end endassign add_cnt_990ms end_cnt_10ms; assign end_cnt_990ms (add_cnt_990ms cnt_99ms TIME_990ms - 1b1) || key_in[1];//秒位计数器 always(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_1s 1b0;endelse if(add_cnt_1s)beginif(end_cnt_1s)begincnt_1s 1b0;endelse begincnt_1s cnt_1s 1b1;endendelse begincnt_1s cnt_1s;end endassign add_cnt_1s end_cnt_990ms; assign end_cnt_1s (add_cnt_1s cnt_1s TIME_1s - 1b1) || key_in[1];//分位计数器 always(posedge clk or negedge rst_n)beginif(!rst_n)begincnt_1min 1b0;endelse if(add_cnt_1min)beginif(end_cnt_1min)begincnt_1min 1b0;endelse begincnt_1min cnt_1min 1b1;endendelse begincnt_1min cnt_1min;end endassign add_cnt_1min end_cnt_1s; assign end_cnt_1min (add_cnt_1min cnt_1min TIME_1min - 1b1) || key_in[1];//flag信号控制秒表运行/暂停 always(posedge clk or negedge rst_n)beginif(!rst_n)beginflag 1b0;endelse if(key_in[0])beginflag ~flag;endelse beginflag flag;end end//输出值赋值 assign dout[23:20] cnt_99ms % 10; assign dout[19:16] cnt_99ms / 10; assign dout[15:12] cnt_1s % 10; assign dout[11:8] cnt_1s / 10; assign dout[7:4] cnt_1min % 10; assign dout[3:0] cnt_1min / 10; assign point_out 6b110_101 ;endmodule按键消抖模块 代码分析请详细参阅博主所写的按键消抖模块博文在此不再赘述 module key_filter#(parameter WIDTH 2)//参数化按键位宽 (input wire clk ,input wire rst_n ,input wire [WIDTH - 1:0] key_in ,//按键输入信号output reg [WIDTH - 1:0] key_out //输出稳定的脉冲信号 );parameter MAX 20d1_000_000;reg [19:0] cnt_delay ; //20ms延时计数寄存器 wire add_cnt_delay ; //开始计数的标志 wire end_cnt_delay ; //结束计数的标志reg [WIDTH - 1:0] key_r0 ; //同步 reg [WIDTH - 1:0] key_r1 ; //打一拍 reg [WIDTH - 1:0] key_r2 ; //打两拍wire [WIDTH - 1:0] nedge ; //下降沿寄存器//同步打拍 always (posedge clk or negedge rst_n) beginif(!rst_n)beginkey_r0 {WIDTH{1b1}};key_r1 {WIDTH{1b1}};key_r2 {WIDTH{1b1}};endelse beginkey_r0 key_in; //同步key_r1 key_r0; //寄存一拍key_r2 key_r1; //寄存两拍end end//20ms计数器 always (posedge clk or negedge rst_n)beginif(!rst_n)begincnt_delay 1b0;endelse if(add_cnt_delay )beginif(nedge)begin //检测到下降沿从0开始计数cnt_delay 1b0;endelse if(cnt_delay MAX - 1b1)begincnt_delay cnt_delay; //计数计满结束后保持避免产生多个输出脉冲endelse begincnt_delay cnt_delay 1b1;endendelse begincnt_delay 1b0;end endassign nedge ~key_r1 key_r2; //下降沿检测 assign add_cnt_delay 1b1; assign end_cnt_delay add_cnt_delay cnt_delay MAX - 1b1;//key_out脉冲信号赋值 always(posedge clk or negedge rst_n)beginif(!rst_n)beginkey_out d0;endelse if(cnt_delay MAX - 2d2)begin //计数计满前一个脉冲时产生按键脉冲key_out ~key_in;endelse beginkey_out d0;end endendmodule顶层模块 /**** 项目说明本次项目是为了通过数码管实现秒表模拟。其中六位数码管分别显示秒表的分位秒位毫秒位百位和十位。本次项目拟设置四个模块分别为按键消抖模块计数模块数码管驱动模块以及顶层模块。本项目按键消抖模块要求传出两个按键的脉冲信号一个用来暂停/开始秒表的计数一个用来清空秒表的计数。本项目计数模块要求能传出秒表的各位值以及小数点位置本项目数码管驱动模块要求能正常显示秒表各位值 ****/ module top(input wire clk ,input wire rst_n ,input wire [1:0] key_in ,output wire [5:0] sel ,output wire [7:0] seg );wire [1:0] key_out ; wire [23:0] din ; wire [5:0] point_n ;seg_driver u_seg_driver( .clk (clk ),.rst_n (rst_n ),.din (din ),.point_n (point_n),.seg_sel (sel ),.seg_dig (seg ) );key_filter u_key_filter(.clk (clk ),.rst_n (rst_n ),.key_in (key_in ),.key_out (key_out) );counter u_counter(.clk (clk ),.rst_n (rst_n ),.key_in (key_out ),.dout (din ),.point_out (point_n ) );endmodule四、实现效果 五、总结 本项目主要锻炼了FPGA的数码管开发和计数器编写实际仍未FPGA学习基础博主学习时常常被数码管位选信号的段选信号的赋值绕晕解决方法也只有自己亲自编写几遍否则仍然无法理解余晖效应和动态扫面是如何让数码管同时显示不同字符的。后续对于基础部分的学习博主应该还会写几篇关于蜂鸣器的博文至此算是基础语法学习结束。 再往后博主学习到IP核HLS通讯协议时也许会继续编写博客但也要看博主是否有足够的精力以及能否自己理解并讲解清楚否则话的还是请各位自行上网寻找视频教学资料不管是野火还是正点原子都有针对的FPGA学习视频。 学海无涯大家有缘再见。
http://www.sczhlp.com/news/210366/

相关文章:

  • 深圳品牌官网seochinaz查询
  • 东莞市住房建设网站咨询学校网站开发费用
  • 房产网站建设整体架构佛山网站建设十年乐云seo
  • 网站改版 数据迁移如何快速建一个网站
  • 企业网站备案网址工信部备案查询网址
  • 一个返利网站建设流程wordpress 顶一下
  • 胶州建设局网站怎么登录已注册的网站
  • 做家教用什么网站百度提问登陆入口
  • 学校网站建设汇报ppt灯塔seo
  • 做网站需要什么技术提供网站建设课程代码
  • 建材类网站建设需要的资料新网站如何让百度收录
  • 国外设计欣赏网站搜索引擎优化论文
  • 网站首页做了一下调整会被k吗外贸网站seo招聘
  • o2o网站源码app鹤壁建设网站
  • 建筑网站建设案例网站开发建设需多少钱
  • 成都商务网站建设sns社交网站 建设
  • 重庆网站建设总结做网站二级页面的
  • app开发网站建设快手流量推广免费网站
  • 网站经营网络备案信息管理系统五金外贸网站
  • 免费免费网站模板下载建设企业网站心得体会
  • 廊坊网站群发关键词微网站建设报价方案
  • centos 7.9快速部署ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统用于信息收集
  • 3 分钟搞懂 Java 中 this 关键字的用法
  • 折腾笔记[32]-windows部署vscode-server及使用命令行编译c#.net工程
  • Java 中 ArrayList 和 LinkedList 的选择技巧
  • Java 静态方法为什么不能访问非静态成员?
  • 自己做的网站怎么在移动端访问企业网站建设实战教程
  • 邱县专业做网站环球设计官网网站
  • 网站后台百度统计图如何做的鞍山信息港号吧
  • 建做网站面馆装修设计