質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Verilog

Verilogは、デジタル回路設計用の論理シミュレータ。また、ハードウェアの電子回路設計の際に用いるハードウェア記述言語を指すこともあります。両者を見分けるために、言語を「Verilog-HDL」と呼ぶ場合もあります。

FPGA

FPGAは、製造後でも設計者によって書き換えができる論理回路です。即時に書き換えが可能なため、開発期間を短縮することが可能。何度でも書き換えられるといった柔軟性があるため、製造や開発における費用も削減できるといったメリットがあります。

Q&A

解決済

1回答

1280閲覧

4ビットバイナリカウンタをテストベンチを使ってシミュレーションを行いたい

iface

総合スコア42

Verilog

Verilogは、デジタル回路設計用の論理シミュレータ。また、ハードウェアの電子回路設計の際に用いるハードウェア記述言語を指すこともあります。両者を見分けるために、言語を「Verilog-HDL」と呼ぶ場合もあります。

FPGA

FPGAは、製造後でも設計者によって書き換えができる論理回路です。即時に書き換えが可能なため、開発期間を短縮することが可能。何度でも書き換えられるといった柔軟性があるため、製造や開発における費用も削減できるといったメリットがあります。

0グッド

0クリップ

投稿2022/06/09 07:18

編集2022/06/16 07:26

実現したいこと

下記のプログラムは、一秒間隔で4ビットカウントを行う回路を表しています。
しかし、以下のエラー文の通り、テストベンチのパターン表示回路の接続の部分の

.scale(scale)

でエラーが出ています。
これはどういうことでしょうか。

発生している問題・エラーメッセージ

[VRFC 10-3180] cannot find port 'scale' on this module ["C:/Xilinx/Vivado/LED/4bit_count_68/4bit_count_68.srcs/sim_1/new/counter_test.v":39]

該当のソースコード

4bitカウンタ回路の記述
修正後

Verilog

1`timescale 1ns / 1ps 2 3module counter #(parameter S = 99999999)( 4 input wire CLK, RES, 5 output reg [3:0]LED); 6 7 reg [27:0] scale; 8 9 always @(posedge CLK or negedge RES) begin 10 if (RES == 1'b0) begin 11 scale <= 27'd0; 12 LED <= 4'b0; 13 end 14 else if (scale == S) begin //scaleが溜まったらscaleをリセット 15 scale <=27'd0; 16 if(LED == 4'hf) //LEDが溜まったらLEDをリセット 17 LED <= 4'b0; 18 else 19 LED <= LED + 4'b1; //LEDが溜まってなければLEDを加算 20 end 21 22 else 23 scale <= scale + 27'd1; 24 end 25endmodule 26

テストベンチ

Verilog

1`timescale 1ns / 1ps 2 3module counter_test; 4 5//クロック周期 6localparam STEP = 10; 7 8/*接続信号の宣言*/ 9reg CLK; 10reg RES; 11wire [3:0]LED; 12 13/*パターン表示回路を接続*/ 14counter #(.S(10))pattern( 15 .CLK(CLK), 16 .RES(RES), 17 .LED(LED) 18 ); 19 20wire [23:0] scale = pattern.scale; 21 22always begin 23 CLK = 0; #(STEP/2); 24 CLK = 1; #(STEP/2); 25end 26 27always @(posedge CLK) begin 28 if(RES == 0) 29 CLK = 0; 30end 31 32initial begin 33 RES = 0; 34 #(STEP*20) RES = 1; 35 36 #(STEP*100); 37 $stop; 38 end 39endmodule 40

シミュレーションの理想の波形

イメージ説明

試したこと

イメージ説明

after
イメージ説明

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

counterモジュールにscaleポートはないので、接続しようとしても当然エラーになります。

verilog

1counter pattern( 2 .CLK(CLK), 3 .RES(RES), 4 .LED(LED) 5 ); 6wire [23:0] scale = pattern.scale;

としましょう


LED[3:0]の部分が”X”となっています。

verilog

