MIPSfpgaおよびUART

オープンソースのUART16550モジュールをAHB-Liteバスに移植してから1か月を過ぎました。 MIPSfpgaの中断に関する記事はまだ公開されていなかったため、その時点でそれについて書くことは多少論理的ではありませんでした。


経験豊富な開発者であれば、有益なニュースが1つだけあります。UART16550がMIPSfpga-plusシステムに追加されました。これ以上読むことはできません。 そして、このモジュールの逆アセンブルされた例に興味がある人のために-catへようこそ。


画像


はじめに


読者は:



UART16550とは何ですか?


このマイクロ回路の外観の歴史は[ L5 ]で詳しく説明されていますが、グーグル[ L6 ]でそのドキュメントを見つけることができます。



mfp_ahb_lite_uart16550
module mfp_ahb_lite_uart16550( //ABB-Lite side input HCLK, input HRESETn, input [ 31 : 0 ] HADDR, input [ 2 : 0 ] HBURST, input HMASTLOCK, // ignored input [ 3 : 0 ] HPROT, // ignored input HSEL, input [ 2 : 0 ] HSIZE, input [ 1 : 0 ] HTRANS, input [ 31 : 0 ] HWDATA, input HWRITE, output reg [ 31 : 0 ] HRDATA, output HREADY, output HRESP, input SI_Endian, // ignored //UART side input UART_SRX, // UART serial input signal output UART_STX, // UART serial output signal output UART_RTS, // UART MODEM Request To Send input UART_CTS, // UART MODEM Clear To Send output UART_DTR, // UART MODEM Data Terminal Ready input UART_DSR, // UART MODEM Data Set Ready input UART_RI, // UART MODEM Ring Indicator input UART_DCD, // UART MODEM Data Carrier Detect //UART internal output UART_BAUD, // UART baudrate output output UART_INT // UART interrupt ); parameter S_INIT = 0, S_IDLE = 1, S_READ = 2, S_WRITE = 3; reg [ 1:0 ] State, Next; assign HRESP = 1'b0; assign HREADY = (State == S_IDLE); always @ (posedge HCLK) begin if (~HRESETn) State <= S_INIT; else State <= Next; end reg [ 2:0 ] ADDR_old; wire [ 2:0 ] ADDR = HADDR [ 4:2 ]; wire [ 7:0 ] ReadData; parameter HTRANS_IDLE = 2'b0; wire NeedAction = HTRANS != HTRANS_IDLE && HSEL; always @ (*) begin //State change decision case(State) default : Next = S_IDLE; S_IDLE : Next = ~NeedAction ? S_IDLE : ( HWRITE ? S_WRITE : S_READ ); endcase end always @ (posedge HCLK) begin case(State) S_INIT : ; S_IDLE : if(HSEL) ADDR_old <= ADDR; S_READ : HRDATA <= { 24'b0, ReadData}; S_WRITE : ; endcase end wire [ 7:0 ] WriteData = HWDATA [ 7:0 ]; wire [ 2:0 ] ActionAddr; wire WriteAction; wire ReadAction; reg [ 10:0 ] conf; assign { ReadAction, WriteAction, ActionAddr } = conf; always @ (*) begin //io case(State) default : conf = { 2'b00, 8'b0 }; S_READ : conf = { 2'b10, ADDR }; S_WRITE : conf = { 2'b01, ADDR_old }; endcase end // Registers uart_regs regs( .clk ( HCLK ), .wb_rst_i ( ~HRESETn ), .wb_addr_i ( ActionAddr ), .wb_dat_i ( WriteData ), .wb_dat_o ( ReadData ), .wb_we_i ( WriteAction ), .wb_re_i ( ReadAction ), .modem_inputs ( { UART_CTS, UART_DSR, UART_RI, UART_DCD } ), .stx_pad_o ( UART_STX ), .srx_pad_i ( UART_SRX ), .rts_pad_o ( UART_RTS ), .dtr_pad_o ( UART_DTR ), .int_o ( UART_INT ), .baud_o ( UART_BAUD ) ); endmodule 

主要な実装機能




起動順序



プログラムとシステム構成の説明



謝辞


著者は教科書のデビッド・ハリスとサラ・ハリスの「デジタル回路とコンピューター・アーキテクチャ」 の翻訳者チーム 、現代のプロセッサー・コアのアカデミック・ライセンスについてはイマジネーション・テクノロジーズ 、MIPSfpgaの普及に関する仕事については個人的にユーリー・パンチュル・ユーリ・パンチュルに感謝しています。


参照資料


[L1]- デジタル回路とコンピューターアーキテクチャ
[L2] -MIPSfpgaの使用を開始する方法
[L3] -githubのMIPSfpga-plusプロジェクト
[L4]- ウィキペディア:UART ;
[L5]- ウィキペディア:UART16550 ;
[L6] -Google:UART16550 ;
[L7]- プロジェクトfreecores / uart16550 ;
[L8]- プロジェクトolofk / uart16550 ;
[L9]- プロジェクトのオープンコア/ UART 16550コア
[L10] -FPGA Terasic DE10-Lite ;
[L11]- プロジェクトahb_lite_uart16550 ;
[L12] -MIPSfpgaおよび割り込み


ドキュメント


[D1] -UART IPコア仕様
[D2] -MIPS32 microAptiv UPプロセッサーコアAHB-Liteインターフェイス


画像と表


[P1]- デバッグボードでの作業例 ;
[P2] -UART割り込みの処理モードで動作します
[P3]- レジスタを定期的にポーリングすることにより動作します。


ソースコードリンク


[S1]- モジュールmfp_ahb_lite_uart16550 ;
[S2]- カタログmipsfpga-plus / uart16550 ;
[S3]- オプションMFP_USE_DUPLEX_UART ;
[S4]- シグナルUART_SRXおよびUART_STX ;
[S5]- モデム制御インターフェース
[S6]- 割り込み信号の接続
[S7]- シミュレーションモードでのUART信号
[S8]- '05_uart'の使用例 ;
[S9]- '08_uart_irq'の使用例 ;
[S10]- サンプルプログラムの動作モードを設定します
[S11]- ヘッダーファイルuart16550.h
[S12]- ソフトウェア設定UART16550 ;
[S13]- 割り込みの設定
[S14] -UART割り込み処理
[S15]- 受信したUARTデータの読み取り
[S16]- 受信したデータを送り返します



Source: https://habr.com/ru/post/J325168/


All Articles