【FPGA/verilog -入门学习15】vivado FPGA 数码管显示

1,需求:使用xc720 开发板的8个数码管显示12345678

2,需求分析:

75hc595

1,74hc595驱动,将串行数据转换成并行输出。对应研究手册

2,发送之前将要发的数据,合并成高8位:SEG,低8位:SEL, 结合testbanch查看波形,使用测试代码验证显示。

 //实现承有数码管显示1
`timescale 1ns/1ps
module vlg_74hc595_v(input i_clk,input i_rest_n,input [15:0]i_data,output reg o_ds,output reg   o_shcp,output reg   o_stcp);//parameter i_sel = 8'b1111_0000; 
//parameter i_seg = 8'b1000_0000;wire clk_25m;
wire clk_12r5m;
wire clk_100m;
wire locked;clk_wiz_0 clk_div_inst(// Clock out ports.clk_out1(clk_25m),     // output clk_out1.clk_out2(clk_12r5m),     // output clk_out2.clk_out3(clk_100m),     // output clk_out3.reset(~i_rest_n), // input reset.locked(locked),       // output locked// Clock in ports.clk_in1(i_clk));      // input clk_in1//assign i_data[15:8] = i_seg;//seg7,seg6,seg5,seg4,seg3,seg2,seg1,seg0
//assign i_data[7:0] = i_sel;//s7,s6,s5,s4,s3,s2,s1,s0reg [4:0]r_cnt;//16次计
//产生o_ds 信号
always @(posedge clk_12r5m) begin
if(!i_rest_n) begino_ds <= 0;r_cnt <= 0;
end
else if(locked & r_cnt < 16)  begino_ds <= i_data[15-r_cnt];r_cnt <= r_cnt + 1;
endelse  begin r_cnt <= 0; o_ds <= 0; end
end//产生o_shcpalways @(negedge clk_25m)   beginif(!i_rest_n) o_shcp <= 0;else if(r_cnt== 0) o_shcp <= 0;else  o_shcp <= ~o_shcp;
end//产生o_stcp
always @(negedge clk_25m)   beginif(!i_rest_n) o_stcp <= 0;else if(r_cnt== 16 && o_shcp) o_stcp <= 1;else  o_stcp <= 0;
end
endmodule

分频

1,数码管以1Khz 切换1~8个数码管状态。 数码管刷新频率位 1KHZ/8 = 125hz/8ms 刷新一次

2,74hc595 更新bit 速率 12.5Mhz shcp

 //实现分屏,12.5M,50K
`timescale 1ns/1ps
module vlg_div(input i_clk,input i_rest_n,output o_clk_12r5m,output o_clk_1khz   //50*20=1000);
//`define SIMU_FLGA
`ifdef SIMU_FLGA
localparam CLK_12R5M_MAX = 50_000_000/12_500_000 -1;
localparam CLK_1KHZ_MAX   = 10-1;`else
localparam CLK_12R5M_MAX = 50_000_000/12_500_000 -1;
localparam CLK_1KHZ_MAX   = 50_000_000/1000 -1;`endif//12.5M 计数使能
reg [3:0]r_cnt_12r5m;
always @(posedge i_clk) begin
if(!i_rest_n) r_cnt_12r5m <= 0;
else if(r_cnt_12r5m < CLK_12R5M_MAX) r_cnt_12r5m <= r_cnt_12r5m +1;
else r_cnt_12r5m <= 0;
end
assign o_clk_12r5m = (r_cnt_12r5m == CLK_12R5M_MAX) ?1:0;//50K 计数使能
reg [19:0]r_cnt_1khz;
always @(posedge i_clk) begin
if(!i_rest_n) r_cnt_1khz <= 0;
else if(r_cnt_1khz < CLK_1KHZ_MAX) r_cnt_1khz <= r_cnt_1khz +1;
else r_cnt_1khz <= 0;
endassign o_clk_1khz = (r_cnt_1khz == CLK_1KHZ_MAX) ?1:0;endmodule

数据产生

1,当1kHZ 来临时,合并sel+seg = [15:0]data

2,合并前要将sel 转换成 0000_0001 即每一1 代表要选择的sel

3,合并前将数字转换成数码管 编码

 //实现将8个数码管的数值,以20ms 输出seg+sel 的值
`timescale 1ns/1ps
module vlg_data_generate(input i_clk,input i_rest_n,input i_clk_1khz,input [31:0]i_data,  //输入8个数码管的数值 ,每个数码管用4位表示,例如f:1111output reg[15:0]o_data_seg_sel //输出数码管的seg+sel 高8位seg,低8位sel);//产生20ms 的 0-7 计数
reg [7:0]r_index; //0-7
always @(posedge i_clk) beginif(!i_rest_n) r_index <= 0;else if(i_clk_1khz) beginif(r_index < 7) r_index <= r_index + 1;else r_index <= 0;end    
end//根据0-7 变换,取出对应的seg 的hex码
reg [3:0]r_hex;  
always @(posedge i_clk) beginif(!i_rest_n) r_hex <= 0;elsecase (r_index)4'd0: r_hex <= i_data[3:0];4'd1: r_hex <= i_data[7:4];4'd2: r_hex <= i_data[11:8];4'd3: r_hex <= i_data[15:12];4'd4: r_hex <= i_data[19:16];4'd5: r_hex <= i_data[23:20];4'd6: r_hex <= i_data[27:24];4'd7: r_hex <= i_data[31:28];default r_hex <=  0;endcase
end//将hex 变成数码管显示
reg [7:0]r_seg;
always @(posedge i_clk) beginif(!i_rest_n) r_seg <= 8'b1111_1111;else case (r_hex)4'h0:r_seg <= 8'b1100_0000;//c04'h1:r_seg <= 8'b1111_1001;//f94'h2:r_seg <= 8'b1010_0100;//a4 4'h3:r_seg <= 8'b1011_0000;//b0 4'h4:r_seg <= 8'b1001_1001;//99 4'h5:r_seg <= 8'b1001_0010;//92 4'h6:r_seg <= 8'b1000_0010;//82 4'h7:r_seg <= 8'b1111_1000;//f8 4'h8:r_seg <= 8'b1000_0000;//80 4'h9:r_seg <= 8'b1001_0000;//90 4'ha:r_seg <= 8'b1000_1000;//88 4'hb:r_seg <= 8'b1000_0011;//83 4'hc:r_seg <= 8'b1100_0110;//c64'hd:r_seg <= 8'b1010_0001;//a1 4'he:r_seg <= 8'b1000_0110;//86 4'hf:r_seg <= 8'b1000_1110;//8e default:r_seg <= 8'b1111_1111;//ff        endcase
end//将sel和seg 按    i_clk_50hz组合输出
always @(posedge i_clk) beginif(!i_rest_n) o_data_seg_sel <= 0;else if(i_clk_1khz &i_clk) begino_data_seg_sel[7:0] <=  (1 << r_index);  //0-7o_data_seg_sel[15:8] <= r_seg;end    else ;
endendmodule

输入输出

测试代码使用localparam data 赋值形式

正式代码使用vio 输入

 //vlg design 显示数码箿`timescale 1ns/1ps
module vlg_design(input i_clk,input i_rest_n,output  o_ds,output  o_shcp,output  o_stcp);//parameter i_data = 32'h12345678; wire [15:0]w_data_seg_sel;
wire w_clk_12r5m;
wire w_clk_1khz;
wire[32:0] w_data;vio_0 your_instance_name (.clk(i_clk),                // input wire clk.probe_out0(w_data)  // output wire [31 : 0] probe_out0
);//
vlg_74hc595_v vlg_74hc595_v_inst(
.i_clk(i_clk),
.i_rest_n(i_rest_n),
.i_data(w_data_seg_sel),
.o_ds(o_ds),
.o_shcp(o_shcp),
.o_stcp(o_stcp) );//vlg_data_generate vlg_data_generate_inst(.i_clk(i_clk),
.i_rest_n(i_rest_n),
.i_clk_1khz(w_clk_1khz),
.i_data(w_data),
.o_data_seg_sel(w_data_seg_sel) 
);//vlg_div vlg_div_inst(
.i_clk(i_clk),
.i_rest_n(i_rest_n),
.o_clk_12r5m(w_clk_12r5m),
.o_clk_1khz(w_clk_1khz) 
);endmodule

