Verilog HDL を生成するための記述を python で行うことで FPGA 回路の生成を楽にする為のライブラリー Veriloggen を使ってみたいと思います。
今回は単純なCASE文の書き方です。
Case文の記述
Veriloggenを使用したcase文の記述は、条件を簡潔にできるので、非常に読みやすい記述が可能です。
例えば、条件の変数が0の時に、outに0b1111110を出力するというのは
veriloggen.When(0)(out(0b1111110))
となります。
このような条件をリストに羅列してveriloggen.Caseに与えます。
Case文使用の例
クロックをカウントして0~9までの数を繰り返し、セブンセグメントLEDに対応する数字を表示する時のLEDの組み合わせをcase文で作るときの例を書いてみます。
import veriloggen as vg def Num2led(m,clk,rst,number): ''' モジュールmにnumberに応じたLEDをONにするcase文を追加する ''' out = m.TmpReg(7, initval=0) seq = vg.TmpSeq(m,clk) #7segment LED a,b,c,d,e,f,g decCond = [] decCond.append( vg.When(0)(out(0b1111110)) ) decCond.append( vg.When(1)(out(0b0110000)) ) decCond.append( vg.When(2)(out(0b11001101)) ) decCond.append( vg.When(3)(out(0b11110001)) ) decCond.append( vg.When(4)(out(0b01110011)) ) decCond.append( vg.When(5)(out(0b10110011)) ) decCond.append( vg.When(6)(out(0b10111011)) ) decCond.append( vg.When(7)(out(0b11100000)) ) decCond.append( vg.When(8)(out(0b11111111)) ) decCond.append( vg.When(9)(out(0b11111011)) ) decCond.append( vg.When()(out(0b0000000)) ) seq.add(vg.Case(number)(*decCond)) return out def mkSevenSeg(): ''' クロックをカウントし、0~9までのnumberを繰り返し、セブンセグメントLEDに数字を表示する信号を生成 ''' m = vg.Module('SevenSeg') clk = m.Input('CLK') rst = m.Input('RST') ledout = m.Output('LED',7) count = m.TmpReg(width = 4,initval = 0) seq = vg.TmpSeq(m,clk,rst) seq.add(count.inc()) seq.add(vg.If(count>=9)(count(0))) seq.make_always() sled = Num2led(m,clk,rst,count) ledout.assign(sled) return m
生成されるVerilog HDL とシミュレーション結果
テストベンチを作成してVerilog HDLを生成し、シミュレーションした結果は次の様になりました。
module SevenSeg
(
input CLK,
input RST,
output [7-1:0] LED
);
reg [4-1:0] _tmp_0;
always @(posedge CLK) begin
if(RST) begin
_tmp_0 <= 0;
end else begin
_tmp_0 <= _tmp_0 + 1;
if(_tmp_0 >= 9) begin
_tmp_0 <= 0;
end
end
end
reg [7-1:0] _tmp_1;
assign LED = _tmp_1;
always @(posedge CLK) begin
case(_tmp_0)
0: begin
_tmp_1 <= 126;
end
1: begin
_tmp_1 <= 48;
end
2: begin
_tmp_1 <= 205;
end
3: begin
_tmp_1 <= 241;
end
4: begin
_tmp_1 <= 115;
end
5: begin
_tmp_1 <= 179;
end
6: begin
_tmp_1 <= 187;
end
7: begin
_tmp_1 <= 224;
end
8: begin
_tmp_1 <= 255;
end
9: begin
_tmp_1 <= 251;
end
default: begin
_tmp_1 <= 0;
end
endcase
end
endmodule