FPGA数字钟项目总结

简介: FPGA数字钟项目总结

一、QUARTUS软件破解

首先我我们找到电脑中的破解软件打开

然后我们打开点击应用按照以下步骤进行操作

然后我们按下电脑键盘上的win+r键输入cmd确定打开命令行窗口然后输入ipconfig/all回车,找到物理地址然后复制到刚刚保存的license文件里面的xxxxx位置保存。

最后我们打开左面的64位的 QUARTUS软件选择刚刚保存的license文件,最后破解完成,要注意的是文件目录一定要选择正确。

二、Verilog简介

Verilog是一门类C语言 ,语法与C接近,但Verilog是硬件设计语言,与C实质不同。代码对应硬件实体。 比如在Verilog里写的a+b,最后会得到由硬件实现的加法器,代码到硬件的过程叫综合。 综合就是将Verilog代码转化为硬件实现。

Verilog HDL是一种硬件描述语言,以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway

Design Automation公司(该公司于1989年被Cadencd公司收购)开发。两种HDL均为IEEE标准。

Verilog最大的优点是其与工艺无关实际上这是利用了计算机的巨大能力并在EDA工具帮助下,把逻辑验证与具体工艺库匹配、布线即时延计算分成不同的阶段来实现,从而减轻了人们的繁琐劳动。

Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言。这是因为C语言在Verilog设计之初,已经在许多领域得到广泛应用,C语言的许多语言要素已经被许多人习惯。一种与C语言相似的硬件描述语言,可以让电路设计人员更容易学习和接受。不过,Verilog与C语言还是存在许多差别。另外,作为一种与普通计算机编程语言不同的硬件描述语言,它还具有一些独特的语言要素,例如向量形式的线网和寄存器、过程中的非阻塞赋值等。总的来说,具备C语言的设计人员将能够很快掌握Verilog硬件描述语言。

二、数字钟功能分析

基本功能:

1、具有时分秒计数显示功能,以24小时循环计时;

2、具有复位功能;

3、具有整点报时功能;

项目流程图如下:

三、项目开发流程

1、根据系统设计要求,采用自顶向下设计方法,整个系统由计

时单元、动态显示单元、分频单元及整点报时单元构成。其中,

计时单元包含秒计数模块、分计数模块、时计数模块。动态显示

单元包括显示控制模块及显示译码模块。

2、在quartus下,运用Verilog编写各个模块的源程序。

3、编译各底层模块文件。

4、底层模块编译无误后,编写顶层模块。

5、编译顶层模块,分配管脚。

6、下载.sof文件,进行系统验证。

7、记录实验过程中出现的问题及解决办法。

四、部分代码分析

module stylle(clk,reset,dataout,sel,clkout);
input clk,reset;
output[7:0] dataout;
output[5:0] sel;
output clkout;
wire[3:0] data;
wire[7:0] num_sec,num_min,num_hour;
wire clk_1Hz,clk_seg;
wire sec_carryout,min_carryout;
div_fq2    X0(.clk(clk_led),.reset(reset),.clk_1Hz(clk_1Hz));
div_fq1    X1(.clk(clk),.reset(reset),.clk_seg(clk_led));
counter60    X2(.clk(clk_1Hz),.reset(reset),.num(num_sec),.en(sec_carryout));
counter60    X3(.clk(sec_carryout),.reset(reset), .num(num_min),.en(min_carryout));
counter24    X4(.clk(min_carryout),.reset(reset),.num(num_hour));
seltime      X5(.clk(clk_led),.reset(reset),.second(num_sec),.minute(num_min),.hour(num_hour),.daout(data),.sel(sel));
display      X6 (.data(data),.led(dataout));
buzz         X7(.second(num_sec),.minute(num_min),.clkin(clk_1Hz),.clkout(clkout));
endmodule
//显示译码
module display(data,led);
input[3:0] data;
output[7:0] led;
reg[7:0] led;
always@(data)
begin
   case(data)
     4'b0000:led<=8'b11000000;
    4'b0001:led<=8'b11111001;
    4'b0010:led<=8'b10100100;
    4'b0011:led<=8'b10110000;
    4'b0100:led<=8'b10011001;
    4'b0101:led<=8'b10010010;
    4'b0110:led<=8'b10000010;
    4'b0111:led<=8'b11111000;
    4'b1000:led<=8'b10000000;
    4'b1001:led<=8'b10010000;
    4'b1010:led<=8'b10001000;
    4'b1011:led<=8'b10000011;
    4'b1100:led<=8'b11000110;
    4'b1101:led<=8'b10100001;
    4'b1110:led<=8'b10000110;
    4'b1111:led<=8'b10001110;
    default:led<=8'b11111111;
  endcase
