串口在调试代码的时候,打印信息很方便,MCU,DSP,ARM,都是集成的串口控制器,向SBUF写数据,然后启动发送,就是可以开始发送数据了,但是FPGA没有这个集成的串口控制器,这就需要我们自己模拟IO来实现的,接下来我们具体谈谈。
我用的功能需要连续发送16bit的数据,也就是说,每次启动串口发送,都是发送2个字节数据,只要TxD_start输入一定频率的矩形波,就是连续将16bit数据发送出去了。
看代码,我在网友的代码上修改的。

Data2uart是要发送的数据,data2是发送频率,我用KEY2来触发的。这是top层代码。
下面,我们看看async_transmitter里面我修改了什么,下面标红的代码,就是我添加的,没有什么难度,都可以看懂的,不多说了,这里还是要谢谢那个位网友。CLK时钟为50MHZ,波特率115200.
reg [1:0]counter;
always @(posedge clk)
if(TxD_ready & TxD_start & (counter<2)) TxD_dataReg <= TxD_data;
wire [15:0] TxD_dataD = RegisterInputData ? TxD_dataReg : TxD_data;
always @(posedge clk )
if(counter<2)
begin
case(state)
4'b0000: if(TxD_start) state <= 4'b0001;
4'b0001: if(BaudTick) state <= 4'b0100;
4'b0100: if(BaudTick) state <= 4'b1000;
// start
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)
begin
state <= 4'b0010;
counter<=counter+1;
end
// bit 7
4'b0010: if(BaudTick) state <= 4'b0011;
// stop1
4'b0011: if(BaudTick) state <= 4'b0000;
// stop2
default: if(BaudTick) state <= 4'b0000;
endcase
end
else if(TxD_start==0)
counter<=0;
reg muxbit;
always @( * )
if(counter==0)
begin
case(state[2:0])
3'd0: muxbit <= TxD_dataD[0];
3'd1: muxbit <= TxD_dataD[1];
3'd2: muxbit <= TxD_dataD[2];
3'd3: muxbit <= TxD_dataD[3];
3'd4: muxbit <= TxD_dataD[4];
3'd5: muxbit <= TxD_dataD[5];
3'd6: muxbit <= TxD_dataD[6];
3'd7: muxbit <= TxD_dataD[7];
endcase
end
else
begin
case(state[2:0])
3'd0: muxbit <= TxD_dataD[8];
3'd1: muxbit <= TxD_dataD[9];
3'd2: muxbit <= TxD_dataD[10];
3'd3: muxbit <= TxD_dataD[11];
3'd4: muxbit <= TxD_dataD[12];
3'd5: muxbit <= TxD_dataD[13];
3'd6: muxbit <= TxD_dataD[14];
3'd7: muxbit <= TxD_dataD[15];
endcase
end |