tag 标签: fpga,uart

相关博文
  • 热度 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