- 4.led模块:
- module led_ctrl(
- input sys_clk, //外部50M时钟
- input sys_rst_n, //外部复位信号,低有效
- input led_en, //led控制使能,接收到uart_done
- input [3:0] led_data, //led控制数据
- output reg [3:0] led //led灯
- );
- //reg define
- reg led_en_d0;
- reg led_en_d1;
- //wire define
- wire led_en_flag;
- //*****************************************************
- //** main code
- //*****************************************************
- //捕获led_en上升沿,得到一个时钟周期的脉冲信号
- assign led_en_flag = (~led_en_d1) & led_en_d0;
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if (!sys_rst_n) begin s
- led_en_d0 <= 1'b0;
- led_en_d1 <= 1'b0;
- end
- else begin
- led_en_d0 <= led_en;
- led_en_d1 <= led_en_d0; //当没有接收完时为0
- end
- end
- always @(posedge sys_clk or negedge sys_rst_n) begin
- if (!sys_rst_n)
- led <= 4'b0000;
- else if(led_en_flag) //在led_en上升沿到来时,改变led灯的状态
- led <= ~led_data; //按键按下时为低电平,而led高电平时点亮
- else
- led <= led;
- end
- endmodule
- 5.顶层模块:
- module rs485_uart_top(
- input sys_clk, //外部50M时钟
- input sys_rst_n, //外部复位信号,低有效
- input [3:0] key, //按键
- output [3:0] led, //led灯
- //uart接口
- input rs485_uart_rxd, //rs485串口接收端口
- output rs485_uart_txd, //rs485串口发送端口
- output rs485_tx_en //rs485发送使能,高有效
- );
- //parameter define
- parameter CLK_FREQ = 50000000; //定义系统时钟频率50M
- parameter UART_BPS = 115200; //定义串口波特率
- //wire define
- wire tx_en_w; //UART发送使能
- wire rx_done_w; //UART接收完毕信号
- wire [7:0] tx_data_w; //UART发送数据
- wire [7:0] rx_data_w; //UART接收数据
- wire [3:0] key_value_w; //消抖后的按键数据
- //*****************************************************
- //** main code
- //*****************************************************
- assign tx_data_w = {4'd0,key_value_w}; //将按键消抖后的值送到发送模块
- uart_recv #( //串口接收模块
- .CLK_FREQ (CLK_FREQ), //设置系统时钟频率
- .UART_BPS (UART_BPS)) //设置串口接收波特率
- u_uart_recv(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
- .uart_rxd (rs485_uart_rxd),
- .uart_done (rx_done_w),
- .uart_data (rx_data_w)
- );
- uart_send #( //串口发送模块
- .CLK_FREQ (CLK_FREQ), //设置系统时钟频率
- .UART_BPS (UART_BPS)) //设置串口发送波特率
- u_uart_send(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
- .uart_en (tx_en_w),
- .uart_din (tx_data_w),
- .uart_txd (rs485_uart_txd),
- .tx_flag (rs485_tx_en) //rs485串口发送使能,高有效
- );
- key_debounce u_key_debounce(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
- .key (key),
- .key_flag (tx_en_w), //按键有效通知信号
- .key_value (key_value_w) //按键消抖后的数据
- );
- led_ctrl u_led_ctrl(
- .sys_clk (sys_clk),
- .sys_rst_n (sys_rst_n),
- .led_en (rx_done_w), //led控制使能
- .led_data (rx_data_w[3:0]), //led控制数据
- .led (led)
- );
- endmodule
|