10.18~10.22数电第二次实验

频分复用

同一个时间共用一个频道,只不过频率不同,所以互不影响

时分复用

不同时间公用一个频道,轮流使用

时分复用(TDM,Time-division multiplexing)就是将提供给整个信道传输信息的时间划分成若干时间片 (简称时隙),并将这些时隙分配给每一个信号源使用,保证资源的利用率。

码分复用

同一时间同一频道,共同使用,但是使用的编码不同,故互不影响

动态显示

就是这一段时间内,要显示0123这个数字,首先是要保证这4个数字不会变动与更新,即处于Refresh period的时间内,然后在这一时间内要保证可以分别显示出这4个数字,即Digit period,为这一段时间内分别亮这4个灯

需要保证不会超过人眼的分辨频率

`timescale 1ns / 1psmodule all_divider(input clk_i,output reg clk_o);reg [16:0] cnt=0;always@(posedge clk_i) beginif(cnt == 99999)cnt <= 'b000;else cnt <= cnt + 1'b1;if(cnt <= 49999)clk_o <= 1'b1;else clk_o <= 1'b0;end
endmodule

这个模块的就是把原始始终信号clk转变为

clk只会翻转就是高频率的0_1变换

每次从0到1意味着上一个周期的结束与新一个周期的开始

内部时钟周期为100MHZ

cnt记录的是clk的周期数量,cnt只记录到99999,即1e5次周期

`timescale 1ns / 1psmodule all_counter(input [7:0]out0,input [7:0]out1,input [7:0]out2,input [7:0]out3,input [7:0]out4,input [7:0]out5,input [7:0]out6,input [7:0]out7,input clk_i,output reg [7:0]left,output reg [7:0]right,output reg [3:0]dn0,output reg [3:0]dn1);wire clk_o;						//分频后的时钟信号reg  [1:0]count=2'b00;    			//计数器,控制使能端(相当于一个24译码器)//分频模块的调用all_divider div(clk_i,clk_o);always @(posedge clk_o) beginif(count == 3)					//到3记得将计数器清零即可begincount = 2'b00;left <= out3;right<= out7;dn0<=4'b0001;dn1<=4'b0001; endelse begincase(count)				//case语句正常判断使能端的内容2'b00:begin left<=out0;right<=out4;dn0<=4'b1000;dn1<=4'b1000; end2'b01:begin left<=out1;right<=out5;dn0<=4'b0100;dn1<=4'b0100;  end2'b10:begin left<=out2;right<=out6;dn0<=4'b0010;dn1<=4'b0010;  endendcasecount = count + 1'b1;endendendmodule

计数器,控制使能端,相当于一个二四译码器,就是控制四个灯哪个灯亮

上面的分频是把信号控制在人眼检测不到的程度,下面计数器也是一个分频,每4个分频后的小周期组成一个大周期,这个大周期就是每组数的持续时间,就是要保证每组数在这个大周期内不发生变化,才能保证在这个大周期里的四个四分之一小周期才可以完整显示出这组数

计时器
还是需要进行分频,并且我们需要有复位端。
输入:时钟信号和复位使能端
输出:两个八位二进制数(控制前两个的) 

这里的divider是要把系统时钟周期转变为1HZ的,就是一秒一周期,这样才可以计时

而之前的all_divider是把系统时钟周期转变为小周期,并非计时用

