第7章
AXI4-Lite Peripheral
- 自作IPのチュートリアル
- reg0に書き込まれた値をそのままGPIOに出力するだけ
part-select
気になった記法。
slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8];
VerilogのPart-selectという記法で、slv_reg0のbyte_index*8から上位ビット方向に8bitの範囲に、S_AXI_WDATAのbyte_index*8から上位方向に8bitの範囲を代入するという意味らしい。つまり、
slv_reg0[(byte_index*8)+8-1:(byte_index*8)] <= S_AXI_WDATA[(byte_index*8)+8-1:(byte_index*8)];
と同じ。ちなみにビット幅は即値である必要がある。起点となるビットは変数でもOK。:-は下位ビット方向の意味になる。
文字表示回路
- Vivadoの使い方というより、表示回路の考え方を中心に確認
bit拡張
4bit深度のRGBを8bit深度の信号として出力する部分で、下記のように上位4bitを下位4bitにそのままコピーしている部分がある。
assign VGA_R[3:0] = VGA_R[7:4];
assign VGA_G[3:0] = VGA_G[7:4];
assign VGA_B[3:0] = VGA_B[7:4];
単純に4bit信号の最大値は15, 8bit信号の最大値は255であるが、15を単純に4bit左シフトすると240となり、8bitレンジをすべて使いきれない。255/15=17倍すべきであり、乗算器を使わない実装が
assign out = ((data << 4)|data);
となる。
デザインの微修正
AXI4スレーブIPをそのまま使用すると、下記のエラーが発生する。
[Synth 8-685] variable 'axi_rdata' should not be used in output port connection ["c:/FPGAprogramming/chardisp/chardisp.srcs/sources_1/bd/design_1/ipshared/f4b4/hdl/chardisp_ip_v1_0_S00_AXI.v":336]
該当信号をwireに変更。
chardisp_ip_v1_0_S00_AXI.v
// AXI4LITE signals
reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr;
reg axi_awready;
reg axi_wready;
reg [1 : 0] axi_bresp;
reg axi_bvalid;
reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr;
reg axi_arready;
wire [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata; // reg->wireに変更
reg [1 : 0] axi_rresp;
reg axi_rvalid;
他、約25MHzのPCKを作るためにMMCMの設定を変更する必要あり。これはサポートページのものをそのまま利用。
演習
- 文字の反転表示はvramout[20]を見てsreg[7]をそのまま/反転して取り出す
- 文字の点滅表示はPCKを間引いて約2Hzの基準信号を作り、基準信号でトグルする信号を作成。このトグル信号を見てsreg[7]をそのまま/反転して取り出す
- 演習その2は結構重そうなので、いったん先の章を進めることにする