調歩送信(途中)
/**************************************
* 調歩送信モジュール
***************************************/
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
eclipseとJREのアーキテクチャを合わせる(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」をコピー