- 締切済み
Verilogで動的なモジュールを作る方法
Verilogで動的なモジュールを作る方法 たとえば、どのような周波数であっても 1秒のウェイトをする回路を作りたいと思っています。 試験的に、 `define time (1) //1S `define tCK (20) //周期20nS module wait( input iCLOCK, input inRESET, output reg oWAITEND); localparam = loop_end (1/(`time * 1000000000))/`tCK; reg [31 : 0] loop; always@(posedge iCLOCK or negedge inRESET)begin if(inRESET == 1'b0)begin loop <= 32'h00000000; end else begin if(loop < loop_end)begin loop <= loop + 32'h00000001; oWAITEND <= 1'b0; end else begin oWAITEND <= 1'b0; loop <= loop; end end end //always endmodule というものを作って、defineの値(このdefineは別ヘッダファイルからincludeしてやりました)を変えてやれば目的の周波数で動き、目的のウェイト作るモジュールををソース自体を変えずに得られると思いましたが、 シミュレーションではうまくいったものの、QuartusIIではうまく論理合成されませんでした。 もし、他に方法がありましたら教えていただけないでしょうか? よろしくおねがいします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- ICE_FALCON
- ベストアンサー率56% (63/111)
回答No.2
- ICE_FALCON
- ベストアンサー率56% (63/111)
回答No.1
補足
申し訳ありません、上にあげたものはあくまでどういうことをしたいかということで 全くテストしていないものを書いてしまいました。 以下に書きなおします、申し訳ありませんでした。 `define set_time (1) //1S 目的のウェイト時間 `define tCK (20) //クロックの周期 module make_wait( input iCLOCK, input inRESET, output reg oWAITEND); localparam loop_end =(1/(`set_time * 1000000000))/`tCK; reg [31 : 0] loop; always@(posedge iCLOCK or negedge inRESET)begin if(inRESET == 1'b0)begin loop <= 32'h00000000; oWAITEND <= 1'b0; end else begin if(loop < loop_end)begin loop <= loop + 32'h00000001; oWAITEND <= 1'b0; end else begin oWAITEND <= 1'b1; loop <= loop; end end end //always endmodule 特にエラーなどはないのですが、シミュレーションでは期待通り、1秒待ったらoWAITENDが1になりました。 しかしながら、論理合成していざ回路に送ってみると、全くウェイトがなく動作してしまいます。 QuartusIIでは特に関係のありそうなエラーは出ませんでした。