通信是时序电路的基础之一
要保证信息能够在不同模块直接准确传输
通信协议是保证信息传输的格式要求
那么下面我们就来设计个最简单的
也是最基础的串口通信模块
串口通信时序这里不做介绍
该串口模块的功能描述如下:
波特率9600
停止位1
校验位无
接收字节后将字节加一发送回去
首先是PLL模块
PLL模块给串口模块提供稳定的时钟信号
代码如下:
module PLL(
input[31:0] sub,
input clk,
input rst,
output reg clk_out
);
reg[31:0] cnt;
initial begin
cnt = 32'd1;
clk_out = 0;
end
always @(posedge clk or negedge rst) begin
if (rst == 0) begin
cnt = 32'd1;
clk_out = 0;
end
else if(cnt < sub) begin
cnt = cnt + 1;
end
else if(cnt >= sub) begin
clk_out = ~clk_out;
cnt = 32'd1;
end
end
endmodule
然后是串口模块
代码如下
module USART(
input clk, //24Mhz
input rst,
input rx,
output reg tx
);
reg[7:0] buff;
reg[7:0] rx_shift;
reg[7:0] tx_shift