ちょっと滞っていましたが、ようやくBasys3とPCとを繋ぐところまできました。 といっても、まだシミュレーション上ですが..
先に作成した、UART RXとUART TXを統合して、PCと繋ぐ部分を作ります。、PC側からコマンド”1″を送ると、Basys3から0~9ののバイトデータを送り返してくるという単純な機能にしました。
ソースです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
module UART_TRX( input MRST, input MCLK, input RXD, output TXD ); wire dataready, rdata, load; reg [7:0] tdata, datacnt, cmdreg; reg start; UART_RX UART_RX(.rxRST(MRST), .rxCLK(MCLK), .rxRXD(RXD), .rxDATAREADY(dataready), .rxDATA(rdata)); UART_TX UART_TX(.txRST(MRST), .txCLK(MCLK), .txDATA(tdata), .txSTART(start), .txLOAD(load), .txTXD(TXD)); reg cur, nex; always @(posedge MCLK) begin if(MRST) cur <= 0; else cur <= nex; end always @(posedge MCLK) begin if(MRST | cur == 1) cmdreg <= 0; else if(dataready) cmdreg <= rdata; end always @(posedge load or posedge MRST) begin if(MRST) datacnt <= 0; else begin tdata <= datacnt; datacnt <= datacnt + 1; end end always @(posedge MCLK) begin case(cur) 0: begin if(cmdreg == 1) nex <= 1; else nex <= 0; end 1: begin start <= 1; if(datacnt < 10) nex <= 1; else begin nex <= 0; start <= 0; end end endcase end endmodule |
テストベンチです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
module sim_UART_TRX; localparam STEP = 10; reg rst; reg clk; reg rxd; wire txd; UART_TRX UART_TRX( .MRST(rst), .MCLK(clk), .RXD(rxd), .TXD(txd) ); always begin clk = 0; #(STEP/2); clk = 1; #(STEP/2); end initial begin rxd = 1; rst = 0; #(STEP*10); rst = 1; #(STEP*10); rst = 0; #(STEP*10); rxd = 0; //Start bit #(STEP*20); rxd = 1; #(STEP*20); rxd = 0; #(STEP*20); rxd = 0; #(STEP*20); rxd = 0; #(STEP*20); rxd = 0; #(STEP*20); rxd = 0; #(STEP*20); rxd = 0; #(STEP*20); rxd = 0; #(STEP*20); rxd = 1; //Stop bit #(STEP*100); $stop; end endmodule |
制約ファイルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
## Clock signal set_property PACKAGE_PIN W5 [get_ports MCLK] set_property IOSTANDARD LVCMOS33 [get_ports MCLK] create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports MCLK] ##Buttons set_property PACKAGE_PIN U18 [get_ports MRST] set_property IOSTANDARD LVCMOS33 [get_ports MRST] ##USB-RS232 Interface set_property PACKAGE_PIN B18 [get_ports RXD] set_property IOSTANDARD LVCMOS33 [get_ports RXD] set_property PACKAGE_PIN A18 [get_ports TXD] set_property IOSTANDARD LVCMOS33 [get_ports TXD] |
シリアルポートは、ハンドシェイクなしです。 ハンドシェイク用の信号は用意されていないのでこうする以外ないのですが、最近は垂れ流しが一般的に使われているようです。
ボーレートは、5Mbpsでシミュレーションしていますが、実際にこれで動作するかどうかはやってみないと分かりません。 RS-232Cでは、数100kbpsが限度だと思いますが、ロジックのUARTだけだと3Mbpsぐらいで動作させた記憶があります。
論理合成は問題なく終了したので、確認用のソフトを作って実験したいと思います。