FPGA实现串行接口 RS232
2012-11-29
标签:

RS-232发送模块

下面是我们所想要实现的:

它应该能像这样工作:

  • 发送器接收8位的数据,并将其串行输出。("TxD_start"置位后开始传输).
  • 当有数传输的时候,使"busy"信号有效,此时“TxD_start”信号被忽略.

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);

共 5 页   上一页12345下一页
可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号