实例化
以下以3线8线译码器实现函数为例:
首先设计一个3线8线译码器
moduledecoder_3_8( inputrst_n , input [2 :0] data_in , outputreg [7 :0] data_out ); always (*) beginif(!rst_n) data_out=8'b0;elsebegincase(data_in) 3'b000 : data_out=8'b1111_1110; 3'b001 : data_out=8'b1111_1101; 3'b010 : data_out=8'b1111_1011; 3'b011 : data_out=8'b1111_0111; 3'b100 : data_out=8'b1110_1111; 3'b101 : data_out=8'b1101_1111; 3'b110 : data_out=8'b1011_1111; 3'b111 : data_out=8'b0111_1111; default : data_out=8'b0000_0000;endcaseendendendmodule
这是你们经常喜欢用的case写的。下面是RTL图
另一种写法。
moduledecoder_3_8( input [2 :0] data_in , output [7 :0] data_out ); assigndata_out[0]=data_in[0]|data_in[1]|data_in[2]; assigndata_out[1]=~data_in[0]|data_in[1]|data_in[2]; assigndata_out[2]=data_in[0]|~data_in[1]|data_in[2]; assigndata_out[3]=~data_in[0]|~data_in[1]|data_in[2]; assigndata_out[4]=data_in[0]|data_in[1]|~data_in[2]; assigndata_out[5]=~data_in[0]|data_in[1]|~data_in[2]; assigndata_out[6]=data_in[0]|~data_in[1]|~data_in[2]; assigndata_out[7]=~data_in[0]|~data_in[1]|~data_in[2]; Endmodule
所以我们采用下面的那种写法:
module 和endmodule是固定的形式。
decoder_3_8是你所设计的电路的名字。
module decoder_3_8;
endmodule
这两行代码类似于你在一张纸上画 了框架图形
然后继续画
( input [2 :0] data_in , output [7 :0] data_out );
这个就是定义你设计的电路模块的输入和输出端口,如下:
现在你的电路你的电路已经把外壳设计好了,所以需要设计内部的电路了。就是下面的代码。就是用语言描述出输出与输入的对应关系。
assigndata_out[0]=data_in[0]|data_in[1]|data_in[2]; assigndata_out[1]=~data_in[0]|data_in[1]|data_in[2]; assigndata_out[2]=data_in[0]|~data_in[1]|data_in[2]; assigndata_out[3]=~data_in[0]|~data_in[1]|data_in[2]; assigndata_out[4]=data_in[0]|data_in[1]|~data_in[2]; assigndata_out[5]=~data_in[0]|data_in[1]|~data_in[2]; assigndata_out[6]=data_in[0]|~data_in[1]|~data_in[2]; assigndata_out[7]=~data_in[0]|~data_in[1]|~data_in[2];
这样就得到了我们的译码器。
接下来就是用译码器来实现函数了,我们以f=m1+m2+m5+m7为例。
要使用译码器就需要对他的输入端口和输出端口进行一定的连接,我们的输入就接译码器的输入,译码管的输出如下表
可以看出当我们的data_out[1]、 data_out[2]、 data_out[5] 、data_out[7]其中一个为零时函数的输出要为一。
下面是我们的实现函数部分代码:
modulefunction_1( input [2:0] data_in , outputfunction_out ); wire[7:0] data_out ; decoder_3_8inst1( .data_in (data_in ), .data_out (data_out ) ); assignfunction_out=~(data_out[1]&data_out[2]&data_out[5]&data_out[7]); endmodule
箭头指的那些可以全部理解成导线,就是把我们刚刚设计好的译码器的输入和输出端口用导线进行了一定的连接。
可以看到前面这个模块就是我们刚刚设计的译码器,后面的就是我们的赋值语句
assign function_out=~(data_out[1]&data_out[2]&data_out[5]&data_out[7]);
这样我们的电路就设计好了。
所谓实例化就是把我们之前设计好的电路,拿过来进行使用,对输入和输出进行一定的连接。
各个模块编写好以后,用顶层的.v文件进行连接。
说白了就是在PC端进行物理连线的过程。