issp调试数码管显示_issp电路-程序员宅基地

技术标签: Verilog  

项目名称

issp数码管显示

具体要求

对数码管驱动电路进行设计,并利用In system sources and probes editor(ISSP)输入显示的数据,在数码管上正常显示

设计说明

本设计采用的是8位8段的数码管(8位代表8个数码管),每个数码管的结构图如下,下图为共阳极数码管,共阴极与共阳极数码管的的区别在于,公共端是接到高电平还是低电平。数码管的那个段需要点亮时,只需要给所对应的段给低电平例如如果要显示数字0,只需将a、b、c、d、e、f置0,其他段置1即可。

                           

数码管可以显示0-F, 共阳极数码管显示的译码格式如下。

显示的内容         段码(二进制)     段码(16进制)
a b c d e f g h
0 0 0 0 0 0 0 1 1 8'hc0
1 1 0 0 1 1 1 1 1 8'hf9
2 0 0 1 0 0 1 0 1 8'ha4
3 0 0 0 0 1 1 0 1 8'hb0
4 1 0 0 1 1 0 0 1 8'h99
5 0 1 0 0 1 0 0 1 8'h92
6 0 1 0 0 0 0 0 1 8'h82
7 0 0 0 1 1 1 1 1 8'hf8
8 0 0 0 0 0 0 0 1 8'h80
9 0 0 0 0 1 0 0 1 8'h90
a 0 0 0 1 0 0 0 1 8'h88
b 1 1 0 0 0 0 0 1 8'h83
c 0 1 1 0 0 0 1 1 8'hc6
d 1 0 0 0 0 1 0 1 8'ha1
e 0 1 1 0 0 0 0 1 8'h86
f 0 1 1 1 0 0 0 1 8'h8e

       一般为了节约IO口的资源,数码管 的段选一般接在一起,如果要点亮第一个和第三个数码管,只需要将所对应的位选打开,根据要显示的内容打开段选,但是如果说要同时只显示第一个码管的a段和第二个数码管的b段就没办法实现,因为打开位选之后,打开a段之后,第二个数码管的a段也是打开的。所以就要利用人眼的视觉暂留效果,可以让第一个数码管显示a段,等待1ms之后再显示第二个数码管的b段,在人眼睛看到的是同时显示的。

数码管驱动模块设计架构

cnt产生1ms的标志信号,每个1ms到来改变一次数码管的位选,进行移位。 data_in为数码管输入的内容,经过位选之后,输出选择的数码管的内容,数码管的内容经过lut进行译码转化为16进制显示。

           

由于本次输出的seg和sel采用两块8位74HC595芯片串转并进行输出,节约IO资源。将两块芯片看成一个模块,则为16位的串转并进行输出。ds是数据端口串行数据输入,shcp为移位寄存器的时钟输入,stcp存储寄存器时钟输入。

下图为部分时序图,当shcp为时钟下降沿时,输入数据的最高位,数据最高位最终从第二个移位寄存器进行输出到段选所以输入数据的组成为{seg,sel}, ds在每个shcp的下降沿进行输入数据,上升沿时数据保持不变,由于总共要输入16位数据,所以需要16个下降沿,待16位数据全部输入后,再来一个时钟上升沿数据并行输出。

具体的设计过程是 ,所需要的shcp的时钟设置为12.5MHz,所以先生成12.5M的时钟,由于每个下降沿需要对数据进行输入,上升沿保持不变。设计一个边沿检测电路对shcp的上升沿和下降沿进行检测 ,需要检测到32个,因为从0-31计数进行数据输入,开始计数的时候是从下降沿开始计数,在计数31时刚好也是一个下降沿,下一个上升沿 stcp输出一个高电平,数据进行并行输出  。

           

       这里要注意的是第一次计数是从下降沿开始计数,之后是来一个下降沿或者上升沿计数器加一,这里笔者采用状态机来实现,可能还有更多的方法,但是笔者习惯使用状态机,因为百分之90的逻辑都可以用状态机来实现。这里普通的计数器没办法实现,第一个状态先检查下降沿,检测到之后,跳转状态2计数器加1,检测到有上升沿或者下降沿并且未计满32,计数器加1,  如果没有检测到上升沿或者下降沿继续等待,如果检测到了,并且计满32返回状态1。

                                        

