今日はVerilog-HDLのお勉強をしようと思い、
この本を買いました。
この本はVHDLとVerilog双方の言語で、カウンタやシフタ、FIFO等の回路が書いてある。VHDLは多少なりとも理解できるので、対訳本みたいな感じで勉強しやすいかもと思い購入した。さらに全ての回路がパラメータでビット幅を拡張する(パラメタライズ)ことが出来るように書いてある。自分もそう書きたいと思っているので、とても共感できた。
以前からVerilogでパラメタライズな書き方をしたいと思っていた。例えば、パラメタライズなビット幅で、リセット時の値がオール1のDフリップフロップを書くとする。VHDLでは(others => '1');で済むがVerilogでのスマートな書き方がわからなかった。VHDLでは
process(reset, clk) begin
if reset='1' then
q <= (others => '1');だけど、Verilogでは
always @(posedge clk or posedge reset)
if (reset)
q <= -1;かなと思っていた。(以前、掲示板で聞いたの忘れてしまった)
でも、こう書けば良いということがわかった。
parameter BIT_WIDTH 8;
always @(posedge clk or posedge reset)
if (reset)
for(i=0; i<BIT_WIDTH-1; i=i+1)
q[i] <= 1'b1;これならば完璧である。なぜ自分で思いつかなかったかと思うと情けない。
いい本だと思う。明日も本を読んで勉強したい。
-----------------------
前にFPGA掲示板で教えてもらったのを思い出した。
`define BITWIDTH 4
always @(posedge clk or posedge reset)
if (reset)
q <= {`BPS_WIDTH{1'B1}};だった。
- 2005年11月04日 22:29 |
- 入門Verilog
-
| トラックバック:0
-
| コメント:2
こんばんは。私のようなものがコメントするのもアレですが、
> for(i=0; i<BIT_WIDTH-1; i=i+1)
> q[i] <= 1'b1;
この書き方は見たことがないです。(私は書きません)これはalways文の中なのでqを初期化するのに[BIT_WIDTH]クロック必要ということですよね?あまりスマートとは、、言えないような、、。
それ以前ですが、alwaysのなかでfor文は書けましたっけ?あとfor文は実回路ではあまり使われないみたいです。(テストベンチでは多用しますが)
verilogのbit埋めは、、、そうそう、青地の部分の書式です。それですよね。しかし、すべてのバスのバス幅をdefine宣言するのが面倒なので、私は-1か0を入れてしまってます。汗 もしくは4{1'b0}。
乱文失礼しました。
- 2005/11/07(月) 23:46:36 |
- URL |
- キコ #-
- [ 編集 ]
コメントありがとうございます。コメントいただけるとうれしいです。
本に載っているので、always文の中でfor文書けるんじゃないかと思いますが、実際にやってみたいと思います。VHDLでは、process文の中でfor ...loop使って、論理合成できます。
何クロックかかるかというのも多分forの中は1デルタ時間で実行されると思うので、シミュレーター上では一瞬だと思います。
私も以前教えてもらった{`BPS_WIDTH{1'B1}}がいいかなと思ってます。1行で書けるし。。。後はBPS_WIDTHをヘッダファイルに書いてインクルードすればOK。
回路はなるべく使いまわせるように、パラメータを使って書くようにしています。パラメータを替えればほかに使えるように。でも、あまりやりすぎると後から見てわかんなくなっちゃうんですけど。
Verilogは特にテストベンチが書きやすいですね。2001でfor generateや多元配列がサポートされたし、System Verilogも出るみたいだし、乗り換えてもいいかなと思っています。
Verilogいろいろ教えてください。
- 2005/11/08(火) 09:46:55 |
- URL |
- marsee #-
- [ 編集 ]