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
相关推荐
明德扬6 小时前
K7+AD9144 多模式实测|8 种 JESD204B 配置全覆盖验证
fpga开发
xyx-3v15 小时前
SOC相对于版上系统的优势是什么?
fpga开发
Aaron15882 天前
RFSOC+VU13P+GPU 在6G互联网中的技术应用
大数据·人工智能·算法·fpga开发·硬件工程·信息与通信·信号处理
stars-he2 天前
基于 Design Compiler 的 UDP Payload 追加控制模块综合与门级后仿真
笔记·fpga开发·udp
尤老师FPGA2 天前
HDMI数据的接收发送实验(十)
fpga开发
逻辑诗篇2 天前
破核拆解:PCIE719——基于Xilinx Zynq UltraScale+的高性能SAS扩展卡设计
fpga开发·架构
逻辑诗篇2 天前
高性能存储扩展利器|PCIE719 基于Zynq UltraScale+的企业级可编程SAS方案
fpga开发
liuluyang5302 天前
SV主要关键词详解
fpga开发·uvm·sv
happyDogg_3 天前
验证环境采样rtl时序数据遇到的问题
fpga开发
unicrom_深圳市由你创科技3 天前
项目分析和FPGA器件选型外包服务包括哪些内容?别让选错芯片毁了整个项目
fpga开发