实验课记录 1

基于bysys2的多功能数字时钟设计

是本人一门实验课的设计任务,因为是第一次独立完成一个完整的项目,所以记录一下。

项目要求

主要就是用Verilog或者VHDL写一个数字时钟,实现计时、调时、闹钟、秒表等功能。因为板子比较老,所以要用ISE,不过可以先用vivado写,方便改错。

具体要求如下:
采用自顶向下的设计方法,完成多功能数字时钟的设计与实现,其功能包括24小时计时、校时、闹钟、秒表等,输出用外扩8个数码管显示,报警用蜂鸣器音乐驱动或LED显示。
其中秒表部分的要求为:1、精度为0.01秒;2、计时范围为1小时;3、设置计时开始/停止按键和复位按键;4、显示工作方式为六位七段数码管显示读数。拓展功能:分别存储三组及以上计数时间并分时回放(也就是计数时能用一个按键来存储数据,在暂停时按下这个按键能够读取存储的数据)。

设计思路

初步思路是把要求的计时、调时、闹钟、秒表几个功能分别放在四个不同的模块,最后连一下。然后在写的过程中又根据需求加了几个模块,具体介绍放在下边。

模块介绍

分频

分频器,整体要用到的时钟有1Hz,100 Hz,1KHz,1MHz。

module clk_div(clk,clk1,clk100,clk1k,clk1m);
input clk;
output reg clk1=1'b0;
output reg clk100=1'b0;
output reg clk1k=1'b0;
output reg clk1m=1'b0;
integer qout1=0;
integer qout2=0;
integer qout3=0;
integer qout4=0;

always@(posedge clk)
begin
  if(qout1==24999999)
    begin
      qout1<=0;clk1<=~clk1;
    end
  else begin 
    qout1<=qout1+1; end
end//产生1hz时钟

always@(posedge clk)
begin
  if(qout2==249999)
    begin
      qout2<=0;clk100<=~clk100;
    end
  else begin
    qout2<=qout2+1; end
end//产生100hz时钟

always@(posedge clk)
begin
  if(qout3==24999)
    begin
      qout3<=0;clk1k<=~clk1k;
    end
  else begin 
    qout3<=qout3+1; end
end//产生1khz时钟

always@(posedge clk)
begin
  if(qout4==24)
    begin
      qout4<=0;clk1m<=~clk1m;
    end
  else begin 
    qout4<=qout4+1; end
end//产生1mhz时钟
endmodule

按键消抖

对实验中用到的四个按键进行消抖。

module ajxd(clk100,k1_in,k2_in,k3_in,k4_in,
            k1,k2,k3,k4);//1-4从右往左
input clk100;
input k1_in,k2_in,k3_in,k4_in;
output k1,k2,k3,k4;
reg k11,k12,k21,k22,k31,k32,k41,k42;

always@(posedge clk100)
begin 
  k11<=k1_in;
  k12<=k11;
end
assign k1=k11&k12;

always@(posedge clk100)
begin 
  k21<=k2_in;
  k22<=k21;
end
assign k2=k21&k22;

always@(posedge clk100)
begin 
  k31<=k3_in;
  k32<=k31;
end
assign k3=k31&k32;

always@(posedge clk100)
begin 
  k41<=k4_in;
  k42<=k41;
end
assign k4=k41&k42;
endmodule

时钟

时钟模块主要是进行24小时循环计时,这一功能通过计数器级联实现。为了便于实现后续调时功能,将计数器设置为带置数端的计数器。

module shizhong(clk1,rst,set,dts1,dts2,dts3,dts4,dts5,dts6,
                disp_sz);
input clk1,rst;
input set;//置数按键,按下时将调试模块的数据赋给此模块数据
input [3:0] dts1,dts2,dts3,dts4,dts5,dts6;
output wire[23:0] disp_sz;
reg[3:0] djs1,djs2,djs3,djs4,djs5,djs6;
reg co_1,co_2,co_3;
always@(posedge clk1 or posedge set)
begin
if(set==1)begin
   djs1<=dts1;djs2<=dts2;end
else begin
     if(djs1==4'd9)
        begin
          djs1<=4'd0;
          if(djs2==4'd5)begin
             djs2<=4'd0;co_1<=1'b1;end
          else begin 
             djs2<=djs2+1;co_1<=1'b0;end
         end
      else begin
         djs1<=djs1+1;co_1<=1'b0;end         
end
end//秒计数

always@(posedge co_1 or posedge set)
begin
if(set==1)begin
   djs3<=dts3;djs4<=dts4;end
else begin
     if(djs3==4'd9)
       begin
         djs3<=4'd0;
         if(djs4==4'd5)begin
            djs4<=4'd0;co_2<=1'b1;end
         else begin 
            djs4<=djs4+1;co_2<=1'b0;end
       end
     else begin
          djs3<=djs3+1;co_2<=1'b0;end         
end
end//分计数

always@(posedge co_2 or posedge set)
begin
if(set==1)begin
   djs5<=dts5;djs6<=dts6;end
else begin
     if(djs5==4'd3&djs6==4'd2)begin
        djs5<=4'd0;djs6<=4'd0;end
     else begin
           if(djs5==4'd9)
              begin
                djs5<=4'd0;
                if(djs6==4'd2)
                   djs6<=4'd0;
                else djs6<=djs6+1;
              end
           else djs5<=djs5+1;              
     end
  end
end//小时计数

assign disp_sz={djs6,djs5,djs4,djs3,djs2,djs1};
endmodule

调时

这一模块主要就是实现按键控制调时,有两个按键,一个按键控制位的移动(按一下左移一位),一个按键控制当前选中位上数字变化(0-9循环变化)。这一部分的主要原理也是计数器。

module tiaoshi(rst,kt_w,kt_s,dts1,dts2,dts3,dts4,dts5,dts6,cnt_ts);
input rst,kt_w,kt_s;
output reg[4:0] dts1,dts2,dts3,dts4,dts5,dts6;
output reg[2:0] cnt_ts;

always@(posedge rst or posedge kt_w)
begin
    if(rst)
      cnt_ts<=3'd1;
    else begin
       if(cnt_ts==3'd6)
          cnt_ts<=3'd1;//1-7数码管显示频率,8显示位数
       else
          cnt_ts<=cnt_ts+1;
    end		 
end

always@(posedge rst or posedge kt_s)
begin
  if(rst) 
     begin 
       dts6<=4'b0000;dts5<=4'b0000;dts4<=4'b0000;
       dts3<=4'b0000;dts2<=4'b0000;dts1<=4'b0000;
     end
  else
  case(cnt_ts)
    1:begin if (dts1==4'b1001) dts1<=4'b0000;
            else dts1<=dts1+1;end
    2:begin if (dts2==4'b0101) dts2<=4'b0000;
            else dts2<=dts2+1;end
    3:begin if (dts3==4'b1001) dts3<=4'b0000;
            else dts3<=dts3+1;end
    4:begin if (dts4==4'b0101) dts4<=4'b0000;
            else dts4<=dts4+1;end
    5:begin if (dts5==4'b1001) dts5<=4'b0000;
            else dts5<=dts5+1;end
    6:begin if (dts6==4'b0010) dts6<=4'b0000;
            else dts6<=dts6+1;end
    default:dts1<=dts1;
  endcase
end
endmodule

秒表

秒表要实现的功能有:一小时计时、开始/暂停按键、存储/读取三组数据。
计时功能还是计数器级联实现。开始/暂停通过设置一个判断信号,按键按下判断信号发生变化,在将其作为计数器使能端即可实现按键按下时在计时和暂停状态切换。存取数据则通过移位寄存器实现。

module miaobiao(clk100,rst,s_p,m_r,disp_mb);
input clk100;
input rst,s_p,m_r;
output reg[23:0] disp_mb;
reg[3:0] dmb1,dmb2,dmb3,dmb4,dmb5,dmb6;
reg judge;//判断信号

always@(negedge s_p)
begin
  if(judge==1'b1)
    judge<=1'b0;
  else judge<=1'b1;
end//judge为1是开始,judge为0是暂停
always@(posedge clk100)
begin
  if(rst==1'b1&judge==1'b0)begin
    dmb1<=0;dmb2<=0;dmb3<=0;dmb4<=0;dmb5<=0;dmb6<=0;end
  else if(judge==1'b0)
          dmb1<=dmb1;
       else begin
         if(dmb1==4'b1001&&dmb2==4'b1001&&dmb3==4'b1001&&
            dmb4==4'b0101&&dmb5==4'b1001&&dmb6==4'b0101)
            begin dmb1<=0;dmb2<=0;dmb3<=0;
                  dmb4<=0;dmb5<=0;dmb6<=0;end
         else if(dmb1==4'b1001)begin
                 dmb1<=4'b0000;
                 if(dmb2==4'b1001)begin
                    dmb2<=4'b000;
                    if(dmb3==4'b1001)begin
                       dmb3<=4'b0000;
                       if(dmb4==4'b0101)begin
                          dmb4<=4'b0000;
                          if(dmb5==4'b1001)begin
                             dmb5<=4'b0000;
                             if(dmb6==4'b0101)
                                dmb6<=4'b0000;
                             else dmb6<=dmb6+1;end
                          else dmb5<=dmb5+1;end
                       else dmb4<=dmb4+1;end
                    else dmb3<=dmb3+1;end
                 else dmb2<=dmb2+1;end
              else dmb1<=dmb1+1;end             
       end

//数据存储读取,三个寄存器
reg[23:0] mem1,mem2,mem3;
reg[3:0] data2;
reg[1:0] r_cnt;//模四计数器,负责读
reg[23:0] disp_1;//读时输出的数据
always@(posedge m_r or posedge rst)
begin
  if(rst==1'b1)begin
    mem1<=24'b0;mem2<=24'b0;mem3<=24'b0;r_cnt<=2'd0;end
  else if(judge==1)begin
          r_cnt<=r_cnt;mem3<=mem2;mem2<=mem1;
          mem1<={dmb6,dmb5,dmb4,dmb3,dmb2,dmb1};end//mem1是最后读入的数据
  else begin
         if(r_cnt==2'b11)begin
            r_cnt<=2'b00;end
         else if(r_cnt==2'b00)begin
                 r_cnt<=2'b01;disp_1<=mem3;end
         else if(r_cnt==2'b01)begin
                 r_cnt<=2'b10;disp_1<=mem2;end
         else if(r_cnt==2'b10)begin
                 r_cnt<=2'b11;disp_1<=mem1;end
  end
end

always@(judge or m_r or r_cnt)
begin
  if(judge==1'b0&(r_cnt[1]|r_cnt[0]))begin//暂停且读数按键被按下
     disp_mb<=disp_1;end
  else disp_mb<={dmb6,dmb5,dmb4,dmb3,dmb2,dmb1};
end//不同模式下选择数码管显示
endmodule

其中存储数据的功能是可以用数组来实现的,用数组的话应该会方便添加组数等,不过我还没搞明白Verilog里边数组具体怎么搞,所以就用简单的移位寄存器的方法实现了。

闹钟

闹钟功能实际被拆解为两个模块,本模块主要是实现设置闹钟时间,控制蜂鸣器响的功能则被放在蜂鸣器模块中。本模块整体思路与调时相同。

module naozhong(rst,kn_w,kn_s,disp_nz,cnt_nz);
input rst,kn_w,kn_s;
output wire[23:0] disp_nz;
output reg[2:0] cnt_nz;
reg[3:0] dnz1,dnz2,dnz3,dnz4,dnz5,dnz6;

always@(posedge rst or posedge kn_w)
begin
  if(rst)
      cnt_nz<=3'd1;
  else if(cnt_nz==3'd6)
          cnt_nz<=3'd1;
       else
          cnt_nz<=cnt_nz+1;
end

always@(posedge rst or posedge kn_s)
begin
  if(rst) 
     begin 
       dnz6<=4'b0000;dnz5<=4'b0000;dnz4<=4'b0000;
       dnz3<=4'b0000;dnz2<=4'b0000;dnz1<=4'b0000;
     end
  else
  case(cnt_nz)
    1:begin if (dnz1==4'b1001) dnz1<=4'b0000;
            else dnz1<=dnz1+1;end
    2:begin if (dnz2==4'b0101) dnz2<=4'b0000;
            else dnz2<=dnz2+1;end
    3:begin if (dnz3==4'b1001) dnz3<=4'b0000;
            else dnz3<=dnz3+1;end
    4:begin if (dnz4==4'b0101) dnz4<=4'b0000;
            else dnz4<=dnz4+1;end
    5:begin if (dnz5==4'b1001) dnz5<=4'b0000;
            else dnz5<=dnz5+1;end
    6:begin if (dnz6==4'b0010) dnz6<=4'b0000;
            else dnz6<=dnz6+1;end
    default:dnz1<=dnz1;
  endcase
end

assign disp_nz={dnz6,dnz5,dnz4,dnz3,dnz2,dnz1};

endmodule

蜂鸣器

这一部分主要就是控制当闹钟模块调节的时间和时钟模块时间一致时,蜂鸣器响。拓展功能是通过控制蜂鸣器的频率来演奏简单的音乐,这个我也是参考了CSDN上一位大佬的代码,就不放上来了,可以自行搜索。

//两个拨码开关,一个作为使能,控制闹钟是否打开,一个选择歌曲
module pwm_buzzer(clk,clk1,nz_k,flag,disp_sz,disp_nz,buzzer,en);
input clk,clk1,nz_k,flag;//使能nz_k和flag是两个拨码开关,nz_k代表闹钟开关
input wire[23:0] disp_sz,disp_nz;
output reg buzzer;	

//判断闹钟什么时候响
reg pd;
reg delay1,delay2,delay3,delay4,delay5,delay6,delay7,delay8,delay9,delay10;
wire pd_out;
output wire en;
always@(disp_sz or disp_nz)
begin
  if(disp_sz==disp_nz)
     pd<=1'b1;
  else pd<=1'b0;
end
always@(posedge clk1)
begin
delay1 <= pd;
delay2 <= delay1;
delay3 <= delay2;
delay4 <= delay3;
delay5 <= delay4;
delay6 <= delay5;
delay7 <= delay6;
delay8 <= delay7;
delay9 <= delay8;
delay10 <= delay9;
end
assign pd_out = pd | delay1 | delay2 | delay3  | delay4 | delay5 | 
                delay6 | delay7 | delay8 | delay9 | delay10;
assign en = pd_out & nz_k;

将en作为控制蜂鸣器的使能信号即可,这部分用了一个信号扩展,主要是想让蜂鸣器响的时间持续十秒。

顶层(模块连接、数码管动态显示)

顶层中比较麻烦的就是数码管动态显示,因为板子上资源有限,所以就用了一个外接八位数码管,这个数码管数据是串行输入的,所以要进行并串转换。
为了实现在时钟调时和闹钟调时模式下数码管设置位数可以闪烁显示,我在这两个模式下将输入数码管的数据和一个2Hz的时钟相与,这样就可以达到想要的效果。

module top(clk,k1_in,k2_in,k3_in,k4_in,sw_0,sw_1,sw_2,
           sclk,rclk,dio,buzzer,en,seg7,dig4);
input clk,k1_in,k2_in,k3_in,k4_in,sw_0,sw_1,sw_2;
output sclk,buzzer;
output reg rclk,dio;
output en;
output reg[7:0] seg7;
output wire[3:0] dig4;
wire clk1,clk100,clk1k;
wire k1,k2,k3,k4;
wire[3:0] dts1,dts2,dts3,dts4,dts5,dts6;
wire[23:0] disp_sz;
wire[23:0] disp_mb;
wire[23:0] disp_nz;
reg k1_ts,k2_ts,k3_ts;
reg k1_mb,k2_mb,k3_mb;
reg k1_nz,k2_nz,k3_nz;
wire k1_ts_w,k2_ts_w,k3_ts_w;
wire k1_mb_w,k2_mb_w,k3_mb_w;
wire k1_nz_w,k2_nz_w,k3_nz_w;
wire[2:0] cnt_ts;
wire[2:0] cnt_nz;

reg[1:0] sel;
reg[23:0] disp;
always@(posedge k4)
begin
  if(sel==2'd3)
     sel<=2'd0;
  else sel<=sel+1;
end//选择不同模式

always@(sel)
begin
  case(sel)
    0:begin k1_ts<=k1_ts;k2_ts<=k2_ts;k3_ts<=k3_ts;
	         k1_mb<=k1_mb;k2_mb<=k2_mb;k3_mb<=k3_mb;
				k1_nz<=k1_nz;k2_nz<=k2_nz;k3_nz<=k3_nz;end
    1:begin k1_ts<=k1;k2_ts<=k2;k3_ts<=k3;
	         k1_mb<=k1_mb;k2_mb<=k2_mb;k3_mb<=k3_mb;
			   k1_nz<=k1_nz;k2_nz<=k2_nz;k3_nz<=k3_nz;end
    2:begin k1_ts<=k1_ts;k2_ts<=k2_ts;k3_ts<=k3_ts;
	         k1_mb<=k1;k2_mb<=k2;k3_mb<=k3;
				k1_nz<=k1_nz;k2_nz<=k2_nz;k3_nz<=k3_nz;end
	 3:begin k1_ts<=k1_ts;k2_ts<=k2_ts;k3_ts<=k3_ts;
	         k1_mb<=k1_mb;k2_mb<=k2_mb;k3_mb<=k3_mb;
				k1_nz<=k1;k2_nz<=k2;k3_nz<=k3;end
    default:begin k1_ts<=k1_ts;k2_ts<=k2_ts;k3_ts<=k3_ts;
	               k1_mb<=k1_mb;k2_mb<=k2_mb;k3_mb<=k3_mb;
						k1_nz<=k1_nz;k2_nz<=k2_nz;k3_nz<=k3_nz;end
  endcase
end

assign k1_ts_w=k1_ts;
assign k2_ts_w=k2_ts;
assign k3_ts_w=k3_ts;
assign k1_mb_w=k1_mb;
assign k2_mb_w=k2_mb;
assign k3_mb_w=k3_mb;
assign k1_nz_w=k1_nz;
assign k2_nz_w=k2_nz;
assign k3_nz_w=k3_nz;

clk_div u1(.clk(clk),.clk1(clk1),.clk100(clk100),.clk1k(clk1k),.clk1m(sclk));
ajxd u2(.clk100(clk100),.k1_in(k1_in),.k2_in(k2_in),.k3_in(k3_in),
        .k4_in(k4_in),.k1(k1),.k2(k2),.k3(k3),.k4(k4));
tiaoshi u3(.rst(k1_ts_w),.kt_w(k2_ts_w),.kt_s(k3_ts_w),.dts1(dts1),
           .dts2(dts2),.dts3(dts3),.dts4(dts4),.dts5(dts5),.dts6(dts6),.cnt_ts(cnt_ts));
shizhong u4(.clk1(clk1),.set(sw_0),.dts1(dts1),.dts2(dts2),.dts3(dts3),
            .dts4(dts4),.dts5(dts5),.dts6(dts6),.disp_sz(disp_sz));
miaobiao u5(.clk100(clk100),.rst(k1_mb_w),.s_p(k2_mb_w),
            .m_r(k3_mb_w),.disp_mb(disp_mb));
naozhong u6(.rst(k1_nz_w),.kn_w(k2_nz_w),.kn_s(k3_nz_w),.disp_nz(disp_nz),.cnt_nz(cnt_nz));
pwm_buzzer u7(.clk(clk),.clk1(clk1),.nz_k(sw_1),.flag(sw_2),
              .disp_sz(disp_sz),.disp_nz(disp_nz),.buzzer(buzzer),.en(en));				


always@(posedge sclk)
begin
  case(sel)
    0:disp<=disp_sz;
	 1:disp<={dts6,dts5,dts4,dts3,dts2,dts1};
	 2:disp<=disp_mb;
	 3:disp<=disp_nz;
	 default:disp<=24'd0;
  endcase
end

reg[7:0] dig;
reg[7:0] seg;
reg[3:0] data; 
reg[2:0] cnt1;
reg[3:0] cnt2;
reg[3:0] cnt3;

reg clk2;
integer qout_2;
always@(posedge clk)
begin
  if(qout_2==12499999)
    begin
      qout_2<=0;clk2<=~clk2;
    end
  else begin 
    qout_2<=qout_2+1; end
end//产生2hz时钟

always@(posedge clk1k)
begin
  if(cnt1==7)
     cnt1<=0;
  else cnt1<=cnt1+1;
  case(cnt1)
    0:begin 
	     if(sel==2'd1 & cnt_ts==3'd1)begin
		     dig[7:1]<=7'b0000000;dig[0]<=clk2;data<=disp[3:0];end
		  else if(sel==2'd3 & cnt_nz==3'd1)begin
		     dig[7:1]<=7'b0000000;dig[0]<=clk2;data<=disp[3:0];end
		  else begin
	        dig<=8'b00000001;data<=disp[3:0];end
	   end
    1:begin 
	     if(sel==2'd1 & cnt_ts==3'd2)begin
		     dig[7:2]<=6'b0000000;dig[1]<=clk2;dig[0]<=1'b0;data<=disp[7:4];end
		  else if(sel==2'd3 & cnt_nz==3'd2)begin
		     dig[7:2]<=6'b0000000;dig[1]<=clk2;dig[0]<=1'b0;data<=disp[7:4];end
		  else begin 
		     dig<=8'b00000010;data<=disp[7:4];end
	   end
    2:begin 
	     if(sel==2'd1 & cnt_ts==3'd3)begin
		     dig[7:3]<=5'b00000;dig[2]<=clk2;dig[1:0]<=2'b0;data<=disp[11:8];end
		  else if(sel==2'd3 & cnt_nz==3'd3)begin
		     dig[7:3]<=5'b00000;dig[2]<=clk2;dig[1:0]<=2'b0;data<=disp[11:8];end
		  else begin 
		     dig<=8'b00000100;data<=disp[11:8];end
		end
    3:begin 
	 	  if(sel==2'd1 & cnt_ts==3'd4)begin
		     dig[7:4]<=4'b0000;dig[3]<=clk2;dig[2:0]<=3'b0;data<=disp[15:12];end
		  else if(sel==2'd3 & cnt_nz==3'd4)begin
		     dig[7:4]<=4'b0000;dig[3]<=clk2;dig[2:0]<=3'b0;data<=disp[15:12];end
		  else begin
		     dig<=8'b00001000;data<=disp[15:12];end
		end
    4:begin 
	     if(sel==2'd1 & cnt_ts==3'd5)begin
		     dig[7:5]<=3'b000;dig[4]<=clk2;dig[3:0]<=4'b0;data<=disp[19:16];end
		  else if(sel==2'd3 & cnt_nz==3'd5)begin
		     dig[7:5]<=3'b000;dig[4]<=clk2;dig[3:0]<=4'b0;data<=disp[19:16];end
		  else begin
		     dig<=8'b00010000;data<=disp[19:16];end
		end
    5:begin 
	     if(sel==2'd1 & cnt_ts==3'd6)begin
		     dig[7:6]<=2'b00;dig[5]<=clk2;dig[4:0]<=5'b0;data<=disp[23:20];end
		  else if(sel==2'd3 & cnt_nz==3'd6)begin
		     dig[7:6]<=2'b00;dig[5]<=clk2;dig[4:0]<=5'b0;data<=disp[23:20];end
		  else begin
		     dig<=8'b00100000;data<=disp[23:20];end
		end
    6:begin dig<=8'b01000000;data<=10;end
    7:begin dig<=8'b10000000;data<=10;end
    default:begin dig<=8'b00000000;data<=10;end    
  endcase
end//数据选择器,位信号选择

always@(data)
begin
  case(data)
  0:seg<=8'b00000011;
  1:seg<=8'b10011111;
  2:seg<=8'b00100101;
  3:seg<=8'b00001101;
  4:seg<=8'b10011001;
  5:seg<=8'b01001001;
  6:seg<=8'b01000001;
  7:seg<=8'b00011111;
  8:seg<=8'b00000001;
  9:seg<=8'b00001001;
  default:seg<=8'b11111111;//a到h
  endcase
end//七段译码器

always@(posedge sclk)
begin
  if(cnt2==15)
     cnt2<=0;
  else cnt2<=cnt2+1; 
end//并串转换,从h到a,从高到低

always@(cnt2)
begin
  case(cnt2)
    0:dio<=seg[0];
    1:dio<=seg[1];
    2:dio<=seg[2];
    3:dio<=seg[3];
    4:dio<=seg[4];
    5:dio<=seg[5];
    6:dio<=seg[6];
    7:dio<=seg[7];
    8:dio<=dig[7];
    9:dio<=dig[6];
    10:dio<=dig[5];
    11:dio<=dig[4];
    12:dio<=dig[3];
    13:dio<=dig[2];
    14:dio<=dig[1];
    15:dio<=dig[0];
    default:dio<=1'b0;
  endcase
end  

always@(negedge sclk)
begin
  if(cnt3==15)
     begin
       cnt3<=0;rclk<=1;
     end
   else begin
         cnt3<=cnt3+1;rclk<=0;
       end
end

//显示当前状态
assign dig4=4'b1110;
always@(sel)
begin
  case(sel)
    0:seg7<=8'b11111001;//dp-a
	 1:seg7<=8'b10100100;
	 2:seg7<=8'b10110000;
	 3:seg7<=8'b10011001;
  endcase
end
endmodule

总结

写这篇文章主要就是纪念一下这个算是自己独立写完的第一个完整的项目,上学期我还是个读别人代码都费劲、自己写更是一个字都写不出来的小菜鸡,自我感觉现在已经进步为菜鸡了,可喜可贺,可喜可贺。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验名称:牛顿第一定律的验证 实验目的:通过实验验证牛顿第一定律。 实验器材:光滑水平桌面、小球、弹簧测力计、直尺、计时器。 实验步骤: 1. 在水平桌面上放置一小球,在小球正前方放置一弹簧测力计,并将弹簧测力计的指针调整到零点。 2. 用手指轻轻推动小球,使其开始运动,同时启动计时器。 3. 在小球运动的过程中,用弹簧测力计测量小球受到的水平拉力,并记录下测得的数值。 4. 将小球再次推动,但这次在小球前方放置一个障碍物,使小球在撞到障碍物后停止运动。 5. 用弹簧测力计测量小球在撞击障碍物时受到的水平拉力,并记录下测得的数值。 6. 将实验数据整理,计算小球在无障碍物时所受到的阻力,比较其与撞击障碍物时所受到的阻力,验证牛顿第一定律。 实验注意事项: 1. 实验过程中要保证水平桌面的光滑度,以避免摩擦力的影响。 2. 实验时要保证小球的质量相同,以保证实验数据的准确性。 3. 在实验过程中要注意安全,避免弹簧测力计等器材对人或物造成损伤。 实验结果分析: 通过实验数据的计算和比较,可以得出以下结论: 1. 在无障碍物的情况下,小球受到的水平拉力等于小球的重力,即小球受到的阻力为零。 2. 在撞击障碍物时,小球受到的水平拉力等于小球的重力加上阻力,即小球受到的阻力不为零。 3. 实验数据验证了牛顿第一定律,即物体在无外力作用下静止或匀速直线运动,物体所受合力为零。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值