調歩送信(途中)

/**************************************
* 調歩送信モジュール
***************************************/
module UART_TOP(
clk,
rst_n,
txd,
txc
);
//----------
// 入出力
//----------

//クロック・リセット
input clk;
input rst_n;

//送信データ
output reg txd;

//送信クロック
input txc;

//-------------------
// 送受信メモリ
//-------------------

//制御レジスタ
reg TX_EN;

//状態
reg [3:0] tx_state;
localparam [3:0] TX_IDLE = 0,
TX_START_BIT = 1,
TX_BYTE = 2,
TX_PARITY = 3,
TX_STOP_BIT = 4;

//-------------------
// 送受信メモリ
//-------------------

wire tx_empty;
reg tx_wren;
reg tx_rden;
reg [7:0] tx_data;
wire [7:0] tx_q;

MY_FIFO MY_FIFO_TX(
.clk (clk ),
.rst_n (rst_n ),
.empty (tx_empty ),
.wren (tx_wren ),
.data (tx_data ),
.rden (tx_rden ),
.q (tx_q )
);

//-------------------
// 送信処理
//-------------------

reg parity;
reg [2:0] tx_ptr;
wire [2:0] tx_ptr_next = tx_ptr + 3'b1;
wire [2:0] TX_PTR_END = 3'd7;

always @ (posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
//送信出力を初期化
txd <= 1'b0;

//送信用状態の初期化
tx_state <= TX_IDLE;
TX_EN <= 1'b0;
tx_ptr <= 3'b0;
tx_rden <= 1'b0;
parity <= 1'b0;
end
else begin
if(tx_state == TX_IDLE)begin
//送信開始条件判定
if(TX_EN && (~tx_empty))begin
//状態遷移
tx_state <= TX_START_BIT;
end
end
else if(txc)begin //他の状態では送信クロックに同期して処理する
if(tx_state == TX_START_BIT)begin
//状態遷移
tx_state <= TX_BYTE;

//スタートビットを設定する。
txd <= 1'b0;

//パリティをクリアする
parity <= 1'b0;

//データを読み出す
tx_rden <= 1'b1;
end
else if(tx_state == TX_BYTE)begin
//状態遷移条件
if(tx_ptr == TX_PTR_END)begin
//状態遷移
tx_state <= TX_PARITY;
end

//データの設定
txd <= tx_q[tx_ptr];
parity <= parity + tx_q[tx_ptr];
tx_ptr <= tx_ptr_next;
end
else if(tx_state == TX_PARITY)begin
//状態遷移
tx_state <= TX_STOP_BIT;

//パリティビットの設定
txd <= parity;
end
else if(tx_state == TX_STOP_BIT)begin
//状態遷移条件
if(TX_EN && (~tx_empty))begin
//状態遷移
tx_state <= TX_START_BIT;
end
else begin
tx_state <= TX_IDLE;
end

//ストップビットの設定
txd <= 1'b1;
end
end
else begin
//読み出しクロックは1クロックで落とす。
tx_rden <= 1'b0;
end
end
end


endmodule

module SIM();

localparam STEP = 3;
reg clk;
reg rst_n;

always begin
#(STEP/2) clk = 0;
#(STEP/2) clk = 1;
end

wire txd;

//-------------------
// モジュール本体
//-------------------
UART_TOP UART_TOP(
.clk (clk),
.rst_n (rst_n),
.txd (txd),
.txc (clk)
);

initial begin
//リセット

@(posedge clk) begin rst_n = 0;end


end
endmodule

Eclise + Verilog Editor

※ポイント1

 eclipseは旧バージョンを選んでインストールする。

 Eclipse Juno(4.2)で動作した。Eclipse Neon(4.6)は認識しなかった。

 

※ポイント2

 eclipseJREアーキテクチャを合わせる(64bitまたは32ビット)

 

※手順

(1) JREをインストール(x64)

  Eclipseを使用するにはJREのみで良い(JDKは不要)

  Javaインストールの詳細ページから64ビット版(x64)を入れること。

  トップページからだと32ビット版(x86)がインストールされる。

(2) Eclipseをインストール(x64)

  最新Eclipseだと動かないので、旧バージョンで動きそうなあたりを選択する。

(3) Eclipseのインストールフォルダ直下のpluginsフォルダに

  「net.sourceforge.veditor_1.2.2.jar」をコピー