![見出し画像](https://assets.st-note.com/production/uploads/images/102485886/rectangle_large_type_2_3e311aecce46907b391a9cae8aba0a21.png?width=1200)
ChatGPTに回路設計をやらせてみた
ChatGPTにプログラムを書かせたという話はよく聞きますが、回路設計はやってくれるのか?試してみました。
モチーフとした回路は以下の資料に出てくる自動販売機のお釣りを計算する回路です。
http://www-vlsi.es.kit.ac.jp/~kobayasi/refresh/0012/slide.pdf
結果としては、RTL設計でもcopilot的な感じで使えそうに思います。
細かい部分の辻褄合わせは苦手そうなので
ベースを作成してもらって、それを人が手直しする形がよさそうです。
仕様作成
まずは仕様の作成を依頼。
タイミングチャートも書いて欲しかったですが、テキストでしかお絵描きできないようなのでなし。
入力
入金額 (N) - これは自動販売機に投入されたお金の総額です。
商品金額 (P) - これは自動販売機に表示された商品の値段です。
商品の選択状態 (S) - これは自動販売機のボタンが押されたことを示す信号です。
出力
お釣り (C) - これは自動販売機が出力するお金の総額で、入金額から商品金額を引いた差額です。
仕様
商品の選択状態が"ON"の場合、入金額が商品金額以上の場合、お釣りを計算し出力します。
商品の選択状態が"ON"の場合、入金額が商品金額未満の場合、お釣りを計算せずに出力します。
商品の選択状態が"OFF"の場合、お釣りを計算せずに出力します。
お釣りの硬貨・紙幣の種類や枚数は考慮しなくて良いものとします。
以上が、商品のボタンが押された時にお釣りの額が計算されるようにした回路の仕様になります。
RTL設計
RTL書いてくださいとだけお願いしたら以下を出力してくれました。
module vending_machine (
input clk,
input reset,
input [7:0] product_price,
input [7:0] deposit,
input btn,
output [7:0] change,
output reg dispense
);
reg [7:0] total_deposit;
reg [7:0] purchase_price;
reg [7:0] change_amount;
always @(posedge clk) begin
if (reset) begin
total_deposit <= 0;
purchase_price <= 0;
change_amount <= 0;
dispense <= 0;
end
else begin
total_deposit <= total_deposit + deposit;
if (btn) begin
purchase_price <= product_price;
change_amount <= total_deposit - purchase_price;
total_deposit <= 0;
dispense <= 1;
end
else begin
dispense <= 0;
end
end
end
assign change = change_amount;
endmodule
この回路では、clkとresetの2つの入力、および商品の値段、入金額、商品ボタン、お釣りの額、商品の発行を制御するdispense出力を持っています。total_depositは現在の総入金額を、purchase_priceは選択された商品の価格を、change_amountはお釣りの額を表します。データパスと制御パスは同じalwaysブロック内で処理され、if-else文によって分岐が行われます。選択された商品の価格をpurchase_priceに保存し、お釣りの額をchange_amountに計算します。また、商品ボタンが押されると、dispense信号が1に設定され、お釣りが計算されます。それ以外の場合、dispense信号が0に設定され、何も起こりません。
検証
今は環境がないのでシミュレーションはできませんが、
テストベンチは書いてもらいました。
元のRTLは正確には覚えてくれないようで、pinの名前が変わってしまってます。
また、他のケースも含めた脳内検証はfailしました。
module testbench();
// Inputs
reg [7:0] item_price;
reg [7:0] inserted_amount;
reg clk;
// Outputs
wire [7:0] change_amount;
wire item_purchased;
// Instantiate the DUT
vending_machine dut(
.clk(clk),
.item_price(item_price),
.inserted_amount(inserted_amount),
.change_amount(change_amount),
.item_purchased(item_purchased)
);
initial begin
// Initialize inputs
item_price = 50;
inserted_amount = 100;
clk = 0;
// Wait for 1 clock cycle
#5;
// Toggle clock and test
clk = 1;
#5;
assert(change_amount == 50) else $error("Test failed: Incorrect change amount");
assert(item_purchased == 1) else $error("Test failed: Item not purchased");
// End simulation
$finish;
end
endmodule
論理合成
さすがに論理合成はできないそうです。
申し訳ありませんが、私は回路のネットリストを生成する機能を持っていません。回路シミュレーションソフトウェアを使用して、RTL記述をコンパイルしてネットリストを生成することができます。また、RTL記述をハードウェア記述言語(HDL)に変換してから、HDLシミュレータを使用してシミュレーションを実行し、ネットリストを生成することもできます。
この記事が気に入ったらサポートをしてみませんか?