日曜日, 7月 29, 2007

アドレスデコーダ

ここでの"デコーダ"とは、アドレスをデコードしてチップセレクト信号を生成するようないわゆるアドレスデコーダです。

Verilogでの一般的な記述は次のようなものでしょうか?

case(address)
2'd0: chipSelect = 4'b0001;
2'd1: chipSelect = 4'b0010;
2'd2: chipSelect = 4'b0100;
2'd3: chipSelect = 4'b1000;
endcase

この場合、再利用性が少々乏しくなります。
次のような記述方法もあります。

parameter AD_WIDTH = 2;
parameter CS_WIDTH = 4;

input [AD_WIDTH-1:0] address;
output [CS_WIDTH-1:0] chipSelect;

assign chipSelect = 1 << address;

これならパラメータの変更のみで再利用可能です。

ちなみにCSR(コントロールステータスレジスタ)を記述するような場合、
私はアドレスデコーダを明確に記述することはしません。
だいたいこのような感じです。

always @(posedge ICLK or posedge IRST) begin
if (IRST) begin
regControl <= 0;
end else begin
if ((WE)&&(address==ADR_CONTROL))
regControl <= writeData;
end
end

これをデコーダを書いて、セレクト信号を生成して・・・とやると
デコーダ分の記述が増えるだけでなく
次のような記述を見て

always @(posedge ICLK or posedge IRST) begin
if (IRST) begin
regControl <= 0;
end else begin
if ((WE)&&(sel[4]))
regControl <= writeData;
end
end

はたして、セレクト信号のbit4はこのレジスタのものだっただろうか?
とデコーダの記述を見に行く必要もなくなります。

これも抽象化の一例ですね。



しかし、このブログはコードが書きづらい。
preタグと"<<"を一緒に使うと崩れてしまう。
いい方法無いのかなぁ。

0 件のコメント: