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; else cnt<= 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; 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; 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