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
相关推荐
Lee_yayayayaya3 小时前
锁相环技术及FPGA实现
fpga开发
Js_cold8 小时前
Verilog局部参数localparam
开发语言·fpga开发·verilog
promising-w8 小时前
【FPGA】使用移位实现LED流水灯
fpga开发
爱吃汽的小橘9 小时前
ZYNQ介绍
fpga开发
ThreeYear_s18 小时前
电力电子技术学习路径与FPGA/DSP技术结合方向(gemini生成)
学习·fpga开发
奋斗的牛马1 天前
FPGA—ZYNQ学习spi(六)
单片机·嵌入式硬件·学习·fpga开发·信息与通信
GateWorld1 天前
FPGA核心约束类型与语法
fpga开发
SKYDROID云卓小助手1 天前
无人设备遥控器之数字图传技术
运维·服务器·单片机·嵌入式硬件·fpga开发
Topplyz1 天前
在FPGA中实现频率计方案详解(等精度测量)
fpga开发·fpga·频率计
whik11941 天前
如何测量FPGA管脚的好坏
fpga开发