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

news2024/11/19 23:21:00

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

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

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

相关文章

【算法】利用分治思想解算法题:快排、归并、快速选择实战(C++)

1. 分治思想 介绍 分治法将问题划分成多个相互独立且相同或类似的子问题&#xff0c;然后递归地解决每个子问题&#xff0c;并将结果合并以得到原始问题的解。 分治思想通常包含以下三个步骤&#xff1a; 分解&#xff1a;将原始问题划分成多个规模较小、相互独立且类似的子…

如何恢复 iPhone 上永久删除的照片?

2007年&#xff0c;苹果公司推出了一款惊天动地的智能手机&#xff0c;也就是后来的iPhone。你会惊讶地发现&#xff0c;迄今为止&#xff0c;苹果公司已经售出了 7 亿部 iPhone 设备。根据最新一项调查数据&#xff0c;智能手机利润的 95% 都进了苹果公司的腰包。 如此受欢迎…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成 --【本人】

一、插件安装 1.1 搜索插件 mybatis 安装 1.2 接受安装 1.3 再次进入&#xff0c;说明安装好了 1.4 与鱼皮不同点 1&#xff09;mybatis 版本不一致 鱼皮&#xff1a; 本人&#xff1a; 2&#xff09;鱼皮需重启安装 本人不需要 1.5 【需完成 三、步骤&#xff0c;再来看】 …

webpack 5 loader

webpack 本身不能识别js&#xff0c;json外的资源&#xff0c;所以我们需要借助其他loader来处理对应的文件 CSS Loader&#xff0c;处理css 安装 npm i css-loader style-loader -D css-loader 负责讲css编译成webpack能识别的模块内容style-loader 动态创建<style&g…

SQL之CASE WHEN用法详解

目录 一、简单CASE WHEN函数&#xff1a;二、CASE WHEN条件表达式函数三、常用场景 场景1&#xff1a;不同状态展示为不同的值场景2&#xff1a;统计不同状态下的值场景3&#xff1a;配合聚合函数做统计场景4&#xff1a;CASE WHEN中使用子查询场景5&#xff1a;经典行转列&am…

【PTA-C语言】实验八-函数与指针II

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 目录——实验八-函数与指针II 6-1 移动字母&#xff08;分数 10&#xff09;6-2 删除字符&#xff08;分数 10&#xff09;6-3 函数实现字符串逆序&#xff08;分数 10&#xff09;6-4 递归计算Ackermenn函数…

CTFshow web入门web127-php特性30

开启环境: extract() 函数从数组中将变量导入到当前的符号表&#xff0c;使用数组键名作为变量名&#xff0c;使用数组键值作为变量值 举例就是?a2&#xff0c;就会变成$a2&#xff0c;这里ctf_show有个_需要构造&#xff0c;前面说过php中变量名只有数字字母下划线&#xff…

BIND-DNS配置介绍

一、主要配置文件 /etc/named.conf options { //Option 段全部配置 listen-on port 53 { 127.0.0.1; };//表示BIND将在53端口监听&#xff0c;若需要对所有IP进行监听&#xff0c;则修改为// listen-on port 53 { any; }; directory "/var/named"…

WPF+Halcon 培训项目实战(11):HS组件封装

文章目录 前言相关链接项目专栏运行环境匹配图片封装组件新增类库项目选择依赖顺序并添加Nuget修改原本矩形方法运行结果&#xff1a; 对矩形进行抽象封装抽象基类矩形抽象改造 圆形抽象封装代码运行结果 前言 为了更好地去学习WPFHalcon&#xff0c;我决定去报个班学一下。原…

leetcode2487.从链表中移除节点

文章目录 题目思路复杂度Code 题目 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8] 输出&#xff1a;[13,8] 解释&#xff1a;需要移除的节点是 5 &#xff0…

1.2作业

温湿度数据通过中断处理显示到数码管中 main.c #include "spi.h"#include"si7006.h"int main(){int i0,j0,m0,n0;int num[10] {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};SPI_init();unsigned short hum;short tem;//进行si7006的初始化si700…

关于我花费六千多组了台window+Linux主机

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 写在前面 我在2023年12月组了一台“洋垃圾”的主机&#xff0c;一边当做台式机使用&#xff0c;一边当做服务器使用。这个方案算是相对比较划算的方案。我开始是打算直接单做服务器使用的&#xff0c;以及内存…

【react-taro-canvas】用canvas手写一个数字、字母混合的行为验证码

用canvas手写一个数字、字母混合的行为验证码 实现效果源码 实现效果 源码 import Taro from "tarojs/taro"; import { View, Canvas, Input, Button } from "tarojs/components"; import { useState, useEffect } from "react"; // 画随机线函…

Android14之禁掉Selinux的两种方式(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

安装elasticsearch、kibana、IK分词器、扩展IK词典

安装elasticsearch、kibana、IK分词器、扩展IK词典 后面还会安装kibana&#xff0c;这个会提供可视化界面方面学习。 需要注意的是elasticsearch和kibana版本一定要一样&#xff01;&#xff01;&#xff01; 否则就像这样 elasticsearch 1、创建网络 因为我们还需要部署k…

cJSON代码解读

1、背景 cJSON用了很久&#xff0c;但是对它一直不太了解。这次向添加对long long类型的支持&#xff0c;一直出问题。因为有以前添加两位小数float的经历&#xff0c;我觉得会很轻松&#xff0c;没想到翻车了。于是有了这边文档&#xff0c;阅读了部分博主对cJSON的解析&…

安装VS Code到AWS EC2 Linux 2

文章目录 小结问题及解决参考 小结 本文记录了安装VS Code到AWS EC2 Linux 2。 问题及解决 安装VS Code到AWS EC2 Linux 2采取了以下步骤&#xff1a; 更新VS Code的YUM源&#xff1a; [ec2-userip-100-92-28-119 ~]$ sudo rpm --import https://packages.microsoft.com/k…

LOG滤波器原理探究---计算机视觉和特征检测

先来看几个滤波器公式&#xff1a; 高斯滤波器&#xff1a; G ( x , y ; σ ) 1 2 π σ 2 e − x 2 y 2 2 σ 2 G(x,y;\sigma) \frac{1}{2 \pi \sigma^2} e^{-\frac{x^2 y^2}{2\sigma^2}} G(x,y;σ)2πσ21​e−2σ2x2y2​ 图像的二阶导数&#xff1a; ∇ 2 f ∂ 2 f ∂…

案例086:基于微信小程序的影院选座系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

CTF流量分析经典例题详解

目录 入门题型 题目&#xff1a;Cephalopod(图片提取) 题目&#xff1a;特殊后门(icmp协议信息传输) 题目&#xff1a;手机热点(蓝牙传输协议obex,数据提取) 题目&#xff1a;想蹭网先解开密码(无线密码破解) 进阶题型 题目&#xff1a;抓到一只苍蝇(数据包筛选,数据提…