【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,s0

reg [4:0]r_cnt;//16次计
//产生o_ds 信号
always @(posedge clk_12r5m) begin
if(!i_rest_n) begin
    o_ds <= 0;
    r_cnt <= 0;
end
else if(locked & r_cnt < 16)  begin
    o_ds <= i_data[15-r_cnt];
    r_cnt <= r_cnt + 1;
end
    else  begin r_cnt <= 0; o_ds <= 0; end
end

//产生o_shcp
 
always @(negedge clk_25m)   begin
    if(!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)   begin
    if(!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;
end

assign 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:1111
    output 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) begin
    if(!i_rest_n) r_index <= 0;
    else if(i_clk_1khz) begin
        if(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) begin
    if(!i_rest_n) r_hex <= 0;
    else
        case (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) begin
    if(!i_rest_n) r_seg <= 8'b1111_1111;
    else 
        case (r_hex)
        4'h0:r_seg <= 8'b1100_0000;//c0
        4'h1:r_seg <= 8'b1111_1001;//f9
        4'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;//c6
        4'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) begin
    if(!i_rest_n) o_data_seg_sel <= 0;
    else if(i_clk_1khz &i_clk) begin
         o_data_seg_sel[7:0] <=  (1 << r_index);  //0-7
         o_data_seg_sel[15:8] <= r_seg;
         end    
         else ;
end
    
endmodule

输入输出

测试代码使用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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二蛋赠书十三期:《一书读懂物联网》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

代码随想录算法训练DAY18|二叉树5

算法训练DAY18|二叉树5 513.找树左下角的值 力扣题目链接 给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 示例 1: 示例 2: 思路 本题要找出树的最后一行的最左边的值。此时大家应该想起用层序遍历是非常简单的了&#xff0c;反而用递归的话会比较难一点。 我…

云原生学习系列之基础环境准备(虚拟机搭建)

最近由于工作需要开始学习云原生相关内容&#xff0c;为方便学习操作&#xff0c;准备在外网搭建自己的环境&#xff0c;然后进行相关的练习&#xff0c;搭建环境的第一步便是虚拟机的安装。 基础软件 这里我用到的是CentOS-7-x86_64的操作系统。 链接&#xff1a;https://pa…

使用宝塔在Linux面板搭建网站,并实现公网远程访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

【Web】CTFSHOW元旦水友赛部分wp

目录 ①easy_include ②easy_web ③easy_login web一共5题&#xff0c;我出了3题&#xff0c;巧的是好像师傅们也只出了3题&#xff0c;跨年拿旗还是很快乐的&#xff0c;下面直接贴出自己的wp. ①easy_include pearcmd不解释 这里主要是 &#xff0c;file://协议支持以fi…

CSS animation动画和关键帧实现轮播图效果HTML

CSS animation动画和关键帧实现轮播图效果HTML 这轮播图效果使用h5和css3实现效果&#xff0c;不需要js控制&#xff0c;但是其中的缺点就是不能使用鼠标进行切换效果。 具有代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

使用echarts的bmap配置项绘制区域轮廓遮罩

示例图 代码 <template><div id"map" style"width: 100%; height: 100vh"></div> </template><script> import * as echarts from "echarts"; import "echarts/extension/bmap/bmap"; export default…

第28关 k8s监控实战之Prometheus(一)

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。对于运维开发人员来说&#xff0c;不管是哪个平台服务&#xff0c;监控都是非常关键重要的。 在传统服务里面&#xff0c;我们通常会到zabbix、open-falcon、netdata来做服务的监控&#xff0…

Zookeeper之Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。第三方的Java客户端API&#xff0c;比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…

2.4信道复用技术

目录 2.4信道复用技术2.4.1频分复用、时分复用和统计时分复用频分复用FDM&#xff08;Frequency Division Multiplexing&#xff09;时分复用TDM&#xff08;Time Division Multiplexing&#xff09;统计时分复用STDM&#xff08;Statistic TDM&#xff09; 2.4.2波分复用2.4.3…

IIS通过ARR实现负载均衡

一、实现整体方式介绍 项目中部署在windows服务器上的项目,需要部署负载均衡,本来想用nginx来配置的,奈何iis上有几个项目,把80端口和443端口占用了,nginx就用不了了(因为通过域名访问的,必须要用80和443端口),只能通过IIS的方式实现了。 这里用2个服务在一台机器上…

mysql: 2006, ‘MySQL server has gone away‘

一、错误问题 这个问题是在迁移数据库、备份还原或数据导入时报错&#xff1a;2006, ‘MySQL server has gone away‘ 二、出现原因 sql操作的时间过长&#xff0c;或者是传送的数据太大(例如使用insert ... values的语句过长&#xff0c; 这种情况可以通过修改max_allowed_pac…

魔改Stable Diffusion,开源创新“单目深度估计”模型

单目深度估计一直是计算机视觉领域的难点。仅凭一张 RGB 图像,想要还原出场景的三维结构,在几何结构上非常不确定,必须依赖复杂的场景理解能力。 即便使用更强大的深度学习模型来实现&#xff0c;也面临算力需求高、图像数据注释量大、泛化能力弱等缺点。 为了解决这些难题&a…

C# WinForm MessageBox自定义按键文本 COM组件版

c# 更改弹窗MessageBox按钮文字_c# messagebox.show 字体-CSDN博客 需要用到大佬上传到百度云盘的Hook类&#xff0c;在大佬给的例子的基础上改动了点。 加了ok按键&#xff0c;还原了最基础的messageBox。 为了适配多语言&#xff0c;增加ReadBtnLanguge方法。 应用时自己…

rime中州韵 inputShow lua Filter

在 rime中州韵 inputShow lua Translator 一文中&#xff0c;我们通过 inputShow.lua 定制了 inputShow_translator&#xff0c;这使得我们的输入方案可以将用户输入的字符透传到候选列表中来。如下&#x1f447;&#xff1a; &#x1f446;上图中我们在候选列表中看到了 inpu…

vmware安装龙蜥操作系统

vmware安装龙蜥操作系统 1、下载龙蜥操作系统 8.8 镜像文件2、安装龙蜥操作系统 8.83、配置龙蜥操作系统 8.83.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载龙蜥操作系统 8.8 镜像文件 这里选择 2023年2月发布的 8.8 版本 官方下载链接 https://mirro…

计算机网络-以太网交换基础

一、网络设备的演变 最初的网络在两台设备间使用传输介质如网线等进行连接就可以进行通信。但是随着数据的传输需求&#xff0c;多个设备需要进行数据通信时就需要另外的设备进行网络互联&#xff0c;并且随着网络传输的需求不断更新升级。从一开始的两台设备互联到企业部门内部…

如何在iPhone设备中查看崩溃日志

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

QQ邮件发送(PHP的Laravel)

1. 开启 QQ 邮箱的 SMTP 支持 2.里面会一个类似于密码之类&#xff08;复制一下&#xff09; 3.然后再 .env文件里面配置一下 MAIL_DRIVERsmtp —— 使用支持 ESMTP 的 SMTP 服务器发送邮件&#xff1b; MAIL_HOSTsmtp.qq.com —— QQ 邮箱的 SMTP 服务器地址&#xff0c;必…

欢迎提交pr共同改进项目, pr的含义?

"提交PR"在软件开发和编程领域是一个常用术语&#xff0c;特别是在使用版本控制系统如Git时。这里的“PR”指的是“Pull Request”&#xff0c;它是一种通知项目维护人员您已经完成了一些代码改动并希望将这些改动合并到主项目中的方式。简单来说&#xff0c;当您对一…