生成issp的ip核

这里没有用到probe,将它的位宽设置为0,将源位宽(数据输入)定义为32,创建好ip核之后,ctrl+o快捷键可以快速打开文件。

     

代码设计

顶层模块设计

module sel_seg_top(
	input	clk,
	input	rst_n,
	output	shcp,
	output	stcp,
	output	ds
);
wire [31:0] data_in;
issp  issp(
	.probe(),
	.source(data_in)
);

wire [7:0] sel;
wire [7:0] seg;
sel_seg sel_seg(
	.clk(clk),
	.rst_n(rst_n),
	.data_in(data_in),
	.sel(sel),
	.seg(seg)
);
hc595  hc595(
	.clk(clk),
	.rst_n(rst_n),
	.data({seg,sel}),
	.shcp(shcp),
	.ds(ds),
	.stcp(stcp)
);

endmodule

 数码管显示模块

module sel_seg(
	input			clk,
	input			rst_n,
	input [31:0]data_in,
	output   [7:0] sel,
	output	reg[7:0]	seg
);

//每1ms改变一下位选

reg [19:0] cnt;
localparam cnt_top=20'd50000;
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		cnt<=0;
	else if(cnt<cnt_top-1)
		cnt<=cnt+1;
	else
		cnt<=0;
wire delay_1ms_done=(cnt==cnt_top-1)?1:0;

//数码管位选移位,每隔1ms改变一个数码管显示