xdc

set_property PACKAGE_PIN Y18 [get_ports i_clk]
set_property PACKAGE_PIN F15 [get_ports i_rest_n]
set_property IOSTANDARD LVCMOS33 [get_ports i_clk]
set_property IOSTANDARD LVCMOS33 [get_ports i_rest_n]set_property IOSTANDARD LVCMOS33 [get_ports o_ds]
set_property IOSTANDARD LVCMOS33 [get_ports o_shcp]
set_property IOSTANDARD LVCMOS33 [get_ports o_stcp]
set_property PACKAGE_PIN M18 [get_ports o_ds]
set_property PACKAGE_PIN F4 [get_ports o_shcp]
set_property PACKAGE_PIN C2 [get_ports o_stcp]

测试结果

3,调试记录

2023年12月30日

问题:本想显示全1的,结果成这样

2023年12月31日

解决了,撸了一遍视频,找到原因是时钟频率的问题,我直接把数据传输的时钟用的 50M。应该是74HC595 不支持这么高。现在换成12.5M 正常了。

2024年1月2日星期二

  1. 完成使用vio 实现vivado自动配置数码管显示

readme

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring配置提示: File is included in 4 contexts

问题描述&#xff1a; spring配置文件上面提示&#xff1a; mvc application context in module studyDemo file is included in 4 contexts 导致原因&#xff1a;因为所有的配置文件都没有放在同一个上下文中 所谓File is included in 4 contexts是因为spring的配置文件放…

