Step 1: your first blinky / From Blinker to RISC-V
code:step1.v
module SOC(
input CLK,
input RESET,
input RXD,
output TXD
);
always @(posedge CLK) begin
count <= count + 1;
end
assign LEDS = count;
assign TXD = 1'b0;
endmodule
ビルド & アップロードする。
$ BOARDS/run_ulx3s.sh step1.v
LEDが5つ光ってる。カウンタが早すぎてダイナミック点灯してるせいで全てのLEDが点灯してるように見えてしまう(→ 課題1でこの問題に対応する)
https://gyazo.com/8fb716148caeae586a66cd49b91ef46c
課題1
点灯しっぱなしの5つのLEDを、いい感じにカウントアップしてる風に点灯させてみる。
ULX3Sのクロックは25MHzなので、カウンタを30ビットぐらいにして上位5ビットをLEDへ表示させるといい感じになる
https://gyazo.com/8f57c5da6b345ab07a93f73e6f178217
code:diff
diff --git a/step1.v b/step1.v
index 15ac63d..b9d10e2 100644
--- a/step1.v
+++ b/step1.v
@@ -6,10 +6,10 @@ module SOC(
output TXD
);
always @(posedge CLK) begin
count <= count + 1;
end
- assign LEDS = count;
+ assign LEDS = count29:25; assign TXD = 1'b0;
endmodule
課題2
ナイトライダーのナイト2000みたいに点滅させてみる。
LEDに表示する値を1秒間に1回更新する感じで。
本物とはちょっと違うけど、いい感じに減光できなかったのでやむなし。
https://gyazo.com/1d7f190f7b3237aab2ba9e13ea60ef0e
code:step1_night2000.v
module SOC(
input CLK,
input RESET,
input RXD,
output TXD
);
reg 5:0 state = 6'b000001; always @(posedge CLK) begin
count <= count + 1;
if (count == 0)
state <= next_state;
else
state <= state;
end
assign TXD = 1'b0;
assign next_state = (state == 6'b0_00001) ? 6'b0_00010 :
(state == 6'b0_00010) ? 6'b0_00100 :
(state == 6'b0_00100) ? 6'b0_01000 :
(state == 6'b0_01000) ? 6'b0_10000 :
(state == 6'b0_10000) ? 6'b1_10000 :
(state == 6'b1_10000) ? 6'b1_01000 :
(state == 6'b1_01000) ? 6'b1_00100 :
(state == 6'b1_00100) ? 6'b1_00010 :
(state == 6'b1_00010) ? 6'b1_00001
: 6'b0_00001;
endmodule
(おまけ)ビルドスクリプトの中身を確認
ビルドスクリプトの中身はこんな感じ。
code:BOARDS/run_ulx3s.sh
PROJECTNAME=SOC
BOARD=ulx3s
BOARD_FREQ=25
FPGA_VARIANT=85k
FPGA_PACKAGE=CABGA381
VERILOGS=$1
yosys -q -DBOARD_FREQ=$BOARD_FREQ -p "synth_ecp5 -abc9 -top $PROJECTNAME -json $PROJECTNAME.json" $VERILOGS || exit
nextpnr-ecp5 --force --timing-allow-fail --json $PROJECTNAME.json --lpf BOARDS/$BOARD.lpf --textcfg $PROJECTNAME"_out".config --freq $BOARD_FREQ --$FPGA_VARIANT --package $FPGA_PACKAGE || exit
ecppack --compress --svf-rowsize 100000 --svf $PROJECTNAME".svf" $PROJECTNAME"_out.config" $PROJECTNAME".bit" || exit
ujprog -j FLASH $PROJECTNAME".bit" || exit