野火FPGA跟练(一)——计数器、边沿检测


计数器

功能实现:

  1. 时钟:50MHz,每10ns翻转一次
  2. 复位:高电平时复位,从零重新计数,异步复位(复位的触发可与时钟不同步)
  3. 计数:从0开始计数,计数到7后,清零重新计

在这里插入图片描述参数设置:

参数名称参数内容
Count_Num计数范围为 0 ~ Count_Num - 1
WidthCount_Num 的位宽

代码:

module counter #(parameter Count_Num = 8, parameter Width = $clog2(Count_Num))(
    input wire CLK,
    input wire RST,
    output reg [Width-1:0] cnt
    );
    
    // 自动加一,复位或计满时置零,
    always @(posedge CLK or posedge RST) begin
        if(RST == 1'b1) begin
            cnt <= 1'b0;
        end
        else if(cnt == Count_Num - 1'b1) begin
            cnt <= 1'b0;
        end
        else begin
            cnt <= cnt + 1'b1;
        end
    end

endmodule

TestBench 代码:

`timescale 1ns / 1ps
module tb_counter(
    );
    reg CLK;
    reg RST;
    wire [2:0] cnt;
    
    // 初始化CLK和RST
    initial begin
        CLK <= 1'b1;
        RST <= 1'b1;
        #20;
        RST <= 1'b0;
        #35;
        RST <= 1'b1;
        #10;
        RST <= 1'b0;
    end
    always #10 CLK = ~CLK;
    
    initial begin
        $timeformat(-9, 0, "ns", 6);
        $monitor("@time %t:cnt = %d", $time, cnt);
    end
    
    // 实例模块
    counter #(
        .Count_Num (8)
    )tb_counter(
         .CLK   (CLK),
         .RST   (RST),
         .cnt   (cnt)
    );
        
endmodule

波形:
在这里插入图片描述
监视器输出:
在这里插入图片描述

边沿检测

对应野火FPGA视频的第十七讲——触摸按键控制LED灯。

功能实现:

  1. 时钟:50MHz,每10ns翻转一次
  2. 复位:异步复位,高电平时 IN_1、IN_2 置一
  3. 下边沿检测:检测 IN 的下降沿

在这里插入图片描述
时序图分析:

  • IN_1 是将 IN 同步到时钟信号上
  • IN_2 是 IN_1 的延迟一拍结果,是 IN_1 的滞后,代表 IN 的上一时刻
  • 当 IN_1 为低 IN_2 为高时,代表 IN 的上一时刻为高,下一时刻为低,即为下降沿
  • 若以 OUT 来标志下降沿的到来,OUT 需要根据 IN_1 和 IN_2 的状态来赋值
    • 若 OUT 通过组合(assign)方式赋值,那么每当 IN_1 和 IN_2 的状态满足判定条件的时候,OUT 就会实时地发生变化
    • 若 OUT 通过时序方式赋值,那么 OUT 会在下一个时钟周期进行赋值,其变化会相对组合方式延迟一拍

代码:

module EdgeDetection(
    input wire CLK,
    input wire RST,
    input wire IN,
    
    output wire OUT_1,
    output reg OUT_2
    );
    
reg IN_1;
reg IN_2;

// 边沿检测
always@(posedge CLK or posedge RST) begin
    if(RST == 1'b1) begin
        IN_1 <= 1'b1;
        IN_2 <= 1'b1;
    end
    else begin
        IN_1 <= IN;
        IN_2 <= IN_1;
    end
end

// 通过组合方式给OUT_1赋值
assign OUT_1 = ((IN_1 == 1'b0) && (IN_2 == 1'b1));

// 通过时序方式给OUT_2赋值
always@(posedge CLK or posedge RST) begin
    if(RST == 1'b1) begin
        OUT_2 <= 1'b0;
    end
    else if((IN_1 == 1'b0) && (IN_2 == 1'b1)) begin
        OUT_2 <= 1'b1;
    end
    else begin
        OUT_2 <= 1'b0;
    end
end

endmodule

TestBench 代码:

`timescale 1ns / 1ps
module tb_EdgeDetection(
    );
reg CLK;
reg RST;
reg IN;

wire OUT_1;
wire OUT_2;
    
// 初始化CLK和RST
initial begin
    CLK <= 1'b0;
    RST <= 1'b1;
    #40;
    RST <= 1'b0;
end 
always #10 CLK = ~CLK;

// 初始化IN
initial begin
    IN <= 1'b1;
    #60;
    IN <= 1'b0;
    #70;
    IN <= 1'b1;
    #50;
    IN <= 1'b0;
    #30;
    IN <= 1'b1;
end

// 实例模块    
EdgeDetection tb_EdgeDetection(
    .CLK(CLK),
    .RST(RST),
    .IN(IN),
    .OUT_1(OUT_1),
    .OUT_2(OUT_2)
);
    
endmodule

波形:
在这里插入图片描述

### 关于野火 FPGA 的配置教程与开发板使用说明 野火 FPGA款广泛应用于教学和实践的硬件平台,其配套的学习资料和技术文档能够有效帮助开发者掌握 FPGA 技术的核心概念以及具体应用。以下是关于野火 FPGA 配置教程及相关资源的信息: #### 学习资料获取 野火官方提供了系列丰富的学习材料,涵盖了从基础理论到实际项目的多个方面。可以通过以下途径获取相关资料: - **GitCode 资源库**:该仓库包含了完整的野火 FPGA 学习资料,适合初学者深入理解 FPGA 原理并进行实操习[^1]。 - **Gitee 教程项目**:针对组合逻辑电路的设计(如多路选择器、译码器等),提供了详细的 Verilog 实现案例及实战指导[^2]。 #### 开发板配置指南 对于野fire FPGA 征途系列开发板的具体配置方法,可以参考如下要点: - **环境搭建**:需安装 Quartus II 或其他支持目标芯片型号的开发工具软件,并设置好相应的驱动程序以确保 PC 和开发板之间的通信正常。 - **工程创建**:新建个适用于所选 FPGA 器件类型的工程项目,在顶层设计文件中定义输入输出端口及其连接关系。 - **代码编写与编译**:利用 HDL (Hardware Description Language) 描述所需实现的功能模块;经过综合、适配阶段生成最终可下载至 FPGA 的比特流文件(.sof)[^3]。 - **调试验证**:借助在线逻辑分析仪等功能对运行中的信号状态予以监测调整直至满足预期效果为止[^4]。 #### 数字温度传感器 DS18B20 设计实例解析 作为项典型的应用场景之——基于野火 FPGA 平台接入 DS18B20 数字温度传感元件完成测温作业,则遵循特定交互协议执行下列步骤操作序列即可达成既定目的: 1. 初始化总线; 2. 发送跳过 ROM 指令; 3. 启动单次测量周期; 4. 提供足够的延时间隔允许内部数据处理完毕; 5. 再度重复上述前两步动作以便准备接收后续反馈数值; 6. 下达读取存储单元内容请求进而提取当前环境参数记录值; 7. 结束本轮事务处理返回初始待命姿态重新循环前述流程环节继续采集新样本点信息直到结束条件触发终止全部进程活动为止。 ```verilog module ds18b20_interface( input wire clk, // 主时钟信号 inout wire data_pin, // 双向通讯线路接口 output reg start_conversion, output reg read_temperature, output wire temp_ready, output reg [15:0] temperature_value); // ...省略部分细节... always @(posedge clk or negedge reset_n) begin if (!reset_n) begin state <= IDLE; counter <= 0; // 清零其它变量... end else case(state) INIT_BUS: begin /* 执行初始化 */ end SKIP_ROM_CMD: begin /* 忽略ROM匹配指令传输*/end CONVERT_T:begin/*启动转换命令发出*/end WAIT_CONVERT_DONE:begin/*检测转换是否已完成*/end REINIT_AND_READ:start_conversion<=0;read_temperature=1;//切换至读模式 READ_TEMP_DATA:begin/*逐位捕获温度编码片段*/end FINISH:begin/*保存结果标志退出*/temp_ready<=1'b1;state<=IDLE;end default : ; endcase end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值