通过IP地址防范钓鱼网站诈骗的有效措施

随着互联网的普及&#xff0c;钓鱼网站诈骗成为一种广泛存在的网络犯罪行为。通过冒充合法网站&#xff0c;攻击者试图窃取用户的敏感信息。本文将探讨如何通过IP地址防范钓鱼网站诈骗&#xff0c;提供一系列有效的措施&#xff0c;以加强网络安全&#xff0c;保护用户免受诈骗…

css 保持元素宽高比 随页面宽度变化高度自适应

目录 1.效果展示 2.代码内容 3.代码解析 &#xff08;1&#xff09;分析inner类写法 &#xff08;2&#xff09;分析container类写法 1.效果展示 2.代码内容 <div class"item"><div class"inner"><di class"container">…

静态网页设计——极乐迪斯科(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV11k4y1X7mH/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

MySQL四大引擎,数据库管理,数据表管理,数据库账号管理

MySQL四大引擎 InnoDB InnoDB引擎是MySQL默认的存储引擎。它支持事务和行级锁定&#xff0c;并具有高并发性和数据完整性保护的特性。InnoDB适用于具有复杂查询和高并发读写操作的应用程序。MyISAM InnoDB引擎特点和优势 事务支持&#xff1a;InnoDB支持ACID&#xff08;原子…

HDMI彩条显示实验与方块移动实验

一、HDMI接口简介 一种数字音视频接口标准&#xff0c;提供高质量的数字音视频传输&#xff0c;同时支持多通道音频、高分辨率视频和其他数据传输功能。提供更高的数据传输带宽&#xff08;带宽&#xff1a;1s内传输多少比特数据&#xff09; 数字传输&#xff1a; HDMI是一种全…

C++:类和对象(3)

目录 1.构造函数调用规则 2.深拷贝和浅拷贝 3.初始化列表 4.类对象作为类成员 1.构造函数调用规则 默认情况下&#xff0c;C编译器至少给类添加三个函数&#xff1a; 1.默认构造函数(无参&#xff0c;函数体为空) 2.默认析构函数(无参&#xff0c;函数体为空) 3.默认拷贝构…

标签函数 - 打造JavaScript组件

&#x1f4e2; 鸿蒙专栏&#xff1a;想学鸿蒙的&#xff0c;冲 &#x1f4e2; C语言专栏&#xff1a;想学C语言的&#xff0c;冲 &#x1f4e2; VUE专栏&#xff1a;想学VUE的&#xff0c;冲这里 &#x1f4e2; CSS专栏&#xff1a;想学CSS的&#xff0c;冲这里 &#x1f4…

Flutter 混合开发 - aar打包

背景 项目接入 Flutter 后有两种方式&#xff0c;一种是 module 引入开发&#xff0c;一种是 aar 依赖开发。当前项目中在 Debug 阶段为了方便调试采用 module 开发&#xff0c;在发版时&#xff08;即 Release 阶段&#xff09;采用 aar 依赖引入。为了配合这种模式就需要在 …

高可用分布式部署Spark、完整详细部署教程

前言 Spark 是 UC Berkeley AMP Lab 开源的通用分布式并行计算框架。 Spark基于map reduce算法实现的分布式计算&#xff0c;拥有Hadoop MapReduce所具有的优点&#xff1b;但不同于MapReduce的是Job中间输出和结果可以保存在内存中&#xff0c;从而不再需要读写HDFS&#xff…

Spring AI和Ollama

概述 Spring AI 不仅提供了与 OpenAI 进行API交互&#xff0c;同样支持与 Ollama 进行API交互。Ollama 是一个发布在GitHub上的项目&#xff0c;专为运行、创建和分享大型语言模型而设计&#xff0c;可以轻松地在本地启动和运行大型语言模型。 Docker环境安装Ollama 1.获取D…

AIGC带给开发者的冲击

未来会有两种开发者&#xff0c;一种是会使用AIGC工具的开发者另一种是不会使用AIGC的开发者&#xff0c;AIGC的出现提高了开发效率和代码质量&#xff0c;对开发者意味着需要不断学习和适应新的技术和工作范式&#xff0c;开发者可以把更多的精力放在高级抽象的定义以及更高维…

JS的防抖和节流

目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求&#xff1a;根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…

STHS34PF80人体存在传感器(1)----获取人体存在状态

STHS34PF80人体存在传感器.1--获取人体存在状态 概述视频教学样品申请完整代码下载主要特点硬件准备接口最小系统图生成STM32CUBEMX串口配置IIC配置CS设置串口重定向参考案例获取ID温度测量滤波方式智能识别算法使用块数据更新&#xff08;BDU&#xff09;功能设置ODR速率获取状…

Stable Diffusion架构的3D分子生成模型 GeoLDM - 测评与代码解析

之前&#xff0c;向大家介绍过3D分子生成模型 GeoLDM。 GeoLDM按照Stable Diffusion架构&#xff0c;将3D分子生成的扩散过程运行在隐空间内&#xff0c;优化了基于扩散模型的分子生成。可能是打开Drug-AIGC的关键之作。让精确控制分子生成有了希望。 详见&#xff1a;分子生成…

Python 中的==操作符 和 is关键字

Python是一种功能强大的通用编程语言&#xff0c;提供了各种比较值和对象的方法。其中包括操作符和is关键字&#xff0c;它们的用途不同&#xff0c;但由于它们有时可以达到相同的目的&#xff0c;所以经常会被混淆。在本文中&#xff0c;我们将深入研究和is之间的区别&#xf…

海外分支访问国内服务器系统慢怎么办?

在全球业务不断扩张的今天&#xff0c;企业面临着海外分支访问国内总部服务器系统慢的问题。为了解决这一挑战&#xff0c;我们引入了lxway全球系统专网产品&#xff0c;为企业提供高效、安全的全球网络连接方案。通过解析技术瓶颈和专网的优势&#xff0c;本文将揭示如何借助先…

设计模式之过滤器模式

目录 1.简介 2.过滤器的实现 2.1.过滤器的角色 2.2.类图 2.3.具体实现 3.过滤器模式的优点 4.过滤器模式的不足 5.适用的场景 1.简介 过滤器模式&#xff08;Filter Pattern&#xff09;或标准模式&#xff08;Criteria Pattern&#xff09;是一种结构型设计模式&…

【Python学习】Python学习3-变量类型

目录 【Python学习】Python学习3 前言变量赋值多个变量赋值标准数据类型Python Numbers(数字)Python List&#xff08;列表&#xff09;Python Tuple&#xff08;元组&#xff09;Python Dictionary&#xff08;字典&#xff09; Python数据类型转换总结参考 文章所属专区 Py…

【数据库原理】(9)SQL简介

一.SQL 的发展历史 起源&#xff1a;SQL 起源于 1970 年代&#xff0c;由 IBM 的研究员 Edgar F. Codd 提出的关系模型概念演化而来。初期&#xff1a;Boyce 和 Chamberlin 在 IBM 开发了 SQUARE 语言的原型&#xff0c;后发展成为 SQL。这是为了更好地利用和管理关系数据库。…