I like fpga

change the world by fpga
2021/06/06

verilogで、桁数からbitmask値を作る [make bitmask in verilog]

VERILOG   

xegxefによるPixabayからの画像

桁数が決まっていて、その桁に対するbitmaskを作成するプログラムをverilogで作った。

module bitmask(
	input clk,
	input reset_n,
	input [5:0] val,
	output reg [31:0] out_val
);

reg [5:0] index = 6'h0;
always @(posedge clk, negedge reset_n) begin
	if (!reset_n) begin
		out_val = 32'h0;
	end else begin
		out_val = 32'h1;
		for(index=1;index<val;index=index+1) begin
			out_val = (out_val<<1) | 1;
		end
	end
end

パラメータの説明だ。

  • val 桁数
  • out_val 桁数から作ったbitmaskだ。

forを使わずに、テーブル引きでも良いような気がするが。。。どっちがいいだろう。。。。

以下、valとout_valの組み合わせです。

1 1
2 3
3 7
4 f
5 1f
6 3f
7 7f
8 ff
9 1ff
10 3ff
11 7ff
12 fff
13 1fff
14 3fff
15 7fff
16 ffff
17 1ffff
18 3ffff
19 7ffff
20 fffff
21 1fffff
22 3fffff
23 7fffff
24 ffffff
25 1ffffff
26 3ffffff
27 7ffffff
28 fffffff
29 1fffffff
30 3fffffff
31 7fffffff
32 ffffffff

次は、verilator用のテストコードだ。

#include <iostream>
#include <verilated.h>
#include "Vbitmask.h"
#include <verilated_fst_c.h> 
#include <math.h>

int time_counter = 0;
int main(int argc, char** argv) {
	Verilated::commandArgs(argc, argv);

	// Instantiate DUT
	Vbitmask *dut = new Vbitmask();
	// Trace DUMP ON
	Verilated::traceEverOn(true);
	VerilatedFstC* tfp = new VerilatedFstC;

	dut->trace(tfp, 100);  // Trace 100 levels of hierarchy
	tfp->open("simx.fst");

	// Format
	dut->reset_n = 0;
	dut->clk = 0;

	// Reset Time
	while (time_counter < 10) {
		dut->eval();
		tfp->dump(time_counter);  // 波形ダンプ用の記述を追加
		time_counter++;
	}
	// Release reset
	dut->reset_n = 1;
	dut->val=0;
	while (time_counter < 74 && !Verilated::gotFinish()) {
		dut->clk = !dut->clk; // Toggle clock
		if (dut->clk)
			dut->val++;
		// Evaluate DUT
		dut->eval();
		if (dut->clk) {
			printf("%d %x\n", dut->val, dut->out_val);
		}
		tfp->dump(time_counter);  // 波形ダンプ用の記述を追加
		time_counter++;

	}

	dut->final();
	tfp->close(); 
}

作成したモジュールは、ここにおいている

https://github.com/y38y38/bitmask
«