アドレス | ハードマクロ機能 |
---|---|
0x00-0x1F | PLL0ダイナミックアクセス1 |
0x20-0x3F | PLL1ダイナミックアクセス1 |
0x40-0x49 | I2Cプライマリ |
0x4A-0x53 | I2Cセカンダリ |
0x54-0x5D | SPI |
0x5E-0x6F | タイマ/カウンタ |
0x70-0x75 | フラッシュメモリ()UFM/コンフィグレーション |
0x76-0x77 | EFB割り込みソース |
信号名 | I/O | ビット幅 | 記述 |
---|---|---|---|
wb_clk_i | 入力 | 1 | 立ち上りエッジ有効のクロックで、EFBモジュール内のWISHBONEインターフェイス・レジスタ、及びハードマクロ機能によって使用される。クロック速度は最速133MHzまで対応。I2Cユーザスレーブやコンフィグ用スレーブとして用いる場合、クロック周波数がI2Cインターフェイス周波数の7.5倍より大きい必要がある(I2Cが400kHz動作の場合は>3.0MHz) |
wb_rst_i | 入力 | 1 | アクティブHighの同期リセット信号。WISHBONEインタフェース・ロジックのみをリセットする。この信号はいかなるレジスタの値にも影響しない。進行中のバストランザクションにのみ影響する。次のWISHBONEトランザクションを行う前に、ネゲート後1μ秒間待つこと |
wb_cyc_i | 入力 | 1 | WISHBONEマスタによってアサートされるアクティブHighの信号。有効なバスサイクルが進行中であることを示す |
wb_stb_i | 入力 | 1 | アクティブHighのストローブ入力信号。そのWISHBONEスレーブが進行中のバストランザクションのターゲットであることを示す。EFBモジュールは、ストローブのアサートに対応してアクノレッジを返す |
wb_we_i | 入力 | 1 | レベルセンシティブなライト/リード制御信号。Lowはリード動作を示し、そしてHighはライト動作を示す |
wb_adr_i | 入力 | 8 | 8ビット幅アドレス。EFBモジュールのレジスタマップからの特定のレジスタを選択するために使用される |
wb_dat_i | 入力 | 8 | 8ビット幅データ入力パス。EFBモジュールのレジスタマップの特定のレジスタへバイトデータをライトするために使用される |
wb_dat_o | 出力 | 8 | 8ビット幅データ出力パス。EFBモジュールのレジスタマップの特定のレジスタからバイトデータをリードするために使用される |
wb_ack_o | 出力 | 1 | Highアクティブの転送アクノレッジ信号で、EFBモジュールがアサートする。リクエストされた転送がアクノレッジされたことを示す |
レジスタ名 | 機能 | アドレス | アクセス |
---|---|---|---|
SPICR0 | 制御レジスタ0(インターバル設定) | 0x54 | R/W |
SPICR1 | 制御レジスタ1(SPE,WKUPEN_USER,WKUPEN_CFG,TXEDGE) | 0x55 | R/W |
SPICR2 | 制御レジスタ2(MSTR,MCSH,SDBRE,CPOL,CPHA,LSBF) | 0x56 | R/W |
SPIBR | クロック・プリスケール (DIVIDER) | 0x57 | R/W |
SPICSR | マスタチップセレクト(CSN_n) | 0x58 | R/W |
SPITXDR | 送信データ | 0x59 | W |
SPISR | ステータス(TIP,TRDY,RRDY,ROE,MDF) | 0x5A | R |
SPIRXDR | 受信データ | 0x5B | R |
SPIIRQ | 割込み要求(IRQTRDY,TRDY,RRDY,ROE,MDF) | 0x5C | R/W |
SPIIRQEN | 割込み要求イネーブル(IRQTRDYEN,RRDYEN,ROEEN,MDFEN) | 0x5D | R/W |
レジスタ名 | 機能 | アドレス | アクセス |
---|---|---|---|
CFGCR | 制御レジスタ(WBCE,RSTE) | 0x70 | R/W |
CFGTXDR | 送信データ | 0x71 | W |
CFGSR | ステータス(WBCACT,TXFE,TXFF,RXFE,RXFF,SSPIACT,I2CACT) | 0x72 | R |
CFGRXDR | 受信データ | 0x73 | R |
CFGIRQ | 割込みステータス(IRQTXFE,TXFF,RXFE,RXFF,SSPIACT,I2CACT) | 0x74 | R/W |
CFGIRQEN | 割込み要求イネーブル(IRQTXFEEN,TXFFEN,RXFEEN,RXFFEN,SSPIACTEN,I2CACTEN) | 0x75 | R/W |
デバイス | HE/ZE | HC |
---|---|---|
MachXO2-256 | 0x01 2B 00 43 | 0x01 2B 80 43 |
MachXO2-640 | 0x01 2B 10 43 | 0x01 2B 90 43 |
MachXO2-1200/MachXO2-640U | 0x01 2B 20 43 | 0x01 2B A0 43 |
MachXO2-2000/MachXO2-1200U | 0x01 2B 30 43 | 0x01 2B B0 43 |
MachXO2-4000/MachXO2-2000U | 0x01 2B 40 43 | 0x01 2B C0 43 |
MachXO2-7000 | 0x01 2B 50 43 | 0x01 2B D0 43 |
`timescale 1ns / 1ps
module wbtest (
input clk,
input rst,
output oscen,
output [7:0] led,
output tx,
input rx
);
// WISHBONE STATE
parameter WB_IDLE = 0;
parameter WB_ASSERT = 1;
parameter WB_NEGATE = 2;
parameter WB_WRITE1 = 3;
parameter WB_WRITE1_1 = 4;
parameter WB_READ1 = 5;
parameter WB_READ1_1 = 6;
parameter WB_WRITE4 = 10;
parameter WB_WRITE4_1 = 11;
parameter WB_WRITE4_2 = 12;
parameter WB_WRITE4_3 = 13;
parameter WB_READ4 = 20;
parameter WB_READ4_1 = 21;
parameter WB_READ4_2 = 22;
parameter WB_READ4_3 = 23;
parameter WB_READ4_4 = 24;
parameter WB_TXOUT = 30;
parameter WB_TXOUT_1 = 31;
parameter WB_IDREAD = 100;
parameter WB_IDREAD_1 = 101;
parameter WB_IDREAD_2 = 102;
parameter WB_IDREAD_3 = 103;
parameter WB_IDREAD_4 = 104;
parameter WB_IDREAD_5 = 105;
parameter WB_IDREAD_6 = 106;
parameter WB_IDREAD_7 = 107;
parameter CFGCR = 8'h70;
parameter CFGTXDR = 8'h71;
parameter CFGSR = 8'h72;
parameter CFGRXDR = 8'h73;
parameter CFGIRQ = 8'h74;
parameter CFGIRQEN = 8'h75;
reg [7:0] wb_adrs;
reg [7:0] wb_data;
reg [31:0] wb_wdata;
reg [31:0] wb_rdata;
reg [7:0] wb_state;
reg [7:0] wb_nstate;
reg [7:0] wb_rstate;
reg wb_cyc;
reg wb_stb;
reg wb_we;
reg wb_rxx;
wire [7:0] wb_adr_i;
wire [7:0] wb_dat_i;
wire [7:0] wb_dat_o;
reg [23:0] count;
serial_probe probe (
.clk(clk), // 40MHz
.rst(rst),
.rx(wb_rxx),
.tx(tx),
.txf(txf),
.probe(wb_data)
);
efb efbx ( // EFBモジュール
.wb_clk_i(clk),
.wb_rst_i(rst),
.wb_cyc_i(wb_cyc_i),
.wb_stb_i(wb_stb_i),
.wb_we_i(wb_we_i),
.wb_adr_i(wb_adr_i),
.wb_dat_i(wb_dat_i),
.wb_dat_o(wb_dat_o),
.wb_ack_o(wb_ack_o),
.wbc_ufm_irq( )
);
assign wb_adr_i = wb_adrs;
assign wb_dat_i = wb_data;
assign wb_cyc_i = wb_cyc;
assign wb_stb_i = wb_stb;
assign wb_we_i = wb_we;
// WISHBONE STATE MACHINE
always @(posedge clk or posedge rst)
begin
if (rst) begin
wb_state <= WB_IDLE;
wb_rxx <= 1;
end
else
case (wb_state)
WB_IDLE: begin
if (rx==0)
wb_state <= WB_IDREAD;
end
// Device ID Read
WB_IDREAD: begin
wb_nstate <= WB_IDREAD_1;
wb_state <= WB_ASSERT;
end
WB_IDREAD_1: begin
wb_adrs <= CFGTXDR;
wb_wdata <= 32'hE0000000;
wb_nstate <= WB_IDREAD_2;
wb_state <= WB_WRITE4;
end
WB_IDREAD_2: begin
wb_adrs <= CFGRXDR;
wb_nstate <= WB_IDREAD_3;
wb_state <= WB_READ4;
end
WB_IDREAD_3: begin
wb_nstate <= WB_IDREAD_4;
wb_state <= WB_NEGATE;
end
WB_IDREAD_4: begin
wb_data <= wb_rdata[31:24];
wb_nstate <= WB_IDREAD_5;
wb_state <= WB_TXOUT;
end
WB_IDREAD_5: begin
wb_data <= wb_rdata[23:16];
wb_nstate <= WB_IDREAD_6;
wb_state <= WB_TXOUT;
end
WB_IDREAD_6: begin
wb_data <= wb_rdata[15:8];
wb_nstate <= WB_IDREAD_7;
wb_state <= WB_TXOUT;
end
WB_IDREAD_7: begin
wb_data <= wb_rdata[7:0];
wb_nstate <= WB_IDLE;
wb_state <= WB_TXOUT;
end
// Serial Output
WB_TXOUT: begin
if (!txf) begin
wb_rxx <= 0;
wb_state <= WB_TXOUT_1;
end
end
WB_TXOUT_1: begin
wb_rxx <= 1;
wb_state <= wb_nstate;
end
// Write 1byte
WB_WRITE1: begin
wb_cyc <= 1;
wb_stb <= 1;
wb_we <= 1;
wb_state <= WB_WRITE1_1;
end
WB_WRITE1_1: begin
if (wb_ack_o) begin
wb_cyc <= 0;
wb_stb <= 0;
wb_we <= 0;
wb_state <= wb_nstate;
end
end
// Write 4byte
WB_WRITE4: begin
wb_data <= wb_wdata[31:24];
wb_rstate <= wb_nstate;
wb_nstate <= WB_WRITE4_1;
wb_state <= WB_WRITE1;
end
WB_WRITE4_1: begin
wb_data <= wb_wdata[23:16];
wb_nstate <= WB_WRITE4_2;
wb_state <= WB_WRITE1;
end
WB_WRITE4_2: begin
wb_data <= wb_wdata[15:8];
wb_nstate <= WB_WRITE4_3;
wb_state <= WB_WRITE1;
end
WB_WRITE4_3: begin
wb_data <= wb_wdata[7:0];
wb_nstate <= wb_rstate;
wb_state <= WB_WRITE1;
end
// Read 1byte
WB_READ1: begin
wb_cyc <= 1;
wb_stb <= 1;
wb_state <= WB_READ1_1;
end
WB_READ1_1: begin
if (wb_ack_o) begin
wb_cyc <= 0;
wb_stb <= 0;
wb_data <= wb_dat_o;
wb_state <= wb_nstate;
end
end
// Read 4byte
WB_READ4: begin
wb_rstate <= wb_nstate;
wb_nstate <= WB_READ4_1;
wb_state <= WB_READ1;
end
WB_READ4_1: begin
wb_rdata[31:24] <= wb_data;
wb_nstate <= WB_READ4_2;
wb_state <= WB_READ1;
end
WB_READ4_2: begin
wb_rdata[23:16] <= wb_data;
wb_nstate <= WB_READ4_3;
wb_state <= WB_READ1;
end
WB_READ4_3: begin
wb_rdata[15:8] <= wb_data;
wb_nstate <= WB_READ4_4;
wb_state <= WB_READ1;
end
WB_READ4_4: begin
wb_rdata[7:0] <= wb_data;
wb_state <= wb_rstate;
end
// WISHBONE Assert,Negate
WB_ASSERT: begin
wb_adrs <= CFGCR;
wb_data <= 8'h80;
wb_state <= WB_WRITE1;
end
WB_NEGATE: begin
wb_adrs <= CFGCR;
wb_data <= 8'h00;
wb_state <= WB_WRITE1;
end
endcase
end
// 以下、LED点滅させてるだけで、全く無関係
always @(posedge clk or posedge rst)
begin
if (rst)
count <= 0;
else
count <= count+1;
end
assign led = count[3:0]==0?~count[23:16]:~0; // LED明るすぎるので、暗くしている
assign oscen = 1;
endmodule
`timescale 1ns / 1ps
module dstest_tb;
// Inputs
reg rx;
reg rst;
reg clk;
// Outputs
wire oscen;
wire tx;
wire [7:0] led;
dstest UUT (
.clk(clk),
.rst(rst),
.oscen(oscen),
.led(led),
.tx(tx),
.rx(rx)
);
parameter CYCLE = 100; // 1サイクルを100と定義する
always #(CYCLE/2) clk = ~clk; // クロック生成
initial begin
#0; // 初期化
rx = 1;
rst = 0;
clk = 0;
#(CYCLE);
rst = 1; // リセット
#(CYCLE);
rst = 0;
#(CYCLE*100);
rx = 0; // rxキー入力ダミー
#(CYCLE*10);
rx = 1;
#(CYCLE*10000);
end
endmodule
01
2B
50
43
01
2B
20
43
# ELAB2: Fatal Error: ELAB2_0036 Unresolved hierarchical reference to "GSR_INST.GSRNET" from module "dstest_tb.UUT.efbx.EFBInst_0" (module not found).
# KERNEL: Warning: KERNEL_0085 "/dstest_tb/UUT/wb_adrs" does not have read access. Use switch +access +r for this region.