下面是我们所想要实现的:
它应该能像这样工作:
RS-232模块的参数是固定的: 8位数据, 2个停止位, 无奇偶校验.
假设我们已经有了一个115200波特的"BaudTick"信号.
我们需要产生开始位、8位数据以及停止位。
用状态机来实现看起来比较合适。
reg [3:0] state;
always @(posedge clk)
case(state)
4'b0000: if(TxD_start) state <= 4'b0100;
4'b0100: if(BaudTick) state <= 4'b1000; // 开始位
4'b1000: if(BaudTick) state <= 4'b1001; // bit 0
4'b1001: if(BaudTick) state <= 4'b1010; // bit 1
4'b1010: if(BaudTick) state <= 4'b1011; // bit 2
4'b1011: if(BaudTick) state <= 4'b1100; // bit 3
4'b1100: if(BaudTick) state <= 4'b1101; // bit 4
4'b1101: if(BaudTick) state <= 4'b1110; // bit 5
4'b1110: if(BaudTick) state <= 4'b1111; // bit 6
4'b1111: if(BaudTick) state <= 4'b0001; // bit 7
4'b0001: if(BaudTick) state <= 4'b0010; // 停止位1
4'b0010: if(BaudTick) state <= 4'b0000; // 停止位2
default: if(BaudTick) state <= 4'b0000;
endcase
注意看这个状态机是怎样实现当"TxD_start"有效就开始,但只在"BaudTick"有效的时候才转换状态的。.
现在,我们只需要产生"TxD"输出即可.
reg muxbit;
always @(state[2:0])
case(state[2:0])
0: muxbit <= TxD_data[0];
1: muxbit <= TxD_data[1];
2: muxbit <= TxD_data[2];
3: muxbit <= TxD_data[3];
4: muxbit <= TxD_data[4];
5: muxbit <= TxD_data[5];
6: muxbit <= TxD_data[6];
7: muxbit <= TxD_data[7];
endcase
//将开始位、数据以及停止位结合起来
assign TxD = (state<4) | (state[3] & muxbit);