3-verilog的使用-1

verilog的使用-1

1.判断上升沿

c 复制代码
reg    s_d0;
reg    s_d1;
wire   signal_up ;
//判断信号的上升沿
assign  signal_up = (~touch_key_d1) & touch_key_d0;
always @ (posedge clk or negedge rst_n) begin
    if(rst_n == 1'b0) begin
        s_d0<= 1'b0;
        s_d1<= 1'b0;
    end
    else begin
        s_d0<= signal_in;
        s_d1<= s_d0;
    end 
end

2.模块例化

c 复制代码
uart_reveive #(                       //串口接收例化
    .CLK_FREQ       (CLK_FREQ),       //设置频率
    .UART_BPS       (UART_BPS))       //设置波特率
u_uart_receive(                 
    .sys_clk        (sys_clk), 
    .sys_rst_n      (sys_rst_n),
    
    .uart_rxd       (uart_rxd),
    .uart_done      (uart_w_en),
    .uart_data      (uart_data_w)
    );

3.时钟计数

c 复制代码
reg [26:0] cnt;
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        cnt<= 24'd0;
    else if (cnt< 24'd1000_0000)
        cnt<= counter + 1'b1;
    else
        cnt<= 26'd0;
end

4.案件消抖

c 复制代码
module key_debounce(
    input            sys_clk,          //外部50M时钟
    input            sys_rst_n,        //外部复位信号,低有效
    
    input            key_in,              //外部按键输入
    output reg       key_flag,         //按键数据有效信号
	output reg       key_value         //按键消抖后的数据  
    );

reg [31:0] delay_cnt;
reg        key_reg;

always @(posedge sys_clk or negedge rst_n) begin 
    if (!rst_n) begin 
        key_reg   <= 1'b1;
        delay_cnt <= 32'd0;
    end
    else begin
        key_reg <= key_in;				//非阻塞赋值,按键输入是wire类型的,随时可能有值的变化
        if(key_reg != key_in)          //一旦检测到按键状态发生变化(有按键被按下或释放)
            delay_cnt <= 32'd500_000;  //给延时计数器重新装载初始值(计数时间为10ms)
        else if(key_reg == key_in) begin  //在按键状态稳定时,计数器递减,开始10ms倒计时
                 if(delay_cnt > 32'd0)
                     delay_cnt <= delay_cnt - 1'b1;
                 else
                     delay_cnt <= delay_cnt;
             end           
    end   
end
always @(posedge sys_clk or negedge rst_n) begin 
    if (!rst_n) begin 
        key_flag  <= 1'b0;
        key_value <= 1'b1;          
    end
    else begin
        if(delay_cnt == 32'd1) begin   //当计数器递减到1时,说明按键稳定状态维持了20ms
            key_flag  <= 1'b1;         //此时消抖过程结束,给出一个时钟周期的标志信号
            key_value <= key;          //并寄存此时按键的值
        end
        else begin
            key_flag  <= 1'b0;
            key_value <= key_value; 
        end  
    end   
end

5.时钟分频模块

c 复制代码
module clock_generator (
    input  clk_50m,       		// 50MHz输入时钟
    input  rst_n,         		// 异步低电平复位
    output reg clk_out,        	// 周期时钟输出
);
localparam CNT_CYCLE   = 50_000_000;   //1秒 = 50,000,000个周期
// 计数器定义
reg [26:0] cnt_add;     
// 1秒时钟生成
always @(posedge clk_50m or negedge rst_n) begin
    if (!rst_n) begin
        cnt_add <= 0;
        clk_out <= 0;
    end else begin
        if (cnt_add == CNT_CYCLE>>1-1) begin
            cnt_add <= 0;
            clk_out <= ~clk_out;  // 翻转产生50%占空比
        end 
        else begin
            cnt_add <= cnt_add + 1;
        end
    end
end
相关推荐
ChipCamp3 小时前
Chisel芯片开发入门系列 -- 14. CPU芯片开发和解释4(Load/Store指令再探)
arm开发·青少年编程·fpga开发·scala·dsp开发·risc-v·chisel
霖005 小时前
深入讲讲异步FIFO
笔记·vscode·单片机·嵌入式硬件·学习·fpga开发
嵌入式-老费8 小时前
再谈fpga开发(总结篇)
fpga开发
minglie110 小时前
基于 AXI-Lite 实现可扩展的硬件函数 RPC 框架(附完整源码)
fpga开发
朱古力(音视频开发)13 小时前
NDI开发指南
fpga开发·音视频·实时音视频·视频编解码·流媒体
9527华安1 天前
FPGA实现AD9361采集转SRIO与DSP交互,FPGA+DSP多核异构信号处理架构,提供2套工程源码和技术支持
fpga开发·架构·信号处理·dsp·ad9361·多核异构
小眼睛FPGA1 天前
【盘古100Pro+开发板实验例程】FPGA学习 | 基于紫光 FPGA 的键控 LED 流水灯
科技·学习·ai·fpga开发·fpga
最好有梦想~2 天前
分享一个FPGA寄存器接口自动化工具
fpga开发
hahaha60162 天前
FPGA(或者数字电路)中组合逻辑和时序逻辑是怎么划分的
fpga开发