【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.hqwc.cn/news/316551.html

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

相关文章

我在CSDN的2023年

一、引言 在2023年的这一年当中&#xff0c;在CSDN的生活让我得到许多知识与启发&#xff0c;也让我获得一些快乐和成就 二、自己的收获 在这一年当中&#xff0c;我从一个只会看别人写的文章解决问题到&#xff0c;可以自己写文章帮别人解决问题&#xff0c;这种成就感是极大…

内衣迷你洗衣机什么牌子好?四款最好用的迷你洗衣机品牌

最近这两年在洗衣机中火出圈的内衣洗衣机&#xff0c;它不仅可以清洁我们较难清洗的衣物&#xff0c;自带除菌功能&#xff0c;可以让衣物上的细菌&#xff0c;还能在清洗的过程中呵护我们衣物的面料&#xff0c;虽然说它是内衣洗衣机&#xff0c;它的功能不止可以清洗内衣&…

(NeRF学习)NeRFStudio安装win11

参考&#xff1a; 【深度学习】【三维重建】windows11环境配置tiny-cuda-nn详细教程nerfstudio介绍及在windows上的配置、使用NeRFStudio官网githubRuntimeError: PytorchStreamReader failed reading zip archive: failed finding central directory原因及解决 目录 requireme…

Linux使用yum命令安装postgrepsql

1.检查安装源 yum search postgresql 2.安装 yum install postgresql-server 3.启动数据库 service postgresql start 4.查看启动状态 service postgresql status 5.登陆测试 su - postgrep psql \l6.远程连接 6.1修改配置文件 在pg_hba.conf增加host all all 0.0.0…

地产集团如何利用数据做好经营分析?

企业数字化转型离不开数据的支持&#xff0c;如何通过数据的沉淀、拉通及分析&#xff0c;更好的赋能业务和管理实现价值创造&#xff0c;是当前地产数字化面临的首要问题。 一、地产集团数据处理和应用的现状 目前地产集团都是多业态的发展模式&#xff0c;包括地产住宅开发、…

python入门

目录 1.数据的输入和输出 1.输入 ​编辑 2.输出 2.if语句&#xff0c;条件判断 3.循环 1.while 2.for 1.数据的输入和输出 python不用像c语言一样给一个变量初始化一个类型&#xff0c;直接赋值就行了 像这样&#xff0c;连分号都不用加 这里我用python自带的 type函数…

How to understand the Pangu model in Huawei Cloud

How to understand the Pangu model in Huawei Cloud 参考文献 产品首页 / 盘古大模型文档首页 / 盘古大模型

Modbus 通信协议 二

Modbus 常用缩写 通用Modbus帧结构 -应用数据单元&#xff08;ADU&#xff09; Modbus数据模型 Modbus ADU 和 PDU 的长度 Modbus PDU结构 串行链路上的 Modbus 帧结构 Modbus 地址规则 ASCLL 模式 和 RTU 模式的比较 RTU 模式 RTU 模式位序列 帧格式 帧的标识与鉴别 CRC 循环冗…

Windows mp4info使用教程(提取MP4盒子信息、MP4 box信息、box分析工具、atom分析工具)

参考文章&#xff1a;https://www.onlinedown.net/soft/617940.htm 文章目录 软件主界面打开视频文件点击左方能看到各盒子信息 软件主界面 双击打开软件&#xff1a; 打开视频文件 点击左方能看到各盒子信息 比我用xxd命令查看原始16进制数据方便多了。 ᅟᅠ        …

利用提示工程,提升LLM将自然语言转化为SQL的准确性

大型语言模型 (LLM) 已展现出理解自然语言提示并生成连贯响应的卓越能力。 这为将自然语言翻译成 SQL 等结构化查询语言开辟了新的可能性。 过去&#xff0c;编写 SQL 查询需要技术专业知识&#xff0c;而LLM允许任何人用简单的英语描述他们想要的内容&#xff0c;并自动生成相…

draw流程图工具导入云原生(CNCF)相关控件

目录 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 2、引用自己的资源链接&#xff1a; 1、通过draw导入xml文件&#xff0c;获取云原生相关的空间 导入资源图库&#xff0c;资源放在下方&#xff0c;大家可以下载&#xff1a; 2、引用自己的资源链接&#xff1a;…

JAVAEE初阶相关内容第二十弹--HTTP协议

写在前&#xff1a;2024年啦&#xff01;新的一年要努力学习啦 本篇博客围绕HTTP协议&#xff0c;对HTTP协议进行了解&#xff0c;需要理解其工作过程&#xff0c;对HTTP协议格式要清楚&#xff0c;通过抓包工具进行协议分析&#xff0c;认识“方法”、“请求报头”&#xff0c…