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模块的例化与调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDLBits答案(2)_Verilog
- 下一篇: Android工程的编译过程