verilog的使用-1
1.判断上升沿
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) beginif(rst_n == 1'b0) begins_d0<= 1'b0;s_d1<= 1'b0;endelse begins_d0<= signal_in;s_d1<= s_d0;end
end
2.模块例化
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.时钟计数
reg [26:0] cnt;
always @(posedge clk or negedge rst_n) beginif (!rst_n)cnt<= 24'd0;else if (cnt< 24'd1000_0000)cnt<= counter + 1'b1;elsecnt<= 26'd0;
end
4.案件消抖
module key_debounce(input sys_clk, 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;endelse beginkey_reg <= key_in; if(key_reg != key_in) delay_cnt <= 32'd500_000; else if(key_reg == key_in) begin if(delay_cnt > 32'd0)delay_cnt <= delay_cnt - 1'b1;elsedelay_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; endelse beginif(delay_cnt == 32'd1) begin key_flag <= 1'b1; key_value <= key; endelse beginkey_flag <= 1'b0;key_value <= key_value; end end
end
5.时钟分频模块
module clock_generator (input clk_50m, input rst_n, output reg clk_out,
);
localparam CNT_CYCLE = 50_000_000;
reg [26:0] cnt_add;
always @(posedge clk_50m or negedge rst_n) beginif (!rst_n) begincnt_add <= 0;clk_out <= 0;end else beginif (cnt_add == CNT_CYCLE>>1-1) begincnt_add <= 0;clk_out <= ~clk_out; end else begincnt_add <= cnt_add + 1;endend
end