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
相关推荐
徐晓康的博客1 小时前
Verilog功能模块--SPI主机和从机(03)--SPI从机设计思路与代码解析
fpga开发·verilog·主机·spi·从机
listhi5201 天前
FPGA设计中的信号完整性量化与优化:探索高速数字系统的关键路径
fpga开发
hahaha60161 天前
xilinx的oddr原语是否可以直接使用verilog实现?
fpga开发
I'm a winner2 天前
FPGA 在情绪识别领域的护理应用(三)
fpga开发·前沿研究
小眼睛FPGA2 天前
【盘古100Pro+开发板实验例程】FPGA学习 | gamma 变化 | 图像实验指导手册
科技·学习·ai·fpga开发·fpga
I'm a winner2 天前
FPGA 在情绪识别领域的护理应用(二)
fpga开发·学习方法·前沿研究
9527华安3 天前
FPGA实现Aurora 64B66B图像视频点对点传输,基于GTH高速收发器,提供2套工程源码和技术支持
fpga开发·音视频·aurora·gth·高速收发器·64b66b
XINVRY-FPGA3 天前
EPM240T100I5N Altera FPGA MAX II CPLD
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发·射频工程·fpga
第二层皮-合肥4 天前
FPGA实现ETH接口
单片机·嵌入式硬件·fpga开发
璞致电子4 天前
【PZ-ZU47DR-KFB】璞致FPGA ZYNQ UltraScalePlus RFSOC QSPI Flash 固化常见问题说明
嵌入式硬件·fpga开发·fpga·软件无线电·sdr