FPGA-06-实例化的通俗理解(3-8译码器为例)

实例化

以下以3线8线译码器实现函数为例:

首先设计一个3线8线译码器

module decoder_3_8(

input                           rst_n                           ,

input             [2 :0]      data_in                       ,

output    reg [7 :0]       data_out             

    );

always@(*) begin

       if(!rst_n)

              data_out=8'b0;

       else begin

              case(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;

              endcase        end

end

endmodule

这是你们经常喜欢用的case写的。下面是RTL图

 

另一种写法。

module decoder_3_8(

input             [2 :0]      data_in                       ,

output           [7 :0]      data_out             

    );

assign    data_out[0]= data_in[0]| data_in[1]| data_in[2];

assign    data_out[1]=~data_in[0]| data_in[1]| data_in[2];

assign    data_out[2]= data_in[0]|~data_in[1]| data_in[2];

assign    data_out[3]=~data_in[0]|~data_in[1]| data_in[2];

assign    data_out[4]= data_in[0]| data_in[1]|~data_in[2];

assign    data_out[5]=~data_in[0]| data_in[1]|~data_in[2];

assign    data_out[6]= data_in[0]|~data_in[1]|~data_in[2];

assign    data_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             

    );

这个就是定义你设计的电路模块的输入和输出端口,如下:

 

现在你的电路你的电路已经把外壳设计好了,所以需要设计内部的电路了。就是下面的代码。就是用语言描述出输出与输入的对应关系。

assign    data_out[0]= data_in[0]| data_in[1]| data_in[2];

assign    data_out[1]=~data_in[0]| data_in[1]| data_in[2];

assign    data_out[2]= data_in[0]|~data_in[1]| data_in[2];

assign    data_out[3]=~data_in[0]|~data_in[1]| data_in[2];

assign    data_out[4]= data_in[0]| data_in[1]|~data_in[2];

assign    data_out[5]=~data_in[0]| data_in[1]|~data_in[2];

assign    data_out[6]= data_in[0]|~data_in[1]|~data_in[2];

assign    data_out[7]=~data_in[0]|~data_in[1]|~data_in[2];

这样就得到了我们的译码器。

 

接下来就是用译码器来实现函数了,我们以f=m1+m2+m5+m7为例。

要使用译码器就需要对他的输入端口和输出端口进行一定的连接,我们的输入就接译码器的输入,译码管的输出如下表

         data_in 

data_out

000

11111110

001

11111101

010

11111011

011

11110111

100

11101111

101

11011111

110

10111111

111

01111111

可以看出当我们的data_out[1]、 data_out[2]、 data_out[5] 、data_out[7]其中一个为零时函数的输出要为一。

下面是我们的实现函数部分代码:

module function_1(

input      [2:0]       data_in                ,

output                  function_out

    );                              

wire[7:0]       data_out                     ;           

      

decoder_3_8       inst1(

.data_in        (data_in        ),

.data_out      (data_out     )     

    );   

assign    function_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端进行物理连线的过程。

 

 

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/82998004