1から学ぶHDL
まだ学習して1時間程度なので浅い内容です。
レジスタ
クロック信号が立ち上がった時に入力値を書きこむ。
https://qiita.com/rikitoro@github/items/426186a06242b24e0df2
上の表のようにclkが立ち上がった時だけdの値をqにセットする。
module reg8(clk, d, q);
input clk;
input [7:0] d;
output [7:0] q;
reg [7:0] q;
always@(posedge clk) begin
q <= d;
end
endmodule
posedgeが信号の立ち上がり。
negedgeが信号の立下り。
クロック(clk)が立ち上がったときにalwaysが実行されるようなイメージ。なのでqにdがセットされる。
always文でセットされるものはregで宣言。
リセット付きレジスタ
クロックが立ち上がる時、リセット信号が0であれば0をレジスタにセット。1であれば入力のdの値をセットする。
8bitリセットつきレジスタを示す。
module reg8(clk, rst, d, q);
input clk, rst;
input [7:0] d;
output [7:0] q;
reg [7:0] q;
always@(posedge clk) begin
if(rst == 1'b0) begin
q <= 8'b00000000;
end else begin
q <= d;
end
end
endmodule
クロック
clkの初期値は0で繰り返す。
initial begin
clk = 1’b0;
forever #10 clk = ~clk;
end
10秒経過するごとにclkを反転する。
もしrst(リセット信号が0であればレジスタqに0をセットする。
ロード付きレジスタ
ロード信号が1ならレジスタにdの値をセット、それ以外は書き込まずに今の値を保持。
module reg8(clk, rst, ld, d, q);
input clk, rst, ld;
input [7:0] d;
output [7:0] q;
reg [7:0] q;
always@(posedge clk) begin
if(rst == 1'b0) begin
q <= 8'b00000000;
end else if(ld == 1’b1) begin
q <= d;
end
end
endmodule
clkが立ち上がった時、リセットレジスタが0ならばレジスタqに0をセット。
レジスタ信号が1ならば入力dをレジスタqにセット。
それ以外の値のときは保持する。
カウンタ
ci=1:インクリメント・ci=0は値を保持する。
module cnt8(
clk, rst, ci, co, q);
input clk, rst;
input ci;
output co;
output [7:0] q;
reg [7:0] q;
always@(posedge clk) begin
if(rst == 1'b0) begin
q <= 8'b00000000;
end else begin
q <= q + ci;
end
end
assign co = &{q, ci};
endmodule
ciが0の時は加算しても値は保持されたままなのでciの値に関係なく加算nされる。
最後の行は全ビットの論理積を取っている。q=11111111でci=1を加算するときは、co=1になるように全ビットの論理積をとる。
参考文献