`timescale 1ns / 1ps
module counter(input clk_i,input s,output reg [7:0]out0,output reg [7:0]out1
);  wire clk;reg [3:0]middle=4'b1010;//计数器,从10开始divider div(clk_i,clk);always @(posedge s or posedge clk) beginif(s)							//复位使能端有效beginmiddle = 10;out0 = 8'b0110_0000;			//1out1 = 8'b1111_1100;			//0endelse if(middle==0)					//到0了,重新开始计数beginmiddle = 10;out0 = 8'b0110_0000;out1 = 8'b1111_1100;endelsebeginmiddle = middle - 1'b1;out0 = 8'b1111_1100;			//高位为0case(middle)4'b0000:out1 = 8'b1111_1100;	//按照计数器内容控制4'b0001:out1 = 8'b0110_0000;4'b0010:out1 = 8'b1101_1010;4'b0011:out1 = 8'b1111_0010;4'b0100:out1 = 8'b0110_0110;4'b0101:out1 = 8'b1011_0110;4'b0110:out1 = 8'b1011_1110;4'b0111:out1 = 8'b1110_0000;4'b1000:out1 = 8'b1111_1110;4'b1001:out1 = 8'b1111_0110;4'b1010:out1 = 8'b1111_1100;endcaseendend    
endmodule

这里计时器的实现就是把1Hz的时钟信号通过中间量middle连接起来,当时钟上升沿来临时,mid改变一次,然后mid的改变使数码管接收到的信号发生改变, 

 (这里的代码有一点不怎么规范,应该都采用非阻塞赋值的,但是因为使能端需要立即改变,而如果是非阻塞则需要等到下一个always块,会相对慢一个周期)

之所以输出8位的二进制数,是因为采用的是七段数码管+一个点,所以一共八位

然后又由于有8个数码管,所以一共有0~7个output,这里采用的是把8个分为两组,即左右两组开始展示,而不是8个合在一起依次展示,不然时间周期太大 

控制四位拨码开关
这个比较简单,就是一个4-16译码器,直接上代码:

`timescale 1ns / 1psmodule four(input [3:0] in,output reg [7:0] out);always@(*) begincase(in)4'b0000:out=8'b1111_1100;4'b0001:out=8'b0110_0000;4'b0010:out=8'b1101_1010;4'b0011:out=8'b1111_0010;4'b0100:out=8'b0110_0110;4'b0101:out=8'b1011_0110;4'b0110:out=8'b1011_1110;4'b0111:out=8'b1110_0000;4'b1000:out=8'b1111_1110;4'b1001:out=8'b1111_0110;4'b1010:out=8'b1110_1110;4'b1011:out=8'b0011_1110;4'b1100:out=8'b0001_1010;4'b1101:out=8'b0111_1010;4'b1110:out=8'b1001_1110;4'b1111:out=8'b1000_1110;endcase        end
endmodule

然后使用一个顶层模块串起来就行了:

`timescale 1ns / 1psmodule hexseg8(input s,input [3:0]sw1,input [3:0]sw2,input clk_i,output wire [7:0]left,output wire [7:0]right,output wire [3:0]dn0,output wire [3:0]dn1);wire [7:0]out0;wire [7:0]out1;wire [7:0]out2;wire [7:0]out3;//前4个是变化的时间wire [7:0]out4=8'b;	//班级wire [7:0]out5=8'b;	//班级(记得加小数点wire [7:0]out6=8'b;	//学号wire [7:0]out7=8'b;wire [15:0]temp=0;//四位拨码开关four four1(sw1,out3);four four2(sw2,out2);//计数器counter counter1(clk_i,s,out0,out1);//数码管显示分频模块all_counter counter2(out0,out1,out2,out3,out4,out5,out6,out7,clk_i,left,right,dn0,dn1);endmodule

整体的思路应该是,系统时钟信号导进来,然后经过分频器处理为1HZ时钟信号,接着再经过时钟处理模板,转化为显示的信号,再到显示模板,进行显示 

即一共需要三个模板

第一个模板是分频器,输入是系统时钟,输出是1HZ时钟

第二个模板是时钟信号处理模板,不断输入1HZ时钟信号,表示计时,不断输出显示的信号

具体来说就是1个输入,然后输出6个8位的信号,一二位是秒信号,三四位为分钟信号,五六位为小时信号(八位是因为有小数点,就是最右位,由于没有用,所以一直是0)

第三个模板是显示模板,显示是要分时复用,输入是6个8位的信号

数码管不能同时亮是因为4个数码管是串接在一起的,如果同时亮,那么产生的控制信号同时控制4个数码管,即四个数码管显示的是同一个内容,所以需要控制每次只亮一个,4个里只亮1个,亮的就是控制它亮的部分。

而LED是并连在一起的,也就是说,LED各自有控制信号,所以不会互相影响,可以同时亮,而数码管不可以

而且显示要求,4个数码管量,8个Led灯(4个为一组显示小时信号)

就是说,需要输出1个四位的信号(表示数码管上的使能信号,决定此时是哪个数码管在亮),1个八位的信号(表示那个亮的数码管显示什么内容的信号),1个八位的信号(表示LED亮的信号,是表示小时的信号)

LED不需要使能信号是因为LED可以同时亮,直接把8位的信号对应到下面的LED上即可

首先是要有一个计数器,周期为1HZ,有4个数码管,就表示分和秒

然后小时就表示在led灯上,十六进制就是说,每4个led组成一组来表示小时,4个一组可以表示到16个小时

所以8个led可以表示32个小时

 ?怎么实现秒到分,分到时?

思路应该是确定三组信号,一组表示秒,一组表示分,一组表示小时

表示秒的信号到60时,让分的信号+1,

表示分的信号到60时,让小时的信号+1

小时的信号是

这个时间就是拆出5位,第一位是10进制,如果第一位到了10,第二位加一,第二位到了6,归零,第三位加一,第三位到了10,第四位加一,第四位到了六,第五位加一,第五位就不再进位

然后数码管要接收的显示信号,就直接读取前四位的结果进行转化

进位应该是再加的时候,如果到9了,就置为0,往高位进一,

produce_clk用来产生实际的时钟信号,并把时钟信号转化为数码管所需要的信号,即输出Output

是在顶层文件里调用

presentation_Hz是分系统时钟频率为显示频率,不在顶层文件中调用,在数码管显示文件里调用

hz1clk是分频为实际频率,在produce_clk里调用

只产生信号还不够,还需要分时复用地去显示信号,就是all_counter文件调用,

all_counter接收produce_clk产生的信号,分时复用地显示信号,在顶层文件里调用

produce_clk的信号改变周期是1HZ,all_counter的刷新频率为显示频率的四倍,远远高于信号更新频率

这里输入有两个信号,输出有3个信号,需要分配2(输入,一个开关,一个时钟信号)+8(数码管引脚)+4(数码管编号)+8(8个LED)=22个引脚 

module display_7seg( input CLK, input SW_in, output reg[10:0] display_out );reg [19:0]count=0; reg [2:0] sel=0; parameter T1MS=50000; always@(posedge CLK) begin if(SW_in==0) begin case(sel) 0:display_out<=11'b0111_1001111; 1:display_out<=11'b1011_0010010; 2:display_out<=11'b1101_0000110; 3:display_out<=11'b1110_1001100; default:display_out<=11'b1111_1111111; endcase end else begin case(sel) 0:display_out<=11'b1110_1001111; 1:display_out<=11'b1101_0010010; 2:display_out<=11'b1011_0000110; 3:display_out<=11'b0111_1001100; default:display_out<=11'b1111_1111111; endcase end end always@(posedge CLK) begin count<=count+1; if(count==T1MS) begin count<=0; sel<=sel+1; if(sel==4) sel<=0; end end 
endmodule

这里要CLK,sw_in,display_out0~10的信号,就是顶层文件所涉及到的信号(输入输出),

中间的辅助信号是不需要的,比如count,sel之类的,只是输入和输出 

自左到右为a~g,就是presentation[0]为g

set_property PACKAGE_PIN[get_ports]
set_property IOSTANDARD LCVMOSS[get_ports ]
set_property PACKAGE_PIN W5 [get_ports CLK] 
set_property PACKAGE_PIN V17 [get_ports SW_in] 
set_property IOSTANDARD LVCMOS33 [get_ports SW_in] 
set_property IOSTANDARD LVCMOS33 [get_ports CLK] 
set_property PACKAGE_PIN W4 [get_ports {display_out[10]}] 
set_property PACKAGE_PIN V4 [get_ports {display_out[9]}] 
set_property PACKAGE_PIN U4 [get_ports {display_out[8]}] 
set_property PACKAGE_PIN U2 [get_ports {display_out[7]}] 
set_property PACKAGE_PIN W7 [get_ports {display_out[6]}] 
set_property PACKAGE_PIN W6 [get_ports {display_out[5]}] 
set_property PACKAGE_PIN U8 [get_ports {display_out[4]}] 
set_property PACKAGE_PIN V8 [get_ports {display_out[3]}] 
set_property PACKAGE_PIN U5 [get_ports {display_out[2]}] 
set_property PACKAGE_PIN V5 [get_ports {display_out[1]}] 
set_property PACKAGE_PIN U7 [get_ports {display_out[0]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[9]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[8]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[7]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[6]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[5]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[4]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[3]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[1]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[2]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[0]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {display_out[10]}] 

set_property -dict{PACKAGE_PIN R2  IOSTANDARD LVCMOS33}[get_ports s]
set_property -dict{PACKAGE_PIN W5 IOSTANDARD LVCMOS33}[get_ports clk_i]
set_property -dict{PACKAGE_PIN U7  IOSTANDARD LVCMOS33}[get_ports{presentation[0]}]
set_property -dict{PACKAGE_PIN V5 IOSTANDARD LVCMOS33}[get_ports{presentation[1]}]
set_property -dict{PACKAGE_PIN U5  IOSTANDARD LVCMOS33}[get_ports{presentation[2]}]
set_property -dict{PACKAGE_PIN V8 IOSTANDARD LVCMOS33}[get_ports{presentation[3]}]
set_property -dict{PACKAGE_PIN U8  IOSTANDARD LVCMOS33}[get_ports{presentation[4]}]
set_property -dict{PACKAGE_PIN W6 IOSTANDARD LVCMOS33}[get_ports{presentation[5]}]
set_property -dict{PACKAGE_PIN W7  IOSTANDARD LVCMOS33}[get_ports{presentation[6]}]
set_property -dict{PACKAGE_PIN U2  IOSTANDARD LVCMOS33}[get_ports{dn0[0]}]
set_property -dict{PACKAGE_PIN U4 IOSTANDARD LVCMOS33}[get_ports{dn0[1]}]
set_property -dict{PACKAGE_PIN V4  IOSTANDARD LVCMOS33}[get_ports{dn0[2]}]
set_property -dict{PACKAGE_PIN W4 IOSTANDARD LVCMOS33}[get_ports{dn0[3]}]
set_property -dict{PACKAGE_PIN V13  IOSTANDARD LVCMOS33}[get_ports{hour[0]}]
set_property -dict{PACKAGE_PIN V3 IOSTANDARD LVCMOS33}[get_ports{hour[1]}]
set_property -dict{PACKAGE_PIN W3  IOSTANDARD LVCMOS33}[get_ports{hour[2]}]
set_property -dict{PACKAGE_PIN U3 IOSTANDARD LVCMOS33}[get_ports{hour[3]}]
set_property -dict{PACKAGE_PIN P3  IOSTANDARD LVCMOS33}[get_ports{hour[4]}]
set_property -dict{PACKAGE_PIN N3 IOSTANDARD LVCMOS33}[get_ports{hour[5]}]
set_property -dict{PACKAGE_PIN P1  IOSTANDARD LVCMOS33}[get_ports{hour[6]}]
set_property -dict{PACKAGE_PIN L1 IOSTANDARD LVCMOS33}[get_ports{hour[7]}]

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

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

相关文章

SQL基础语法总结(查询)

学习网站&#xff1a;https://www.w3schools.com/sql/&#xff0c;提供在线编程 以下内容仅SQL常见语法总结 数据 Customers表 Products表 OrderDetails表 Orders表 Shippers表 Employees表 选择查询 SELECT select语句用来从头数据库中选择数据 SELECT column1, column2,…

交换机/防火墙-基础配置-23.10.11

1.MAC地址 交换机在给主机之间传递信息包时&#xff0c;通过MAC地址来标识每台主机 主机间发生信息包交换时&#xff0c;交换机就会将通信过的主机的mac地址存下 dis mac-address 交换机转发的数据包中&#xff0c;会包含一个目标MAC&#xff0c;交换机识别数据包中的目标MA…

可视化数学分析软件 MATLAB R2021b mac中文版软件介绍

MATLAB R2021b mac作为数学类科技应用软件中首屈一指的商业数学软件&#xff0c;可以帮助您进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。…

自己动手写编译器:c 语言模板中的输入模块设计

使用过“框架”的同学都能感受到“框架”带来的方便。所谓”框架“本质上就是一系列代码安排帮助我们完成脏活累活&#xff0c;或者复杂的工作流程后&#xff0c;把处理结果交给我们提供的代码。本节我们要完成的 c 语言模板也是一个框架&#xff0c;它也需要做一系列脏活累活&…

vue重修之路由【上】

文章目录 单页应用程序: SPA - Single Page Application路由简介Vue Reouter简介VueRouter的使用&#xff08;52&#xff09;组件的存放目录问题组件分类存放目录 路由的封装抽离 单页应用程序: SPA - Single Page Application 单页面应用(SPA): 所有功能在 一个html页面 上 单…

【Java 进阶篇】深入了解 Bootstrap 全局 CSS 样式

Bootstrap 是一个流行的前端框架&#xff0c;以其强大的全局 CSS 样式而闻名。这些样式能够帮助开发者快速创建漂亮的、响应式的网页&#xff0c;而无需从头编写复杂的 CSS。在本文中&#xff0c;我们将深入探讨 Bootstrap 的全局 CSS 样式&#xff0c;适合初学者&#xff0c;帮…

最新AI创作系统ChatGPT源码+搭建部署教程+支持GPT4.0+支持ai绘画(Midjourney)/支持Prompt

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

RabbitMQ队列及交换机的使用

目录 一、简单模型 1、首先控制台创建一个队列 2、父工程导入依赖 3、生产者配置文件 4、写测试类 5、消费者配置文件 6、消费者接收消息 二、WorkQueues模型 1、在控制台创建一个新的队列 2、生产者生产消息 3、创建两个消费者接收消息 4、能者多劳充分利用每一个消…

面试官心声:个个都说会自动化,结果面试一问细节全露馅了

今年我们部门计划招聘几名自动化测试工程师&#xff0c;为此我进行了面试和培训&#xff0c;发现了一个让我感到担忧的趋势&#xff0c;许多候选人可以轻松地回答有关脚本编写、元素定位、框架API等问题。然而一问到实际项目&#xff0c;比如“如何从0开始搭建自动化体系”、“…

集成学习方法之随机森林-入门

1、 什么是集成学习方法 集成学习通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型&#xff0c;各自独立地学习和作出预测。这些预测最后结合成组合预测&#xff0c;因此优于任何一个单分类的做出预测。 2、 什么是随机森林 在机器学习中&…

如何借助边缘智能网关打造智慧城市便民驿站

智慧城市驿站是一类提供多样化便利服务的新型智能公共设施&#xff0c;通过融合物联网技术、边缘智能技术、新能源技术等&#xff0c;为城市居民整合提供休闲、购物、卫生、广告、安全等公共服务&#xff0c;进一步提升日常生活体验。本篇就为大家介绍如何基于边缘智能网关&…

FPGA【紫光语法】

寄存器数据类型&#xff1a; reg 默认为 1 bit wide&#xff0c;如果超过 1 bit&#xff0c;则需要 range declaration 设置 reg 的位宽integer 默认位宽为 32 bit&#xff0c;不允许有 range declarationtime 默认位宽为 64 bit&#xff0c;不允许有 range declarat…

Redis常用配置详解

目录 一、Redis查看当前配置命令二、Redis基本配置三、RDB全量持久化配置&#xff08;默认开启&#xff09;四、AOF增量持久化配置五、Redis key过期监听配置六、Redis内存淘汰策略七、总结 一、Redis查看当前配置命令 # Redis查看当前全部配置信息 127.0.0.1:6379> CONFIG…

python:遗传算法(Genetic Algorithm,GA)求解23个测试函数

一、遗传算法 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;起源于对生物系统所进行的计算机模拟研究&#xff0c;是一种随机全局搜索优化方法&#xff0c;它模拟了自然选择和遗传中发生的复制、交叉(crossover)和变异(mutation)等现象&#xff0c;从任一…

Android切换主题生命周期流程与onSaveInstanceState和onRestoreInstanceState,Kotlin

Android切换主题生命周期流程与onSaveInstanceState和onRestoreInstanceState&#xff0c;Kotlin import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivityclass MainActivity : AppCompatActivity() {private val TAG "fly&…

面试二总结

bean的生命周期&#xff1a; 数据库采用行级锁索引&#xff08;使用排他锁&#xff09;&#xff1a; mysql事务隔离级别 未提交读(Read uncommitted)是最低的隔离级别。通过名字我们就可以知道&#xff0c;在这种事务隔离级别下&#xff0c;一个事务可以读到另外一个事务未提交…

【C语言】#define宏与函数的优劣对比

本篇文章目录 1. 预处理指令#define宏2. #define定义标识符或宏&#xff0c;要不要最后加上分号&#xff1f;3.宏的参数替换后产生的运算符优先级问题3.1 问题产生3.2 不太完美的解决办法3.3 完美的解决办法 4.#define的替换规则5. 有副作用的宏参数6. 宏与函数的优劣对比6.1 宏…

【Linux】进程间通信——共享内存

目录 一、什么是共享内存 二、共享内存的原理 三、使用共享内存实现进程间通信 3.1 shmget接口 3.1.1 key形参详解 3.2 释放共享内存 3.2.1 ipcs指令 3.2.2 ipcrm指令 3.2.3 shmctl接口 3.3 关联共享内存 3.4 去关联共享内存 3.5 使用共享内存进行进程间通信实例 …

Java基础-IO流

目录 1 File 类的使用 1.1 File类的概念 1.2 构造方法 1.3 常用方法 1.4 课后练习 2 IO流原理及流的分类 2.1 IO原理 2.2 流的分类 2.3 IO流体系 2.4 接口方法 2.4.1 InputStream & Reader相同点 2.4.2 InputStream方法详解 2.4.3 Reader方法详解 2.4.4 Outp…

ant javac任务的fork和executable属性

ant javac任务是用于编译源文件的。 它的fork属性表示是否用JDK编译器在外部执行javac&#xff0c;取值可以为"yes"、“no”&#xff0c;默认值为"no"。 当fork属性的取值为"yes"时&#xff0c;可以用executable属性指明javac可执行文件的完全…