reg [7:0] sel_r;
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		sel_r<=8'b0000_0001;
	else if(delay_1ms_done)begin
		if(sel_r==8'b1000_0000)
			sel_r<=8'b0000_0001;
		else
			sel_r<=sel_r<<1;
	end
	else
		sel_r<=sel_r;
	
选择要显示的数码管
reg [3:0] disp;//显示的数码管
always@(*)
begin
		case(sel_r)
			8'b0000_0001:disp<=data_in[3:0];
			8'b0000_0010:disp<=data_in[7:4];
			8'b0000_0100:disp<=data_in[11:8];
			8'b0000_1000:disp<=data_in[15:12];
			8'b0001_0000:disp<=data_in[19:16];
			8'b0010_0000:disp<=data_in[23:20];
			8'b0100_0000:disp<=data_in[27:24];
			8'b1000_0000:disp<=data_in[31:28];
			default:disp<=0;
		endcase
end
	
//选择的数码管显示的内容
always@(*)
	if(!rst_n)
		seg<=0;
	else begin
		case(disp)
			4'h0:seg<=8'hc0;
			4'h1:seg<=8'hf9;
			4'h2:seg<=8'ha4;
			4'h3:seg<=8'hb0;
			4'h4:seg<=8'h99;
			4'h5:seg<=8'h92;
			4'h6:seg<=8'h82;
			4'h7:seg<=8'hf8;
			4'h8:seg<=8'h80;
			4'h9:seg<=8'h90;
			4'ha:seg<=8'h88;
			4'hb:seg<=8'h83;
			4'hc:seg<=8'hc6;
			4'hd:seg<=8'ha1;
			4'he:seg<=8'h86;
			4'hf:seg<=8'h8e;
			default:seg<=0;
		endcase
	end
	
assign sel=sel_r;
endmodule

位选和段选数据串转并进行输出

module hc595(
	input			clk,
	input			rst_n,
	input	[15:0]data,
	output		shcp,
	output	reg	ds,
	output	reg	stcp
);


//生成12.5M的时钟
reg [3:0] cnt;
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		cnt<=0;
	else if(cnt<3)
		cnt<=cnt+1;
	else
		cnt<=0;
wire shcp_clk=(cnt<2)?1:0;
assign shcp=shcp_clk;

//边沿检测
reg shcp_clk_c1;
reg shcp_clk_c2;
always@(posedge clk or negedge rst_n)
	if(!rst_n)begin
		shcp_clk_c1<=0;
		shcp_clk_c2<=0;
	end
	else begin
		shcp_clk_c1<=shcp_clk;
		shcp_clk_c2<=shcp_clk_c1;
	end

wire nedge=shcp_clk_c2  && (~shcp_clk_c1);
wire pedge=shcp_clk_c1  && (~shcp_clk_c2);

//对shcp时钟上升沿和下降沿进行计数,采用状态机进行实现
reg [5:0] shcp_cnt;
reg state;
always@(posedge clk or negedge rst_n)
	if(!rst_n)begin
		shcp_cnt<=0;
		state<=0;
	end
	else begin
		case(state)
		0:	begin
				if(nedge)begin
					shcp_cnt<=shcp_cnt+1;
					state<=1;
				end
				else
					state<=0;
			end	
		1:	begin
				if(nedge || pedge)begin
					if(shcp_cnt<32)
						shcp_cnt<=shcp_cnt+1'b1;
					else
						shcp_cnt<=0;
				end
				else
					state<=state;
			end
		default:;
		endcase
	end
//---------------------------------------------//	
always@(posedge clk or negedge rst_n)
	if(!rst_n)
		begin
			stcp<=0;
			ds<=0;
		end
	else
begin
		case(shcp_cnt)
			6'd0	:	begin	ds<=data[15];stcp<=0;	end
			6'd1	:	;	
			6'd2	:	ds<=data[14];
			6'd3	:	;
			6'd4	:	ds<=data[13];	
			6'd5	:	;	
			6'd6	:	ds<=data[12];	
			6'd7	:	;	
			6'd8	:	ds<=data[11];	
			6'd9	:	;	
			6'd10	:	ds<=data[10];	
			6'd11	:	;	
			6'd12	:	ds<=data[9];	
			6'd13	:	;	
			6'd14	:	ds<=data[8];	
			6'd15	:	;	
			6'd16	:	ds<=data[7];	
			6'd17	:	;	
			6'd18	:	ds<=data[6];	
			6'd19	:	;	
			6'd20	:	ds<=data[5];	
			6'd21	:	;	
			6'd22	:	ds<=data[4];	
			6'd23	:	;	
			6'd24	:	ds<=data[3];	
			6'd25	:	;	
			6'd26	:	ds<=data[2];	
			6'd27	:	;	
			6'd28	:	ds<=data[1];	
			6'd29	:	;	
			6'd30	:	ds<=data[0];	
			6'd31	:	;	
			6'd32	:	stcp=1;	
			default:begin	ds<=0;stcp<=0;	end
		endcase
end


		

	
	
endmodule

利用issp进行显示

全编译并配置好代码之后,打开tool->issp,在name中将数据格式改为16进制,随便输入要显示的数据,可以正常显示。

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43533751/article/details/107149667

智能推荐

hdu 1878 欧拉回路,图的连通性判断_含有欧拉回路的图必须是连通图是否正确-程序员宅基地

文章浏览阅读1.8k次。题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1878判断图上是否有欧拉回路,首先要求是连通图,然后每个顶点的度数必须都为偶数(如果存在两个顶点度数为奇数则是存在欧拉通路)用dfs求连通分支的个数代码:#include#include#include#includeusing namespace std;vector G[_含有欧拉回路的图必须是连通图是否正确

HTML+CSS写一个简单的网页界面-程序员宅基地

文章浏览阅读3.1k次,点赞4次,收藏52次。学习了HTML和CSS入门的基本命令后,写出来一个简单的登录网页界面,可以跳转、登录。

【JavaSE Pro】 Java 进阶 笔记汇总(更新中)_java pro-程序员宅基地

文章浏览阅读159次。【JavaSE Pro】 Java进阶笔记汇总_java pro

如何使用非暴力破解方法将一个整数可以拆成两个整数的平方和,给出python代码...-程序员宅基地

文章浏览阅读1.3k次。首先,您可以使用数学方法将一个整数表示为两个整数的平方和。例如,将整数n表示为两个整数的平方和的公式为:n = a^2 + b^2您可以使用高斯求和公式来求解这个方程,即:a = sqrt((n/2) + sqrt(n))b = sqrt((n/2) - sqrt(n))当然,您也可以使用暴力破解的方法,即对于给定的n,枚举a和b的所有可能值,直到找到满足条件的a和b为止。这种方法的时间..._一个数 拆成两个数的平方和

windows下ant+jmeter生成html报告_jmeter+ant发送邮件中文乱码-程序员宅基地

文章浏览阅读603次。一、jmeter+ant+jenkins搭建自动化持续集成环境1.工具准备jdk1.8ant1.9jmeter4.02.build.xml1.将build.xml文件放入ant-bin下2.编辑build.xml3.jmeter生成jtl格式的结果报告的路径4.jmeter生成html格式的结果报告的路径5.声明要运行的脚本"*.jmx"指包含此目录下的所有jmeter脚本6..._jmeter+ant发送邮件中文乱码

MT2523用户手册,MT2523设计指南资料-程序员宅基地

文章浏览阅读1.9k次。LinkIt_MT2523_HDK_Users_GuideMediaTek LinkitMT2523硬件开发工具包(Hdk)是由ARM Cortex-m4核-b驱动的iOT和可穿戴应用的实时操作系统的全功能开发平台。微控制器单元(MCU)。HDK具有丰富的连接特性和接口,如SPI、I2S、PCM、UART、ADC、PWM、JTAG和时钟发生器。Linkit MT2523 hdk可以使用传..._mt2523

随便推点

ORACLE表赋权,存储过程赋权_oracle存储过程赋权-程序员宅基地

文章浏览阅读9.2k次。把一个表的查询,插入,修改,删除.....赋给另一个用户grant select, insert, update, delete, references, alter, index on 表名 to 用户名 grant select, insert, update, delete, references, alter, index on O_C_ZHSB_GRYHZH to EAST_MODE..._oracle存储过程赋权

shell习题100(十二)_shell 一百题-程序员宅基地

文章浏览阅读1k次。题目要求在文本文档1.txt第5行(假设文件行数大于5)后面增加如下内容:# This is a test file.# Test insert line into this file.参考答案#!/bin/bash#这个脚本用来给文件增加行#作者:猿课-阿铭 www.apelearn.com#日期:2018-11-01n=0cat 1.txt |while read li..._shell 一百题

flask使用80端口_flask 80端口-程序员宅基地

文章浏览阅读3.8k次。flask通过nginx转发80端口背景依赖包nginx配置gunicorn配置项目启动背景最近做一个项目通过flask框架完成,由于flask默认端口是5000,为了不暴露端口,需要使用80,但是发现flask直接用80端口无法使用,后面就想到通过该80端口进行转发。依赖包gunicornGunicorn是一个unix上被广泛使用的高性能的Python WSGI UNIX HTTP..._flask 80端口

Nano编辑器_nano编辑器列号-程序员宅基地

文章浏览阅读393次。1.在Linux操作系统中,有很多的文本编辑器,最为重要的就是vi文本编辑器,下面来介绍一个简单的nano文本编辑器。2.nano的使用简单,我们可以直接加上文件名就能够打开一个旧文件或新文件,我们可以打开一个旧文件编辑它,也可以打开一个新文件,即不管这个文件存不存在都是可以打开的!(1).下面,我们在终端输入命令nano xg.txt后,如下图所示:从上图可以看到,第一行是在声明nano的版..._nano编辑器列号

SpringCloud学习之Hystrix请求熔断与服务降级(六)_hystrix演练-程序员宅基地

文章浏览阅读175次。我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险.Spring Cloud Netflix Hystrix就是隔离措施的一种实现,可以设置在某种超时或者失败情形下断开依赖调用或者返回指定逻辑,从而提高分布式系统的稳定性.生活中举个例子,如电力..._hystrix演练

js在数组中查找对应id的对象_js find id-程序员宅基地

文章浏览阅读1.2w次。初学js,需要在数组中获取对应id的项目信息,查找资料后,发现可以用es6的find()方法来实现,特以此来做记录。一、find()简介数组实例的find方法,用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。二、实例[1, 4, -5, 10]...._js find id