热度 9
2013-1-15 10:24
2763 次阅读|
4 个评论
串口在调试代码的时候,打印信息很方便,MCU,DSP,ARM,都是集成的串口控制器,向SBUF写数据,然后启动发送,就是可以开始发送数据了,但是FPGA没有这个集成的串口控制器,这就需要我们自己模拟IO来实现的,接下来我们具体谈谈。 http://bbs.ednchina.com/BLOG_ARTICLE_219306.HTM ,这是网友博客的地址,对串口讲的很经典,是FPGA实现串口的东西,很好,我就是参考他的代码,在这里表示感谢了, 这位网友给出的代码是串口调试助手发送一个字节数据到FPGA,然后FPGA将该字节返回给串口调试助手。 我用的功能需要连续发送16bit的数据,也就是说,每次启动串口发送,都是发送2个字节数据,只要TxD_start输入一定频率的矩形波,就是连续将16bit数据发送出去了。 看代码,我在网友的代码上修改的。 Data2uart是要发送的数据,data2是发送频率,我用KEY2来触发的。这是top层代码。 下面,我们看看async_transmitter里面我修改了什么,下面标红的代码,就是我添加的,没有什么难度,都可以看懂的,不多说了,这里还是要谢谢那个位网友。CLK时钟为50MHZ,波特率115200. reg counter; always @(posedge clk) if(TxD_ready TxD_start (counter2)) TxD_dataReg = TxD_data; wire TxD_dataD = RegisterInputData ? TxD_dataReg : TxD_data; always @(posedge clk ) if(counter2) 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 ) 3'd0: muxbit = TxD_dataD ; 3'd1: muxbit = TxD_dataD ; 3'd2: muxbit = TxD_dataD ; 3'd3: muxbit = TxD_dataD ; 3'd4: muxbit = TxD_dataD ; 3'd5: muxbit = TxD_dataD ; 3'd6: muxbit = TxD_dataD ; 3'd7: muxbit = TxD_dataD ; endcase end else begin case(state ) 3'd0: muxbit = TxD_dataD ; 3'd1: muxbit = TxD_dataD ; 3'd2: muxbit = TxD_dataD ; 3'd3: muxbit = TxD_dataD ; 3'd4: muxbit = TxD_dataD ; 3'd5: muxbit = TxD_dataD ; 3'd6: muxbit = TxD_dataD ; 3'd7: muxbit = TxD_dataD ; endcase end