1`timescale 1ns / 1ps 2 3module counter ( 4 input wire CLK, RES, 5 output reg [3:0]LED); 6 7 reg [26:0] scale; 8 9 always @(posedge CLK or negedge RES) begin 10 if (RES == 1'b0) begin 11 scale <= 27'd0; 12 LED <= 4'b0; // リセットを追加 13 end 14 // 省略

verilog

1`timescale 1ns / 1ps 2 3module counter #(parameter S=99999999)( 4// 略 5 always @(posedge CLK or negedge RES) begin 6 if (RES == 1'b0) 7 scale <= 27'd0; 8 else if (scale == S) begin //scaleが溜まったらscaleをリセット 9// 略

verilog

1`timescale 1ns / 1ps 2 3module counter_test; 4 5// 略 6/*パターン表示回路を接続*/ 7counter #(.S(10))pattern( 8 .CLK(CLK), 9 .RES(RES), 10 .LED(LED) 11 ); 12// 略

投稿2022/06/09 07:27

編集2022/06/16 04:39
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iface

2022/06/10 05:04

コメントありがとうございます。 ”試したこと”にシミュレーションの写真を追加しました。 LED[3:0]の部分が”X”となっています。 おそらく #(STEP*100); でシミュレーションを終了するように指示しているからだと思い、より大きな値で試してみましたが、結果は一緒でした。 この場合、どうすればよいでしょうか。
ozwk

2022/06/10 05:44

module counterの方でLEDのリセット処理が抜けてます。
iface

2022/06/13 01:44

//LEDが溜まったらLEDをリセット というところでLEDリセットを行っていますがこれは違うのでしょうか。
ozwk

2022/06/13 01:48

RESでリセットする処理が抜けてます
ozwk

2022/06/13 01:54 編集

シミュレーション開始時にはレジスタの値は不定値(X)ですから、 それだと困る場合はテストを動作させるまでに何らかの方法で初期値を定める必要があります。 それは通常リセット信号で行います。
iface

2022/06/13 04:44

シミュレーションの開始時の画像添付しておりませんが、シミュレーションの初期状態はRES0となっております。
ozwk

2022/06/13 07:49 編集

LEDレジスタはシミュレーション開始時に不定ですよね? だから値を定めてやらないといけませんよね? だからRES==0のときにリセットかけましょうね という話です
iface

2022/06/14 07:45

シミュレーションのプログラムを変更してみましたが、ozwkさんがおっしゃっているのはこういうことでしょうか?
ozwk

2022/06/14 07:52 編集

module counterの方でLEDのリセット処理が抜けているという話ですので、 修正すべきはテストベンチの方ではなくてcounterモジュールの方です。 回答編集しました
iface

2022/06/15 03:27

ありがとうございます。 試してみましたが、1000,000nsのシミュレーションでLEDはずっと0を出力していました。 これはscaleがあまりにも大きいのが原因だと思い、scaleの桁を下げてみたのですが、結果は一緒でした。 また、シミュレーションで見れる限界の時間が1000,000nsとなるのですが、これは変えられないのでしょうか。
ozwk

2022/06/15 05:07

追記しました
iface

2022/06/16 03:39

ありがとうございます。 以下を追加したところエラーが出るようです。 counter pattern#(.S(10))(
ozwk

2022/06/16 04:40

修正しました
iface

2022/06/16 07:30 編集

ありがとうございます。 質問のプログラムをすべて変更して編集いたしました。 上記のプログラムでシミュレーションを行った結果をafterに添付しています。 やはり、どうしても限界値が1,000,000nsになってしまうのですが、これ以上は上げられないのでしょうか。 また、一秒間隔でカウントアップしていくはずが100,000nsずつカウントアップしています。
ozwk

2022/06/16 07:37 編集

> また、一秒間隔でカウントアップしていくはずが100,000nsずつカウントアップしています。 1,000,000nsに収まるようにそう書きました。 100MHzのクロックで1秒を見ようと思ったら100M回 = 1億回もクロックが切り替わるまでシミュレーションを動かさなければなりません。無駄です。
iface

2022/06/16 08:51

確かにそうですね。 わかりやすい説明ありがとうございました。 最後にもう一点だけ localparam STEP = 10; は何を表しているのでしょうか。
ozwk

2022/06/16 08:53

クロック周期とコメント書いてありますやん
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問