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
相关推荐
9527华安1 天前
国产安路FPGA开发设计培训课程,提供开发板+工程源码+视频教程+技术支持
fpga开发·fpga·安路·视频教程·培训·安路fpga
UVM_ERROR1 天前
硬件设计实战:解决Valid单拍采样失效问题(附非阻塞赋值与时序对齐核心要点)
驱动开发·fpga开发·github·芯片
brave and determined1 天前
可编程逻辑器件学习(day36):从沙粒到智能核心:芯片设计、制造与封装的万字全景解析
fpga开发·制造·verilog·fpga·芯片设计·硬件设计·芯片制造
步达硬件2 天前
【FPGA】FPGA开发流程
fpga开发
我爱C编程2 天前
【仿真测试】基于FPGA的完整16QAM通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·16qam·帧同步·卷积编码·viterbi译码·维特比译码·频偏锁定
s09071363 天前
ZYNQ DMA to UDP 数据传输系统设计文档
网络协议·fpga开发·udp
燎原星火*3 天前
QSPI IP核 基本参数
fpga开发
XINVRY-FPGA3 天前
XCVU9P-2FLGC2104I Xilinx AMD Virtex UltraScale+ FPGA
嵌入式硬件·机器学习·计算机视觉·fpga开发·硬件工程·dsp开发·fpga
FPGA_小田老师3 天前
FPGA Debug:PCIE一直自动重启(link up一直高低切换)
fpga开发·pcie debug·pcie初始化问题
hexiaoyan8273 天前
视频信号检测板卡:208-Base Camera Link 图像信号模拟器
fpga开发·图像信号模拟器·视频信号检测·视频信号分析·智能图像分析