学校黄老师的FPGA的设计课设,最后的课设为数字时钟,实现分时的计数功能,带有整点报时,按键调节的功能,供电子类学生学习和参考。
1、能进行正常的时、分、秒计时功能,分别由6个数码管显示24小时、60分钟、60秒钟的计数器显示。
2、能利用实验系统上的按键实现“校时”“校分”功能:
⑴按下“SA”键时,计时器迅速递增,并按24小时循环,计满23小时后回“00”;
⑵按下“SB”键时,计分器迅速递增,并按59分钟循环,计满59分钟后回“00”,但不向“时”进位;
⑷要求按下“SA”、“SB”或“SC”时均不产生数字跳变(SA”、“SB”、“SC”按键是有抖动的,必须对其消除抖动处理)。
3、能利用扬声器做整点报时:
⑴当计时到达59分50秒时开始报时,在59分50秒、52秒、54秒、56秒、58秒鸣叫,鸣叫声频率可定为512Hz;
⑵到达59分60秒时为最后一声整点报时,整点报时频率可定为1024Hz。
4、用层次化设计方法设计该电路,用Verilog语言编写各个功能模块。
5、完成电路设计后,用实验系统下载验证。
要求实现闹铃功能,准确到分钟。用功能仿真的方法验证,可通过观察有关波形确认电路设计是否正确。
秒计数器
reg [25:0] cnt2;
wire add_cnt2;
wire end_cnt2;
always@(posedge clk or negedge rst_n)begin //1s计数,可以通过按键更改
if(rst_n == 0)
cnt2 <= 0;
else if (add_cnt2)begin
if(end_cnt2)
cnt2 <= 0;
else
cnt2 <= cnt2 +1;
end
end
assign add_cnt2 = 1;
assign end_cnt2 = add_cnt2 && cnt2 == y-1;//y可以通过按键更改,实现按键调节时钟频率
us计数器
reg [8:0] cnt0;
always@(posedge clk or negedge rst_n) //数码管显示
if(rst_n == 0)
cnt0 <= 0;
else if (add_cnt0)
begin
if(end_cnt0 )
cnt0 <= 0;
else
cnt0 <= cnt0 +1;
end
assign add_cnt0 = 1;
assign end_cnt0 = add_cnt0 && cnt0== TIME_1US-1;//通过短时间的数码管显示,实现动态扫描
数码管显示 对4个数码管进行us级的循环点亮,达到视觉上的暂留
reg [2:0] cnt1;
wire add_cnt1;
wire end_cnt1;
always@(posedge clk or negedge rst_n)begin //4个数码管
if(rst_n == 0)
cnt1 <= 0;
else if (add_cnt1)begin
if(end_cnt1)
cnt1 <= 0;
else
cnt1 <= cnt1 +1;
end
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1 && cnt1 == 4-1;
数码管动态扫描
always@(posedge clk or negedge rst_n) //动态扫描
begin
if(rst_n == 1'b0)
seg_sel <= 4'b111_1;
else if (cnt1 == 0)
seg_sel <= 4'b111_0;
else if (cnt1 == 1)
seg_sel <= 4'b110_1;
else if (cnt1 == 2)
seg_sel <= 4'b101_1;
else if (cnt1 == 3)
seg_sel <= 4'b011_1;
else
seg_sel <= 4'b111_1;
end
数码管选择显示
reg [3:0] sel_data;
always@(posedge clk or negedge rst_n) // 选择显示
begin
if(rst_n == 0)
seg_ment <=8'hc0;
else if (sel_data==0)
seg_ment <= 8'hc0;
else if (sel_data==1)
seg_ment <= 8'hf9;
else if (sel_data==2)
seg_ment <= 8'ha4;
else if (sel_data==3)
seg_ment <= 8'hb0;
else if (sel_data==4)
seg_ment <= 8'h99;
else if (sel_data==5)
seg_ment <= 8'h92;
else if (sel_data==6)
seg_ment <= 8'h82;
else if (sel_data==7)
seg_ment <= 8'hf8;
else if (sel_data==8)
seg_ment <= 8'h80;
else if (sel_data==9)
seg_ment <= 8'h90;
else
seg_ment <= 8'hc0;
end
always@(*)
begin
if (cnt1==0)
sel_data <= m_g;
else if (cnt1==1)
sel_data <= m_s;
else if (cnt1==2)
sel_data <= s_g;
else
sel_data <= s_s;
end
分个位 分十位 时个位 时十位
reg [3:0] m_g;
wire add_m_g;
wire end_m_g;
always@(posedge clk or negedge rst_n)begin
if(rst_n == 0)
m_g <= 0;
else if (add_m_g)
begin
if(end_m_g)
m_g <= 0;
else
m_g <= m_g +1;
end
else
m_g <= m_g;
end
assign add_m_g = end_cnt2;
assign end_m_g = add_m_g && m_g == 10-1;
reg [2:0] m_s;
wire add_m_s;
wire end_m_s;
always@(posedge clk or negedge rst_n)begin
if(rst_n == 0)
m_s <= 0;
else if (add_m_s)begin
if(end_m_s)
m_s <= 0;
else
m_s <= m_s +1;
end
end
assign add_m_s = end_m_g;
assign end_m_s = add_m_s && m_s == 6-1;
reg [3:0] s_g;
wire add_s_g;
wire end_s_g;
always@(posedge clk or negedge rst_n)begin
if(rst_n == 0)
s_g <= 0;
else if (add_s_g)
begin
if(end_s_g)
s_g <= 0;
else if (key_in1 == 1'b0)//保证按键按下时位不产生变化
s_g <= s_g ;
else
s_g <= s_g +1;
end
else
s_g <= s_g;
end
assign add_s_g = end_m_s;
assign end_s_g = add_s_g && s_g == x-1;
reg [1:0] s_s;
wire add_s_s;
wire end_s_s;
always@(posedge clk or negedge rst_n)begin
if(rst_n == 0)
s_s <= 0;
else if (add_s_s)begin
if(end_s_s)
s_s <= 0;
else
s_s <= s_s +1;
end
end
assign add_s_s = end_s_g;
assign end_s_s = add_s_s && s_s == 3-1;
always@(*)
begin
if(s_s==2)
x=4;
else
x=10;
end
上述基本可以达到数码管显示计数的效果
//按键更改频率
parameter TIME_1S = 5000_000_0;
parameter TIME_1MS = 5000_000;
parameter TIME_1NS = 5000_00;
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
y <= TIME_1S;
else if ( key_in1 == 1'b0) //按键1改时钟频率,同时s_g数码管不变
begin
y=TIME_1MS;
end
else if (key_in2 == 1'b0)//按键2 改时钟频率,改的更快
y=TIME_1NS;
else
begin
y <= TIME_1S;
end
beep报时
//beep 计数
reg [24:0] cnt;
reg [2:0] cnt_500ms;
reg [17:0] freq_cnt;
reg [17:0] freq_data;
reg [17:0] freq_data2;
wire [16:0] duty_data1;
wire [16:0] duty_data2;
// beep 0.5s的计数
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
cnt <= 25'd0;
else if (cnt == CNT_MAX)
cnt <= 25'd0;
else
cnt <= cnt + 25'b1;
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
cnt_500ms <= 3'd0;
else if ((cnt_500ms == 3'd6)&&(cnt == CNT_MAX))
cnt_500ms <= 3'd0;
else if (cnt == CNT_MAX)
cnt_500ms <= cnt_500ms + 3'd1;
else
cnt_500ms <= cnt_500ms;
//频率计数
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
freq_cnt <= 18'd0;
else if ((freq_cnt == freq_data)||(cnt == CNT_MAX))
freq_cnt <= 18'd0;
else
freq_cnt <= freq_cnt + 18'd1;
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
freq_data <= DO;
else case(cnt_500ms)
3'd0:
begin
freq_data <= DO;
freq_data2<= XI;
end
default :
begin
freq_data <= DO;
freq_data2<= XI;
end
endcase
assign duty_data1 = freq_data >> 1;
assign duty_data2 = freq_data2 >> 1;
//报时
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
beep <= 1'b0;
else if ((freq_cnt >= duty_data1)&&(((m_s == 5)&&(m_g== 2))||((m_s == 5)&&
(m_g ==0))||((m_s == 5)&&(m_g ==4))||((m_s == 5)&&(m_g ==6))||((m_s == 5)&&(m_g ==8))))// 50 52 54 56 58 报时
beep <= 1'b1;
else if ((freq_cnt >= duty_data2)&&(((m_s == 0)&&(m_g== 0))))// 正点报时
beep <= 1'b1;
else
beep <= 1'b0;
module clock_k_b
(
input clk,
input rst_n,
input wire key_in1,
input wire key_in2,
output reg [3:0] seg_sel,
output reg [7:0] seg_ment,
output reg beep
);
parameter TIME_1US = 500;
parameter TIME_1S = 5000_000_0;
parameter TIME_1MS = 5000_000;
parameter TIME_1NS = 5000_00;
parameter CNT_MAX =25'd24_999_999;
parameter DO = 18'd190839;
parameter XI = 18'd101213;
//
reg [25:0] y;
reg [8:0] cnt0;
reg [3:0] x;
wire add_cnt0;
wire end_cnt0;
//beep 计数
reg [24:0] cnt;
reg [2:0] cnt_500ms;
reg [17:0] freq_cnt;
reg [17:0] freq_data;
reg [17:0] freq_data2;
wire [16:0] duty_data1;
wire [16:0] duty_data2;
// beep 0.5s的计数
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
cnt <= 25'd0;
else if (cnt == CNT_MAX)
cnt <= 25'd0;
else
cnt <= cnt + 25'b1;
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
cnt_500ms <= 3'd0;
else if ((cnt_500ms == 3'd6)&&(cnt == CNT_MAX))
cnt_500ms <= 3'd0;
else if (cnt == CNT_MAX)
cnt_500ms <= cnt_500ms + 3'd1;
else
cnt_500ms <= cnt_500ms;
//频率计数
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
freq_cnt <= 18'd0;
else if ((freq_cnt == freq_data)||(cnt == CNT_MAX))
freq_cnt <= 18'd0;
else
freq_cnt <= freq_cnt + 18'd1;
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
freq_data <= DO;
else case(cnt_500ms)
3'd0:
begin
freq_data <= DO;
freq_data2<= XI;
end
default :
begin
freq_data <= DO;
freq_data2<= XI;
end
endcase
assign duty_data1 = freq_data >> 1;
assign duty_data2 = freq_data2 >> 1;
//报时
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
beep <= 1'b0;
else if ((freq_cnt >= duty_data1)&&(((m_s == 5)&&(m_g== 2))||((m_s == 5)&&
(m_g ==0))||((m_s == 5)&&(m_g ==4))||((m_s == 5)&&(m_g ==6))||((m_s == 5)&&(m_g ==8))))// 50 52 54 56 58 报时
beep <= 1'b1;
else if ((freq_cnt >= duty_data2)&&(((m_s == 0)&&(m_g== 0))))// 正点报时
beep <= 1'b1;
else
beep <= 1'b0;
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
y <= TIME_1S;
else if ( key_in1 == 1'b0) //按键1改时钟频率,同时s_g数码管不变
begin
y=TIME_1MS;
end
else if (key_in2 == 1'b0)//按键2 改时钟频率,改的更快
y=TIME_1NS;
else
begin
y <= TIME_1S;
end
/* always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
begin
//beep <= 1'b0;
led <= 1'b1;
end
else if (m_s>= 5)
begin
//beep <= 1'b1;
led <= ~led;
end
else
begin
//beep <= 1'b0;
led <= led;
end */
always@(posedge clk or negedge rst_n) //数码管显示
if(rst_n == 0)
cnt0 <= 0;
else if (add_cnt0)
begin
if(end_cnt0 )
cnt0 <= 0;
else
cnt0 <= cnt0 +1;
end
assign add_cnt0 = 1;
assign end_cnt0 = add_cnt0 && cnt0== TIME_1US-1;
reg [2:0] cnt1;
wire add_cnt1;
wire end_cnt1;
always@(posedge clk or negedge rst_n)begin //4个数码管
if(rst_n == 0)
cnt1 <= 0;
else if (add_cnt1)begin
if(end_cnt1)
cnt1 <= 0;
else
cnt1 <= cnt1 +1;
end
end
assign add_cnt1 = end_cnt0;
assign end_cnt1 = add_cnt1 && cnt1 == 4-1;
reg [25:0] cnt2;
wire add_cnt2;
wire end_cnt2;
always@(posedge clk or negedge rst_n)begin //1s计数,可以通过按键更改
if(rst_n == 0)
cnt2 <= 0;
else if (add_cnt2)begin
if(end_cnt2)
cnt2 <= 0;
else
cnt2 <= cnt2 +1;
end
end
assign add_cnt2 = 1;
assign end_cnt2 = add_cnt2 && cnt2 == y-1;
reg [3:0] sel_data;
always@(posedge clk or negedge rst_n) // 选择显示
begin
if(rst_n == 0)
seg_ment <=8'hc0;
else if (sel_data==0)
seg_ment <= 8'hc0;
else if (sel_data==1)
seg_ment <= 8'hf9;
else if (sel_data==2)
seg_ment <= 8'ha4;
else if (sel_data==3)
seg_ment <= 8'hb0;
else if (sel_data==4)
seg_ment <= 8'h99;
else if (sel_data==5)
seg_ment <= 8'h92;
else if (sel_data==6)
seg_ment <= 8'h82;
else if (sel_data==7)
seg_ment <= 8'hf8;
else if (sel_data==8)
seg_ment <= 8'h80;
else if (sel_data==9)
seg_ment <= 8'h90;
else
seg_ment <= 8'hc0;
end
always@(posedge clk or negedge rst_n) //动态扫描
begin
if(rst_n == 1'b0)
seg_sel <= 4'b111_1;
else if (cnt1 == 0)
seg_sel <= 4'b111_0;
else if (cnt1 == 1)
seg_sel <= 4'b110_1;
else if (cnt1 == 2)
seg_sel <= 4'b101_1;
else if (cnt1 == 3)
seg_sel <= 4'b011_1;
else
seg_sel <= 4'b111_1;
end
reg [3:0] m_g;
wire add_m_g;
wire end_m_g;
always@(posedge clk or negedge rst_n)begin
if(rst_n == 0)
m_g <= 0;
else if (add_m_g)
begin
if(end_m_g)
m_g <= 0;
else
m_g <= m_g +1;
end
else
m_g <= m_g;
end
assign add_m_g = end_cnt2;
assign end_m_g = add_m_g && m_g == 10-1;
reg [2:0] m_s;
wire add_m_s;
wire end_m_s;
always@(posedge clk or negedge rst_n)begin
if(rst_n == 0)
m_s <= 0;
else if (add_m_s)begin
if(end_m_s)
m_s <= 0;
else
m_s <= m_s +1;
end
end
assign add_m_s = end_m_g;
assign end_m_s = add_m_s && m_s == 6-1;
reg [3:0] s_g;
wire add_s_g;
wire end_s_g;
always@(posedge clk or negedge rst_n)begin
if(rst_n == 0)
s_g <= 0;
else if (add_s_g)
begin
if(end_s_g)
s_g <= 0;
else if (key_in1 == 1'b0)
s_g <= s_g ;
else
s_g <= s_g +1;
end
else
s_g <= s_g;
end
assign add_s_g = end_m_s;
assign end_s_g = add_s_g && s_g == x-1;
reg [1:0] s_s;
wire add_s_s;
wire end_s_s;
always@(posedge clk or negedge rst_n)begin
if(rst_n == 0)
s_s <= 0;
else if (add_s_s)begin
if(end_s_s)
s_s <= 0;
else
s_s <= s_s +1;
end
end
assign add_s_s = end_s_g;
assign end_s_s = add_s_s && s_s == 3-1;
always@(*)
begin
if(s_s==2)
x=4;
else
x=10;
end
/* always@(posedge clk or negedge rst_n)
begin
if(rst_n == 1'b0)
sel_data <= 0;
else if (cnt1==0)
sel_data <= m_g;
else if (cnt1==1)
sel_data <= m_s;
else if (cnt1==2)
sel_data <= s_g;
else if (cnt1==3)
sel_data <= s_s;
end */
always@(*)
begin
if (cnt1==0)
sel_data <= m_g;
else if (cnt1==1)
sel_data <= m_s;
else if (cnt1==2)
sel_data <= s_g;
else
sel_data <= s_s;
end
endmodule
`timescale 1ns/1ns
module tb_clock();
parameter CYCLE = 20;
reg clk;
reg rst_n;
wire [3:0] seg_sel;
wire [6:0] seg_ment;
clock
#(
.TIME_1US (100),
.TIME_1S (10)
)
clock_inst
(
.clk (clk),
.rst_n (rst_n),
.seg_sel (seg_sel),
.seg_ment (seg_ment)
);
initial
begin
clk = 0;
forever#(CYCLE/2)begin
clk=~clk;
end
end
initial
begin
#1
rst_n = 0;
#(10*CYCLE);
rst_n = 1;
end
endmodule
这是暑假自学搞得数字时钟的设计,虽然功能齐全,但是难免有点不完美的地方,也可以通过层次化的设计让代码变得没有这么长,可以通过这一份代码,要是期末课设弄不出来,参考一下也是可以的,免得挂了,功能反正都可以实现。若有更好的点子也可以一起交流学习一下。
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,: