数码管时钟显示按键控制 fpga实现

2023-11-15

目录

原理

数码管原理原理
并且该数码管是共阳极,所以段选低电平有效,片选低电平有效
段选共用8个引脚

实现

思路:
分三个模块实现:
1)按键消抖 :按键消抖
2)计数器模块:产生需要的时钟信号数据
3)数码管驱动:将输入的数据转换为段选、片选信号

1)按键消抖:
这里按键数量用参数代替,增加可重用性
用同步打拍方式检测下降沿
用计数器自检测到下降沿开始计数20ms
输出信号为计数器计数完成后输入取反的值

module key_debounce #(parameter KEY_W = 3,TIME_20MS = 1000_000)(
	input					clk		,
	input					rst_n	,
	input		[KEY_W-1:0]	key_in 	,
	
	output	reg	[KEY_W-1:0]	key_out	 //检测到按下,输出一个周期的高脉冲,其他时刻为0
);
	
//信号定义
	reg		[19:0]		cnt		;
	wire				add_cnt	;
	wire				end_cnt	;
	reg					add_flag;
	
	reg		[KEY_W-1:0]	key_r0	;//同步按键输入
	reg		[KEY_W-1:0]	key_r1	;//打拍
	wire	[KEY_W-1:0]	nedge	;//检测下降沿
	
