EGo1下板_简单秒表_2

该博客介绍了一个基于FPGA的简单秒表设计,包括分频模块clk_use用于将100MHz时钟分频为1Hz,计数模块watch实现00.0到99.9的计数,数码管显示模块led通过分时复用显示计数值,以及顶层模块top将这些模块集成。约束文件con则定义了各I/O口的电气标准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 模块调用关系

r't'l

2. 分频模块clk_use

100MHz进行10_000_000分频

module clk_use(
    output  reg     clk_use,
    
    input   wire    clk_sys,
    input   wire    go,
    input   wire    clr
    );
    
    parameter   clk_count = 10_000_000;
    //parameter   clk_count = 4;
    reg     [23:0]  counter;
    //reg     [3:0]  counter;
    always @ (posedge clk_sys or negedge clr) begin
        if (clr == 1'b0) begin
            counter <=  24'b0;
        end else    begin
            if (go == 1'b1) begin
                if (counter >= clk_count)   counter <=  24'b0;
                else                        counter <=  counter + 1'b1;
            end else begin
                counter <=  counter;
            end
        end
    end
    
    always @ (counter)
        if ( counter == clk_count)  clk_use <=  1'b1;
        else                        clk_use <=  1'b0;
        
endmodule

3. 计数模块watch

00.0~99.9

module watch(
    output  reg     [3:0]   d2,
    output  reg     [3:0]   d1,
    output  reg     [3:0]   d0,
    
    input   wire            clk_use,
    input   wire            clr
    );
    
    
    always @ (posedge clk_use or negedge clr) begin
        if (clr == 1'b0) begin
            d2  <=  4'b0;
            d1  <=  4'b0;
            d0  <=  4'b0;
        end else begin
            if (d0 < 9) 
                d0  <=  d0 + 1'b1;
            else begin
                d0  <=  4'b0;
                if (d1 < 9)
                    d1 <= d1 + 1'b1;
                else begin
                    d1 <= 4'b0;
                    if (d2 < 9)
                        d2 <= d2 + 1'b1;
                    else begin
                        d2  <=  4'b0;
                    end
                end
            end
        end
    end
    
endmodule

4. 数码管显示模块led

这里用了多个组合逻辑和寄存器保存段选信号,但思想还是分时复用

module led(
    output  reg    [7:0]   seg,
    output  reg    [3:0]   an,
    
    input   wire            clk,
    input   wire            rst,
    input   wire    [3:0]   in2, in1, in0
    );
    
	   parameter   seg7_0 = ~8'hc0,    seg8_0 = ~8'h40;
	   parameter   seg7_1 = ~8'hf9,    seg8_1 = ~8'h79;
	   parameter   seg7_2 = ~8'ha4,    seg8_2 = ~8'h24;
	   parameter   seg7_3 = ~8'hb0,    seg8_3 = ~8'h30;
	   parameter   seg7_4 = ~8'h99,    seg8_4 = ~8'h19;
	   parameter   seg7_5 = ~8'h92,    seg8_5 = ~8'h12;
	   parameter   seg7_6 = ~8'h82,    seg8_6 = ~8'h02;
	   parameter   seg7_7 = ~8'hf8,    seg8_7 = ~8'h78;
	   parameter   seg7_8 = ~8'h80,    seg8_8 = ~8'h00;
	   parameter   seg7_9 = ~8'h90,    seg8_9 = ~8'h10;
	   parameter   _err = ~8'hcf;
	   
	   parameter   N = 18;
    
    reg     [7:0]   seg7_data2, seg8_data1, seg7_data0;   
    reg     [N-1 : 0]  regN; 
    reg     [3:0]       hex_in;
    
    always @ (posedge clk or posedge rst)   begin
        if (rst == 1'b0)    begin
            regN    <=  0;
        end else    begin
            regN    <=  regN + 1;
        end
    end
    always @ (*)    begin
        case (regN[N-1: N-2])
            2'b00:  begin
                an  <=  4'b0001;
                seg  <=  seg7_0;
            end
            2'b01:  begin
                an  <=  4'b0010;
                seg  <=  seg7_data0;
            end
            2'b10:  begin
                an  <=  4'b0100;
                seg  <=  seg8_data1;
            end
            2'b11:  begin
                an  <=  4'b1000;
                seg  <=  seg7_data2;
            end
            default:    begin
                an  <=  4'b1111;
                seg  <=  _err;
            end
        endcase
    end
	 
    always @ (*)    begin
        case (in2)
            4'h0:       seg7_data2 <= seg7_0;
            4'h1:       seg7_data2 <= seg7_1;
            4'h2:       seg7_data2 <= seg7_2;
            4'h3:       seg7_data2 <= seg7_3;
            4'h4:       seg7_data2 <= seg7_4;
            4'h5:       seg7_data2 <= seg7_5;
            4'h6:       seg7_data2 <= seg7_6;
            4'h7:       seg7_data2 <= seg7_7;
            4'h8:       seg7_data2 <= seg7_8;
            4'h9:       seg7_data2 <= seg7_9;
            default:    seg7_data2 <= _err;
        endcase
    end
    always @ (*)    begin
        case (in1)
            4'h0:       seg8_data1 <= seg8_0;
            4'h1:       seg8_data1 <= seg8_1;
            4'h2:       seg8_data1 <= seg8_2;
            4'h3:       seg8_data1 <= seg8_3;
            4'h4:       seg8_data1 <= seg8_4;
            4'h5:       seg8_data1 <= seg8_5;
            4'h6:       seg8_data1 <= seg8_6;
            4'h7:       seg8_data1 <= seg8_7;
            4'h8:       seg8_data1 <= seg8_8;
            4'h9:       seg8_data1 <= seg8_9;
            default:    seg8_data1 <= _err;
        endcase
    end
    
    always @ (*)    begin    
        case (in0)
            4'h0:       seg7_data0 = seg7_0;
            4'h1:       seg7_data0 = seg7_1;
            4'h2:       seg7_data0 = seg7_2;
            4'h3:       seg7_data0 = seg7_3;
            4'h4:       seg7_data0 = seg7_4;
            4'h5:       seg7_data0 = seg7_5;
            4'h6:       seg7_data0 = seg7_6;
            4'h7:       seg7_data0 = seg7_7;
            4'h8:       seg7_data0 = seg7_8;
            4'h9:       seg7_data0 = seg7_9;
            default:    seg7_data0 = _err;
        endcase
    end

endmodule

5. 顶层模块top

module top_stop_watch(
    output  wire     [3:0]  an,
    output  wire     [7:0]  seg,
    
    input   wire            clk_sys,
    input   wire            go,
    input   wire            clr
    );
    
    wire            clk_use;

    wire    [3:0]   data2;
    wire    [3:0]   data1;
    wire    [3:0]   data0;
    
    
    clk_use clk_use0 (
            .clk_use(clk_use), 
            .clk_sys(clk_sys), .go(go), .clr(clr)
            );
            
    watch   watch0  (
            .d2(data2), .d1(data1), .d0(data0),
            .clk_use(clk_use), .clr(clr)
            );
    led     led0    (
            .an(an), .seg(seg),
            .clk(clk_sys), .rst(clr), .in2(data2), .in1(data1), .in0(data0)
            );  
                 
endmodule

6. 约束文件con

set_property -dict {PACKAGE_PIN G2 IOSTANDARD LVCMOS33} [get_ports {an[3]}]
set_property -dict {PACKAGE_PIN C2 IOSTANDARD LVCMOS33} [get_ports {an[2]}]
set_property -dict {PACKAGE_PIN C1 IOSTANDARD LVCMOS33} [get_ports {an[1]}]
set_property -dict {PACKAGE_PIN H1 IOSTANDARD LVCMOS33} [get_ports {an[0]}]

set_property -dict {PACKAGE_PIN B4 IOSTANDARD LVCMOS33} [get_ports {seg[0]}]
set_property -dict {PACKAGE_PIN A4 IOSTANDARD LVCMOS33} [get_ports {seg[1]}]
set_property -dict {PACKAGE_PIN A3 IOSTANDARD LVCMOS33} [get_ports {seg[2]}]
set_property -dict {PACKAGE_PIN B1 IOSTANDARD LVCMOS33} [get_ports {seg[3]}]
set_property -dict {PACKAGE_PIN A1 IOSTANDARD LVCMOS33} [get_ports {seg[4]}]
set_property -dict {PACKAGE_PIN B3 IOSTANDARD LVCMOS33} [get_ports {seg[5]}]
set_property -dict {PACKAGE_PIN B2 IOSTANDARD LVCMOS33} [get_ports {seg[6]}]
set_property -dict {PACKAGE_PIN D5 IOSTANDARD LVCMOS33} [get_ports {seg[7]}]

set_property -dict {PACKAGE_PIN P17 IOSTANDARD LVCMOS33} [get_ports clk_sys ]
set_property -dict {PACKAGE_PIN N4 IOSTANDARD LVCMOS33} [get_ports {clr}]
set_property -dict {PACKAGE_PIN R1 IOSTANDARD LVCMOS33} [get_ports {go}]
本科生毕业论文(设计)开题报告书 题 目: 基于FPGA的数字秒表设计 学生姓名: *********** 学 号: ********** 专业班级: 自动化******班 指导老师: ************ 2010年 3 月 20 日 论文(设计)题目 ISP技术及其应用研究 课题目的、意义及相关研究动态: 课题设计的主要目的:运用所学的数字电子技术的基本知识和数字电子电路的设计方法,将数字电子技术的基础知识与EDA技术有机地联系起来,EDA电子仿真软件的仿真功能强大,具有完备的文件库,具有选用元器件创建电路、仿真模拟运行电路的功能,并且在输入信号的加入、输出信号的显示上能完全模拟实际和调制过程中的各种波型和操作过程。此类设计需要在EDA仿真软件上仿真进行,并利用下载工具,下载到特定的硬件设备上,进行实时的运行与验证,来证明所设计的电路的正确性。这样把所学到的理论知识综合的运用到一些较复杂的数字逻辑电路系统中去,使我们在实践基本技能方面得到一次全面系统的锻炼;这样可以使我们了解和掌握现代复杂数字系统芯片的设计方法和所用到的EDA工具,为走上社会进入专业的电子技术公司后,能胜任各种电子产品集成化的实际设计工作打下了坚实的基础。 课题的意义:秒表是一种常见的计时工具,种类比较多。这里用EDA技术设计一种基于FPGA 的数字秒表。它可以为用户提供了传统的PLD技术无法达到的灵活性,带来了巨大的时间效益和经济效益,是可编程技术的实质性飞跃。FPGA还是有其具大的优势比如它的高速性。 相关研究动态:现在对EDA的概念或范畴用得很宽。包括在机械、电子、通信、航空航天、化工、矿产、生物、医学、军事等各个领域,都有EDA的应用。目前EDA 技术已在各大公司、企事业单位和科研教学部门广泛使用。例如在飞机制造过程中,从设计、性能测试及特性分析直到飞行模拟,都可能涉及到EDA技术。本文所指的EDA技术,主要针对电子电路设计、PCB设计和IC设计。EDA 设计可分为系统级、电路级和物理实现级。 课题的主要内容(观点)、创新之处: 课题设计的主要内容: 1. 设计任务: 设计一个采用六位LED数码管显示分、秒,0.1s,0.01s计时方式的数字秒表。使用按键开关可实现开始/结束计时操作,及复位清零操作。 2.设计要求: 要求:1、设计方案具有合理性、科学性; 2、系统工作稳定可靠; 3、系统抗干扰性能强; 4、系统硬件电路简单、程序结构明晰。 3.系统功能 1. 有启/停开关,用于开始/结束计时操作 2秒表计时长度为59.分59.99秒,超过计时长度,有溢出则报警,计时长度可手动设置。 3. 设置复位开关,在任何情况下只要按下复位开关,秒表都要无条件进行复位清0操作。 4. 用FPGA器件实现,用VHDL语言编程,并进行下载,仿真。 创新之处: 利用EDA技术中最为瞩目的在系统可编程技术进行电子系统的设计的创新之处:1、用软件的方式设计硬件;2、用软件方式设计的系统到硬件系统的转换是由有关的开发软件自动完成;3、设计过程中可用有关软件进行各种仿真;4、系统可现场编程,在线升级;5、整个系统可集成在一个芯片上,体积小、功耗低、可靠性高。
### Ego1开发板 Vivado 秒表项目 开发教程 #### 一、项目概述 秒表项目的实现涉及多个模块的设计与集成,包括分频模块、计数模块以及数码管显示模块。这些模块共同协作完成秒表的功能需求。 #### 二、环境搭建 确保安装并配置好Vivado IDE工具链,熟悉其基本操作界面。对于Ego1开发板的支持包也需提前准备好,在创建新工程时指定目标器件型号为Ego1系列芯片[^2]。 #### 三、硬件描述语言编程——Verilog代码编写 ##### (一)顶层文件定义 ```verilog module top( input wire clk, input wire rst_n, output reg [7:0] seg_data[3:0], ... ); // 内部信号声明 wire sys_clk; ... endmodule ``` ##### (二)分频电路设计 为了适应不同频率的需求,通常会先构建一个稳定的低频时钟源作为后续逻辑运算的基础。 ```verilog module clk_divider ( input wire clk_in, // 输入较高频率的原始时钟信号 output reg div_clk_out // 输出经过N次分频后的较低频率时钟信号 ); parameter DIVISION_RATIO = 50_000; // 设定分频系数 integer count; always @(posedge clk_in or negedge rst_n) begin if (!rst_n) begin count <= 0; div_clk_out <= 0; end else if (count == DIVISION_RATIO - 1) begin count <= 0; div_clk_out <= ~div_clk_out; end else begin count <= count + 1; end end endmodule ``` 此部分实现了将输入的高频时钟转换成周期更长的新时钟脉冲序列用于驱动其他子系统工作[^3]。 ##### (三)计时单元编码 基于上述产生的稳定时基来累加计算流逝的时间长度,并提供相应的控制接口以便外部程序能够读取当前时刻或者重置计数值回零点位置。 ```verilog module stopwatch_counter ( input wire clk, input wire reset, input wire start_stop_toggle, input wire clear, output reg running_state, output reg [9:0] elapsed_time_ms, output reg [6:0] minutes, output reg [6:0] seconds ); reg [31:0] internal_tick_count; assign running_state = (start_stop_toggle && !clear); always @(*) begin case ({reset, clear}) 2'b10 : {minutes, seconds, elapsed_time_ms} <= 'd0 ; default:; endcase if(running_state) internal_tick_count += 1; if(internal_tick_count >= 100)//假设每tick代表1ms,则此处表示满1s后更新分钟和秒钟寄存器 begin internal_tick_count<=0; if(seconds<='h59) seconds+=1; else begin seconds<='d0; if(minutes<'h59) minutes+=1; else minutes<='d0; end end end endmodule ``` 这里展示了如何利用状态机结构管理暂停/继续按钮的状态变化影响内部计数流程;同时也处理了当达到最大限时自动翻转至下一单位的过程。 ##### (四)七段显示器驱动函数 最后一步就是把得到的数据映射到实际可见的形式上去展示给用户看懂的结果。 ```verilog function automatic [6:0] seven_segment_encoding(input [3:0] digit); begin unique case(digit) 4'd0:seven_segment_encoding=7'b1000000; 4'd1:seven_segment_encoding=7'b1111001; 4'd2:seven_segment_encoding=7'b0100100; 4'd3:seven_segment_encoding=7'b0110000; 4'd4:seven_segment_encoding=7'b0011001; 4'd5:seven_segment_encoding=7'b0010010; 4'd6:seven_segment_encoding=7'b0000010; 4'd7:seven_segment_encoding=7'b1111000; 4'd8:seven_segment_encoding=7'b0000000; 4'd9:seven_segment_encoding=7'b0010000; default:seven_segment_encoding=7'bx; endcase end endfunction ``` 该函数接收来自计时组件传递过来的小于等于十进制九的一位整型参数,返回对应字符图案所对应的亮灭模式组合串列供外设解析渲染输出图像[^4]。 #### 四、综合仿真测试 在完成全部RTL级建模之后,应当借助Xilinx自带波形编辑器对整个系统的动态行为特性进行全面检验分析,确认无误后再考虑部署到实体设备当中去运行观察效果是否满足预期性能指标要求。 #### 五、烧录固件上传 按照官方文档指示连接USB线缆至PC端口之间建立通信通道,选择合适的下载方式加载编译好的比特流文件(.bit),使得FPGA可以正常执行预设的任务指令集。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值