end
endmodule
//
module div_fq1(clk,reset,clk_seg);
input clk,reset;
output clk_seg;
reg[18:0] cnt;
reg clk_seg;
parameter N=100000;
always @ (negedge reset or posedge clk)
begin
  if(!reset)
    begin 
      cnt<=0;
     clk_seg<=0;
    end
    else
    begin
      if(cnt==N/2-1)
     begin
     clk_seg<=~clk_seg;
     cnt<=0;
     end
     else
     cnt<=cnt+1;
     end
end
endmodule
module div_fq2(clk,reset,clk_1Hz);
input clk,reset;
output clk_1Hz;
reg[24:0] cnt;
reg clk_1Hz;
parameter N=50;
always @ (negedge reset or posedge clk)
begin
    if(!reset)
    begin
      cnt<=0;
     clk_1Hz<=0;
     end
    else
     begin
        if(cnt==N/2-1)
           begin
          clk_1Hz<=~clk_1Hz;
          cnt<=0;
        end
      else
          cnt<=cnt+1;
      end
  end
endmodule 
module counter24(clk,reset,num,);
input clk,reset;
output[7:0] num;
reg[3:0] dh,dl;
always@(negedge reset or posedge clk)
  begin
     if(!reset)
    begin
      dh<=4'b0000;
       dl<=4'b0000;
    end
  else
    begin
      if(dh==4'b0010)
        begin
          if(dl==4'b0011)
            begin
              dh<=4'b0000;
              dl<=4'b0000;
                end
              else
                dl<=dl+1;
            end
          else
            begin
              if(dl==4'b1001)
                begin
                dl<=4'b0000;
                dh<=dh+1;
                end
              else
                dl<=dl+1;
            end
          end
      end
  assign num={dh[3:0],dl[3:0]};
endmodule
module seltime(clk,reset,second,minute,hour,daout,sel);
input clk,reset;
input[7:0] second,minute,hour;
output[3:0] daout;
output[5:0] sel;
reg[3:0] daout;
reg[2:0] cnt;
reg[5:0] sel;
always@(negedge reset or posedge clk)
begin
     if(!reset)
        cnt<=3'b000;
    else
       begin
        if(cnt==3'b101)
          cnt<=3'b000;
       else
          cnt<=cnt+1;
      end
end
always @ (cnt)
begin
   case(cnt)
      3'b000:   begin daout<=second[3:0]; sel<=6'b111110;  end
     3'b001:   begin daout<=second[7:4]; sel<=6'b111101;  end
     3'b010:   begin daout<=minute[3:0]; sel<=6'b111011;  end
     3'b011:   begin daout<=minute[7:4]; sel<=6'b110111;  end
     3'b100:   begin daout<=hour[3:0]; sel<=6'b101111;    end
     3'b101:   begin daout<=hour[7:4]; sel<=6'b011111;    end
     default:  begin daout<=4'b0000; sel<=6'b111111;      end
  endcase
end
endmodule   
module counter60(clk,reset,num,en);
input clk,reset;
output[7:0] num;
output en;
reg en;
reg[3:0] dh,d1;
always @ (negedge reset or posedge clk)
    begin
        if(!reset)
       begin 
           dh<=4'b0000;
         d1<=4'b0000;
         en<=0;
        end
      else
          begin
            if(d1==4'b1001)
        begin
                  d1<=4'b0000;
               if(dh==4'b0101)
              begin
                  d1<=4'b0000;
                 en<=1;
                 end
                 else
                 begin
                 dh<=dh+1;
                 en<=0;
              end
            end
          else
            begin
            d1<=d1+1;
            en<=0;
            end
          end
      end
assign num={dh[3:0],d1[3:0]};
endmodule
              
module buzz(second,minute,clkout,clkin);
input[7:0] second,minute;
input clkin;
output clkout;
reg clkout;
always@(posedge clkin)
begin 
  if(minute==8'b01011001)
    begin
      if((second<=8'b01011001)&&second>=8'b01010001)
        clkout<=clkin;
    end
  else
    clkout<=1;
end
endmodule

五、项目总结

首先总结实验过程中遇到的问题以及解决办法:

①显示字符乱码:显示译码模块出现错误,个别代码输入有误,总体原因是自己不够细心,需要通过时间的沉淀来改正自己的错误。

②刚刚输完老师的代码出现很多报错信息:编程语言规则了解不够详细在改正代码的这个时间浪费了很多,需要不断的学习来哦加深对代码的熟悉度。

最后总结本学期课程学习总结:

短暂的12周就这样过去了,对于我来说这学期的专业课赋予了我太多实用的东西了,不仅让我更深层次的对课本的理论知识深入了理解,而且还让我对分析事物的逻辑思维能力得到了锻炼,提高了实际动手能力,下面谈一下电子设计自动化这门课程我自己的一些心得体会。本课程熟悉了对quartus II软件的一般项目的操作和学到了处理简单问题的基本方法,更重要的是掌握了Verilog语言的基本设计思路和方法,我想这些会对我今后的学习起到很大的助推作用。此外,还要在今后的课本理论知识学习过程中要一步一个脚印的扎实学习,灵活的掌握和运用专业理论知识这样才能在以后出去工作的实践过程中有所成果。总的来说,这次eda(电子设计自动化)课程让我感觉收获颇多,虽然我们自己动手设计程序的地方不多,但是老师每次上课解答我们的作业这个环节真的能学到很多东西,能够深刻的认识到自己代码的不足,同时我们在写程序的还可以学会改程序,根据错误的地方去修改程序。本学期的专业课真的颠覆了我的我们这个专业的认知。


相关文章
|
2天前
|
芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(一)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
|
2天前
|
芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(三)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
|
6月前
|
测试技术 异构计算
【FPGA基础入门实践】Verilog 基本项目操作逐步演示
【FPGA基础入门实践】Verilog 基本项目操作逐步演示
87 0
|
2天前
|
存储 芯片 异构计算
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管(二)
【FPGA】高云FPGA之数字钟实验->HC595驱动数码管
|
异构计算
FPGA项目五:数码管动态扫描(下)
FPGA项目五:数码管动态扫描
151 0
FPGA项目五:数码管动态扫描(下)
|
程序员 异构计算
FPGA项目五:数码管动态扫描(中)
FPGA项目五:数码管动态扫描
207 0
FPGA项目五:数码管动态扫描(中)
|
异构计算
FPGA项目五:数码管动态扫描(上)
FPGA项目五:数码管动态扫描
219 0
FPGA项目五:数码管动态扫描(上)
|
异构计算
FPGA项目四:串口通信(下)
FPGA项目四:串口通信
100 2
FPGA项目四:串口通信(下)
|
程序员 异构计算
FPGA项目四:串口通信(中)
FPGA项目四:串口通信
256 0
FPGA项目四:串口通信(中)
|
芯片 异构计算
FPGA项目四:串口通信(上)
FPGA项目四:串口通信
300 0
FPGA项目四:串口通信(上)

热门文章

最新文章