//计数器  检测到下降沿的时候,开启计数器延时20ms
	always @(posedge clk or negedge rst_n)begin 
		if(!rst_n)begin 
			cnt <= 0;
		end
		else if(add_cnt)begin 
			if(end_cnt)
				cnt <= 0;
			else 
				cnt <= cnt + 1'b1;
		end  		
	end 
	assign add_cnt = add_flag;
	assign end_cnt = add_cnt && cnt == TIME_20MS-1;
	
	//检测到下降沿的时候,拉高计数器计数使能信号,延时结束时,再拉低使能信号
	always @(posedge clk or negedge rst_n)begin 
		if(!rst_n)begin 
			add_flag <= 1'b0;
		end 
		else if(nedge)begin 
			add_flag <= 1'b1;
		end 
		else if(end_cnt)begin 
			add_flag <= 1'b0;
		end 
	end 
	
	//同步按键输入,并打一拍,以检测下降沿
	always @(posedge clk or negedge rst_n)begin 
		if(!rst_n)begin 
			key_r0 <= {KEY_W{1'b1}};
			key_r1 <= {KEY_W{1'b1}};
		end 
		else begin 
			key_r0 <= key_in;//同步
			key_r1 <= key_r0;//打拍
		end 
	end
	assign nedge = ~key_r0 & key_r1;
		
	//延时20ms结束的时钟周期,输出按键的状态,若按下输出一个周期的高脉冲,否则输出0
	always@(posedge clk or negedge rst_n)begin 
		if(~rst_n)begin 
			key_out <= 0;
		end 
		else begin 
			key_out <= end_cnt?~key_r1:0;
		end 
	end 
endmodule 

2)计数器模块
定义了6个计数器分别代表每位数码管的显示数据
key[0] 作为设置键,按键信号有效,则可以进行设置操作
key[1] 作为选择键,用计数器记录当前选择项,默认为m个位
key[2] 作为+键,按一下当前项+1
除了正常产生时间数据的计数器,在+1条件中添加了按键设置,即当key[0]有效,key[2]拉高,当前选择项+1
最后将产生数据组合在一起形成输出数据,每4位代表一个数码管的数据

module count(
    input           clk     ,
    input           rst_n   ,
    input   [2:0]   key     ,
    output  [23:0]  dout    
);

parameter TIME_1S = 50_000_000;

reg flag_set;//设置时间标志信号

reg [2:0] cnt_key;//记录按键选择项
wire add_cnt_key;
wire end_cnt_key;

reg [25:0] cnt_1s;//1s计数器
wire add_cnt_1s;
wire end_cnt_1s;

reg [3:0] cnt0;//s个位计数器
wire add_cnt0;
wire end_cnt0;

reg [3:0] cnt1;//s十位计数器
wire add_cnt1;
wire end_cnt1;

reg [3:0] cnt2;//m个位计数器
wire add_cnt2;
wire end_cnt2;

reg [3:0] cnt3;//m十位计数器
wire add_cnt3;
wire end_cnt3;

reg [3:0] cnt4;//h个位计数器
wire add_cnt4;
wire end_cnt4;

reg [3:0] cnt5;//h十位计数器
wire add_cnt5;
wire end_cnt5;

//设置时间标志项
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        flag_set <= 1'b0;
    end
    else if(key[0])begin
        flag_set <= ~flag_set;
    end
end

//记录按键选择项
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_key <= 3'd0;
    end
    else if(add_cnt_key)begin
        if(end_cnt_key)begin
            cnt_key <= 3'd0;
        end
        else begin
            cnt_key <= cnt_key + 1'b1;
        end
    end
end
assign add_cnt_key = key[1];
assign end_cnt_key = add_cnt_key && (cnt_key == 3'd5);


//1s计数器
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_1s <= 26'b0;
    end
    else if(add_cnt_1s)begin
        if(end_cnt_1s)begin
            cnt_1s <= 26'b0;
        end
        else begin
            cnt_1s <= cnt_1s + 1'b1;
        end
    end
end
assign add_cnt_1s = 1'b1;
assign end_cnt_1s = add_cnt_1s && (cnt_1s == TIME_1S - 1);

//s个位计数器
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt0 <= 4'b0;
    end
    else if(add_cnt0)begin
        if(end_cnt0)begin
            cnt0 <= 4'b0;
        end
        else begin
            cnt0 <= cnt0 + 1'b1;
        end
    end
end
assign add_cnt0 = end_cnt_1s || (flag_set && cnt_key[2:0] == 3'd5 && key[2]);
assign end_cnt0 = add_cnt0 && (cnt0 == 10 - 1);

//s十位计数器
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt1 <= 4'b0;
    end
    else if(add_cnt1)begin
        if(end_cnt1)begin
            cnt1 <= 4'b0;
        end
        else begin
            cnt1 <= cnt1 + 1'b1;
        end
    end
end
assign add_cnt1 = end_cnt0 || (flag_set && cnt_key[2:0] == 3'd4 && key[2]);
assign end_cnt1 = add_cnt1 && (cnt1 == 6 - 1);

//m个位计数器
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt2 <= 4'b0;
    end
    else if(add_cnt2)begin
        if(end_cnt2)begin
            cnt2 <= 4'b0;
        end
        else begin
            cnt2 <= cnt2 + 1'b1;
        end
    end
end
assign add_cnt2 = end_cnt1 || (flag_set && cnt_key[2:0] == 3'd0 && key[2]);
assign end_cnt2 = add_cnt2 && (cnt2 == 10 - 1);

//m十位计数器
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt3 <= 4'b0;
    end
    else if(add_cnt3)begin
        if(end_cnt3)begin
            cnt3 <= 4'b0;
        end
        else begin
            cnt3 <= cnt3 + 1'b1;
        end
    end
end
assign add_cnt3 = end_cnt2 || (flag_set && cnt_key[2:0] == 3'd1 && key[2]);
assign end_cnt3 = add_cnt3 && (cnt3 == 6 - 1);

//h个位计数器
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt4 <= 4'b0;
    end
    else if(add_cnt4)begin
        if(end_cnt4)begin
            cnt4 <= 4'b0;
        end
        else begin
            cnt4 <= cnt4 + 1'b1;
        end
    end
end
assign add_cnt4 = end_cnt3 || (flag_set && cnt_key[2:0] == 3'd2 && key[2]);
assign end_cnt4 = add_cnt4 && (cnt4 == (cnt5 == 2)?(4 - 1):(10 - 1));

//h十位计数器
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt5 <= 4'b0;
    end
    else if(add_cnt5)begin
        if(end_cnt5)begin
            cnt5 <= 4'b0;
        end
        else begin
            cnt5 <= cnt5 + 1'b1;
        end
    end
    else if(flag_set && cnt_key[2:0] == 3'd3 && key[2])begin
        if(cnt5 == 2)begin
            cnt5 <= 4'd0;
        end
        else begin
           cnt5 <= cnt5 +1'b1; 
        end 
    end
end
assign add_cnt5 = end_cnt4;
assign end_cnt5 = add_cnt5 && (cnt5 == 2);

assign dout = {cnt5,cnt4,cnt3,cnt2,cnt1,cnt0};

endmodule

3)数码管驱动模块
这里每0.5ms刷新一次数码管,即每0.5ms重新显示数码管,根据人眼的暂留效应,可以达到常亮的效果
并且每0.5ms换一次片选信号,实现动态显示的效果(其实就是在一个0.5ms内,只显示了一个数码管,但因为时间太短,我们察觉不到,感觉是常亮)
在切换片选信号的同时,将对应的段选信号赋给[3:0] data
最后,查找字典,将data中数据转换为数码管需要的格式

module seg_driver(
    input               clk     ,
    input               rst_n   ,
    input      [23:0]   din     ,
    output reg [5:0]    sel     ,
    output reg [7:0]    dig     
);

parameter TIME_10MS = 25_000;
//共阳极数码管  低电平点亮
    localparam  ZERO     = 7'b100_0000,
                ONE      = 7'b111_1001,
                TWO      = 7'b010_0100,   
                THREE    = 7'b011_0000,   
                FOUR     = 7'b001_1001,
                FIVE     = 7'b001_0010, 
                SIX      = 7'b000_0010, 
                SEVEN    = 7'b111_1000, 
                EIGHT    = 7'b000_0000,
                NINE     = 7'b001_0000;

//信号定义

reg dot;

reg [19:0] cnt;//扫描计数器
wire add_cnt;
wire end_cnt;

reg [3:0] data;//根据片选信号选择对应数码管数据

//刷新频率计数器
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)begin
            cnt <= 0;
        end
        else begin
           cnt <= cnt + 1'b1;
        end
    end
end
assign add_cnt = 1'b1;
assign end_cnt = add_cnt && (cnt == TIME_10MS - 1);
//片选信号选择
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        sel <= 6'b111_110;;
    end
    else if(end_cnt)begin
        sel <= {sel[0],sel[5:1]};
	 end
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        data <= 4'b0;
    end
    else begin
       case(sel)
            6'b111_110: begin data <= din [3:0]     ;dot <=  1'b1;end
            6'b111_101: begin data <= din [7:4]     ;dot <=  1'b1;end
            6'b111_011: begin data <= din [11:8]    ;dot <=  1'b0;end
            6'b110_111: begin data <= din [15:12]   ;dot <=  1'b1;end
            6'b101_111: begin data <= din [19:16]   ;dot <=  1'b0;end
            6'b011_111: begin data <= din [23:20]   ;dot <=  1'b1;end
            default: data <= din[3:0];
        endcase 
    end
     
end

always @(*) begin
    case(data)
        4'd0:dig = {dot,ZERO }   ;
        4'd1:dig = {dot,ONE  }   ;
        4'd2:dig = {dot,TWO  }   ;
        4'd3:dig = {dot,THREE}   ;
        4'd4:dig = {dot,FOUR }   ;
        4'd5:dig = {dot,FIVE }   ;
        4'd6:dig = {dot,SIX  }   ;
        4'd7:dig = {dot,SEVEN}   ;
        4'd8:dig = {dot,EIGHT}   ;
        4'd9:dig = {dot,NINE }   ;
        default: dig = ZERO;
    endcase
end
endmodule

最后的主模块,就是个外壳

module shizhong(
    input clk,
    input rst_n,
    input [2:0] key_in,
    output [5:0] sel,
    output [7:0] dig
);
wire [2:0] key_out;
wire [23:0] dout;
key_debounce #(.KEY_W(3)) u_key_debounce(
	.clk		(clk		),
	.rst_n	    (rst_n	    ),
	.key_in 	(key_in 	),
	.key_out	(key_out	) //检测到按下,输出一个周期的高脉冲,其他时刻为0
);

count u_count(
    .clk     (clk    ),
    .rst_n   (rst_n  ),
    .key     (key_out),
    .dout    (dout   )
);

seg_driver u_seg_driver(
    .clk     (clk     ),
    .rst_n   (rst_n   ),
    .din     (dout    ),
    .sel     (sel     ),
    .dig     (dig     )
);

endmodule

实测没有太大的bug
总结:开始的时候感觉就不是人写的,又要产生时钟数据,又要按键控制,甚至开始连动态显示都不知道怎么写,在老师的讲解下,加上自己查阅博客,最终还是吧代码搞定了,至于quartus中其他的警告,其中有很多还是搞不清楚,时序问题的话,把sdc文件中的时钟改成周期20ns的就行,更多的警告就搞不定了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数码管时钟显示按键控制 fpga实现 的相关文章

  • FPGA笔记8——串口通信(回环实验)

    目录 串口通信原理 串行通信基础知识 处理器与外部设备通信的两种方式 串行通信的通信方式 串行通信的传输方向 常见的串行通信接口 异步串口通信UART基础知识 数据格式 传输速率 接口标准 RS232接口 串口通信实验RS 232 实验任务
  • Verilog--CDC跨时钟域处理(快时钟域到慢时钟域)

    Verilog CDC跨时钟域处理 快时钟域到慢时钟域 CDC问题 单比特信号的跨时钟域问题 从快时钟域到慢时钟域 从慢时钟域到快时钟域 多比特信号的跨时钟域问题 异步FIFO 握手协议 DMUX 格雷码 双D触发器 今天先写单比特信号从快
  • STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing violation)?

    1 什么是STA STA 静态时序分析 是时序验证的一种方法 用于计算和分析电路是否满足时序约束的要求 2 为什么需要STA 电路能否正常工作 其本质上是受最长逻辑通路 即关键路径 的限制 以及受芯片中存储器件的物理约束或工作环境的影响 为
  • [FPGA系列] 扩展知识 --- 时钟小结

    一 基本概念 时钟域 由同一个时钟信号控制的区域 时钟抖动 Jitter 相对于理想时钟信号 实际时钟信号存在时而超前 时而之后的偏移 时钟偏斜 Skew 时钟信号到达数字电路各个部分所用时间的差异 时钟漂移 Wander 工程上解释 抖动
  • Xilinx ISE系列教程(9):LabTools下载、安装、使用教程(独立的下载工具)

    文章目录 1 ISE Vivado LabTools简介 2 ISE 14 7 Lab Tools下载 安装 3 Vivado 2018 3 LabTools下载 安装 1 ISE Vivado LabTools简介 Xilinx LabT
  • verilog中wire和reg类型的区别

    module counter parameter CNT MAX 25 d24 999 999 input wire sys clk input wire sys rst n output reg led out reg 24 0 cnt
  • FPGA实战--等精度频率测量

    首先放置效果图 本次试验中采用的是等精度测频率 等精度测频的原理是产生一个1s的高电平 在高电平中对被测方波进行计数 所测得数字即该波形频率 具体等精度测量原理请参考 http www elecfans com d 591858 html
  • Xilinx 7系列芯片选型手册的资源量怎么看

    推荐阅读AMD官方文档 该文档介绍了各种资源的具体含义 链接 7 Series FPGAs Configurable Logic Block User Guide UG474 以XC7A35T为例 Logic Cells 逻辑单元 对于7系
  • 【Xilinx】SynchronousInterruptHandler错误排查笔记

    SynchronousInterruptHandler错误排查笔记 一 ArmV8的异常处理 二 64位lscript ld的修改 三 asm vectors S的修改 四 SynchronousInterruptHandler函数解析 五
  • Xilinx AXI-memory接口 转 AXI-stream 接口(含源码)

    AXI memory接口 转 AXI stream 接口 AXI memory接口介绍 具体详情可以查看源码 AXI memory接口介绍 从图中我们可以看出memory接口有5个通道 分别是读地址通道 写地址通道 写响应通道 读数据通道
  • 采用Vivado 配置xilinx GTX的SATA设计

    从Vivado开始 配置GTX的时候 多了一个SATA协议支持 但有些小地方还需要自己另外设置 整理了一下 分享给大家 首先打开Transceivers wizard 打开页签 线速率和参考时钟选择 在协议里面选择SATA2或者SATA3
  • libero-soc许可证申请和环境配置

    环境 64位机 在哪台电脑上安装libero soc 就用哪台电脑申请许可证 1 注册 https www microsemi co 在官网注册 之后申请的许可证会发到注册时填写的邮箱 2 申请许可证 https www microsemi
  • 【PIPE】流水线设计中的基本模块

    大概分成以下几节 1 概述及协议 2 valid forward valid超前 3 bubble collapse 消除气爆 4 input output skid 不知中文怎么说 5 pipe halt 流水停顿 6 idle pres
  • FPGA实现VGA显示图片

    利用FPGA在带有VGA接口的液晶显示器上显示图片 电路原理图 端口说明 VGA R2 VGAB0的8个端口位VGA的RGB数据位 VGA HS为行同步信号 VGA VS为场同步信号 以分辨率为640x480为例 刷新速率为60Hz 每幅图
  • FPGA_MIG驱动DDR3

    FPGA MIG驱动DDR3 说明 FPGA zynq 7z100 DDR3 MT41K256M16TW 107 内存大小为512MB 数据接口为16bit 环境 Vivado2018 2 IP核 Memory Interface Gene
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • FPGA大输入数据

    我正在尝试向 FPGA 发送 4 KB 字符串 最简单的方法是什么 是我正在使用的fpga的链接 我正在使用 Verilog 和 Quartus 您的问题的答案在很大程度上取决于将数据输入 FPGA 的内容 即使没有您需要遵守的特定协议 S
  • 映射 MMIO 区域写回不起作用

    我希望对 PCIe 设备的所有读写请求都由 CPU 缓存进行缓存 然而 它并没有像我预期的那样工作 这些是我对回写 MMIO 区域的假设 对 PCIe 设备的写入仅在缓存回写时发生 TLP 有效负载的大小是缓存块大小 64B 然而 捕获的
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐

  • Invalid contextPath ‘/xxx‘: must match the start of requestPath: ‘//xxx/yyy‘

    记录一个升级spring boot 版本从2 1升级到2 6之后的错误 java lang IllegalArgumentException Invalid contextPath admin must match the start of
  • java jar killed_容器中Java 程序OOMKilled原因浅析

    背景 业务的容器化刚刚搞完 线上开始告警 容器重启 容器重启 describe pod 查看原因是OOMKilled 分析 OOMKilled 是pod 中的进程使用的内存超过了 spec containers resources limi
  • 指针(一)

    学习c语言 不学指针 等于没学 可见指针在c语言中有多重要 指针是C语言中的一个重要概念及其特点 也是掌握C语言比较困难的部分 指针定义 指针也就是内存地址 指针变量是用来存放内存地址的的变量 指针的作用是 通过指针不仅可以对数据本身 还可
  • OpenGL ES着色器语言(GLSL ES)规范 ——下篇

    文章目录 前言 分支和循环 if if else for continue break discard 着色器内置变量 函数 函数定义 规范声明 webgl内置函数 存储限定字 const attribute uniform varying
  • MYSQL 8数据库原理及应用(徐丽霞 微课版)——第一章知识要点

    目录 数据库的基本概念 数据库管理技术的发展阶段 数据库的体系结构 数据模型 关系运算 数据库的基本概念 信息与数据库 数据 Data 是描述事物的符号记录 是数据库中存储的基本对象 信息 信息的传递需要物质载体 且信息的获取和传递都要消耗
  • 业务高速增长场景下的稳定性建设实战

    背景 静儿在2017年8月25日怀着 再也不要下班时间收到报警 的美好期待加入美团金融智能支付负责核心交易 结果入职后收到的报警一天紧似一天 核心交易是整个智能支付的核心链路 承担着智能支付百分之百的流量 下面是我们的日单量增长曲线 从图中
  • postman界面变成了左右结构怎么办

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 在左上角 file settongs中设置一下
  • Linux下编辑文件并保存

    第一步 cd到该文件的目录下 第二步 vi 要编辑的文件名 进入普通模式 可以查看文件内容 第三步 输入 i 进入编辑模式 开始编辑文本 第四步 编辑之后 按ESC退出到普通模式 第五步 在普通模式下 输入 进入命令模式 第六步 在命令模式
  • ADCS攻击利用

    ADCS攻击利用 个人公众号创世信安 一 ADCS相关介绍 1 ADCS AD CS证书服务 SSL证书 可以部署企业根或者独立根建立SSL加密通道 和其他服务证书的区别在于加密强度 本次利用的漏洞产生的原因是ADCS支持的服务器角色功能错
  • spring-boot整合基本jdbc(基于oracle数据库)

    点击有惊喜 https mp weixin qq com s 2My JPTIaF02w70J CRM4A 快速搭建一个web工程 搭建完一个web工程 要想连接上oracle数据库 还得进行以下操作 1 在pom xml中引入jdbc连接
  • 奋斗的人生很精彩

    奋斗 是人生道路上永恒的主题 它意味着不懈的努力 不断的追求 以及对梦想的执着追求 在我们的人生旅途中 每个人都有自己的目标和梦想 有些人梦想成为一名成功的商人 有些人希望成为一名伟大的科学家 而有些人则渴望成为一名杰出的艺术家 无论我们的
  • Linux下线程池的代码

    此博客仅为了存放代码 Linux 加锁 线程池 头文件 include
  • 在jupyter Notebook上绘制动态曲线

    在jupyter Notebook上绘制动态曲线 1 前言 2 实现原理 3 实现源码 1 前言 在上一篇文章中介绍了在如Pycharm VsCode IDEA等 非交互式编程软件中绘制动态曲线的实现原理 那么问题来了 在如jupyter
  • Empowering Language Models with Knowledge Graph Reasoning for Open-Domain Question Answering

    本文是LLM系列文章 针对 Empowering Language Models with Knowledge Graph Reasoning for Open Domain Question Answering 的翻译 用知识图谱推理增强
  • flask入门

    一 falsk简介 Flask是一个使用 Python 编写的轻量级 Web 应用框架 其 WSGI 工具箱采用 Werkzeug 模板引擎则使用 Jinja2 Flask使用 BSD 授权 Flask是一个轻量级的可定制框架 使用Pyth
  • 树莓派4B-使用 RPI.GPIO 模块的脉宽调制(PWM)功能

    脉宽调制 PWM 是指用微处理器的数字输出来对模拟电路进行控制 是一种对模拟信号电平进行数字编码的方法 在树莓派上 可以通过对GPIO的编程来实现PWM 创建一个 PWM 实例 1 p GPIO PWM channel frequency
  • sonar 配置sonarqube分析unity中的C# 代码

    参考文档 使用SonarQube对Unity项目进行代码分析的问题记录 zerozabuu 博客园 一文搞定 SonarQube 接入 C NET 代码质量分析 狂师 博客园 需要分析的代码是unity下的C 代码 配置流程主要参考上面两个
  • React hook 判断语句内不能使用useEffect(乱序问题)

    const Parent gt const count setCount useState 0 如果这样写控制台会报错 原因继续往下看 if count gt 1 useEffect gt console log 大于1
  • win7可关闭服务

    Adaptive brightness 如果你没有使用触摸屏一类的智能调节屏幕亮度的设备 该功能就可以放心禁用 ApplicationLayer Gateway Service 为Internet连接共享提供第三方协议插件的支持 Appli
  • 数码管时钟显示按键控制 fpga实现

    目录 原理 实现 原理 数码管原理 并且该数码管是共阳极 所以段选低电平有效 片选低电平有效 段选共用8个引脚 实现 思路 分三个模块实现 1 按键消抖 按键消抖 2 计数器模块 产生需要的时钟信号数据 3 数码管驱动 将输入的数据转换为段