日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDLBits答案(3)_Verilog模块的例化与调用

發布時間:2023/12/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDLBits答案(3)_Verilog模块的例化与调用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HDLBits_Verilog模塊的例化與調用

HDLBits鏈接


模塊

只要使用的所有模塊都屬于同一個項目,就可以通過在模塊內部實例化一個模塊來創建模塊的層次結構。一個模塊的代碼不能在另一個模塊的主體中編寫(不同模塊的代碼不是嵌套的)。

有兩種常見的方式將wire信號連接到端口上,分別是按位置和按名稱連接。

按位置:mod_a instance1 ( wa, wb, wc );

按名稱:mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) );

  • By position:mod_a instance1 ( wa, wb, wc );

題目描述:完成mod_a模塊的調用

Solution

module top_module ( input a, input b, output out );mod_a david(.out(out),.in1(a),.in2(b)); endmodule

[David說]:模塊調用兩種方式:按位置調(簡潔但不穩,順序不可亂),按名稱調(繁瑣但很穩,順序可變)


按位置連接端口

題目描述

已有一個名為mod_a的模塊,它有2個輸出和4個輸入。您必須按位置將這6個端口連接到頂層模塊的端口out1、out2、a、b、c和d,并按順序進行連接。

給定如下的模塊:

module mod_a ( output, output, input, input, input, input );

Solution:

module top_module ( input a, input b, input c,input d,output out1,output out2 );mod_a david(out1,out2,a,b,c,d); endmodule

按名稱連接端口

題目描述:按名稱調模塊mod_a

module top_module ( input a, input b, input c,input d,output out1,output out2 );mod_a(.out1(out1),.out2(out2),.in1(a),.in2(b),.in3(c),.in4(d)); endmodule

三個模塊的調用

題目描述

已有一個模塊my_dff,其中有兩個輸入和一個輸出(D觸發器)。實例化三個D觸發器然后將它們連接在一起,實現一個長度為3的移位寄存器。clk端口需要連接到所有my_dff實例。

已有模塊: module my_dff ( input clk, input d, output q );

Solution

module top_module ( input clk, input d, output q );wire temp1;wire temp2;my_dff block1(clk,d,temp1);my_dff block2(clk,temp1,temp2);my_dff block3(clk,temp2,q); endmodule

[David說]:內部調用多個模塊時,定義合理的wire信號連接內部的模塊。


模塊輸入為向量

題目描述

已有一個模塊my_dff8,它具有兩個輸入和一個輸出(實現一組8位的D觸發器)。實例化其中的三個,然后將它們連接在一起,實現一個長度為3的8位寬移位寄存器。另外,構造一個4-1多路選擇器,根據sel[1:0]選擇輸出值。本質上,sel選擇的是延遲輸入的周期。

已有模塊: module my_dff8 ( input clk, input [7:0] d, output [7:0] q );

Solution

module top_module ( input clk, input [7:0] d, input [1:0] sel, output [7:0] q );wire [7:0] out1;wire [7:0] out2;wire [7:0] out3;my_dff8 block1(clk,d,out1);my_dff8 block2(clk,out1,out2);my_dff8 block3(clk,out2,out3);always @(*) begincase(sel)2'b00:q=d;2'b01:q=out1; 2'b10:q=out2; 2'b11:q=out3; endcaseend endmodule

[David說]:wire與wire類型之間的連接直接用非阻塞賦值=連接即可。


加法器模塊1

題目描述:用兩個帶進位的16bit加法器組成一個32bit加法器。

module add16 (input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout);

Solution

module top_module(input [31:0] a,input [31:0] b,output [31:0] sum );wire [15:0] low_out;wire [15:0] high_out;wire temp_cout;wire cout;add16 low (a[15:0],b[15:0],0,low_out,temp_cout);add16 high(a[31:16],b[31:16],temp_cout,high_out,cout);assign sum={high_out,low_out}; endmodule

[David說]:注意采用流拼接簡化代碼,無用信號接口作為輸出也可以不進行管腳信號的定義。


加法器模塊2

題目描述

自定義一個1bit的全加器,構成一個16bit全加器,然后用兩個16bit全加器完成32bit加法模塊的搭建,忽略進位。

1、定義一個1bit全加器。2、在頂層完成兩個16bit全加器的調用。

Solution

module top_module (input [31:0] a,input [31:0] b,output [31:0] sum );wire temp_cout;add16 low (a[15:0],b[15:0],0,sum[15:0],temp_cout);add16 high(a[31:16],b[31:16],temp_cout,sum[31:16]); endmodulemodule add1 ( input a, input b, input cin, output sum, output cout );assign {cout,sum} = a + b + cin; endmodule

進位選擇加法器

題目描述

在這個練習中,已有和上一個練習相同的模塊add16,本題將兩個帶進位的16位數字相加,并生成一個輸出進位和16位的和。需構造一個16位2-1多路選擇器。

module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0] sum, output cout );

[David說]:提前加法器進位的計算,用資源換速度。

Solution:

module top_module(input [31:0] a,input [31:0] b,output [31:0] sum );wire [15:0] highout0;wire [15:0] highout1;wire cout;add16 low(a[15:0],b[15:0],0,sum[15:0],cout);add16 high0(a[31:16],b[31:16],0,highout0);add16 high1(a[31:16],b[31:16],1,highout1);assign sum[31:16]=cout? highout1:highout0; endmodule

加法器→減法器

題目描述:利用sub信號和兩個16bit的全加器,實現32bit的加減法運算。

對輸入的sub信號進行判斷,如果sub=0,則輸出(a + b + 0);如果sub=1,則輸出(a + ~b + 1)。

已有模塊:

module add16 ( input[15:0] a, input[15:0] b, input cin, output[15:0]sum, output cout );

tip: Use a 32-bit wide XOR gate to invert the b input whenever sub is 1.

Solution:

module top_module(input [31:0] a,input [31:0] b,input sub,output [31:0] sum );wire [31:0] b_processed;wire cout_temp;assign b_processed = b ^ {32{sub}};add16 lower(a[15:0],b_processed[15:0],sub,sum[15:0],cout_temp);add16 higher(a[31:16],b_processed[31:16],cout_temp,sum[31:16]); endmodule

[David說]:巧用sub信號對輸入b處理,妙!


總結:

學習了模塊的例化與調用,深刻理解對著電路圖寫HDL這句話。

總結

以上是生活随笔為你收集整理的HDLBits答案(3)_Verilog模块的例化与调用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。