紫光同创PGL22G开发平台试用连载(3)——关于Verilog的模块化

stayreal 提交于 周日, 09/27/2020
紫光同创PGL22G开发平台试用连载(3)——关于Verilog的模块化

1.心态崩了,刚才这篇已经写完了,将要保存的时候,忽然网断了,再来一遍。。

2.话不多说,先看下图

instance

猛地一看,不明觉厉

3.先不做过多解释,看如下示例代码(摘自04_uart_test):

uart_rx#

(

.CLK_FRE(CLK_FRE),

.BAUD_RATE(115200)

) uart_rx_inst

(

.clk (sys_clk ),

.rst_n (rst_n ),

.rx_data (rx_data ),

.rx_data_valid (rx_data_valid ),

.rx_data_ready (rx_data_ready ),

.rx_pin (uart_rx )

);

和第一张图片5那行对比一下,格式是不是一样,是不是很神奇,格式是一样一样的

第5行翻译过来的内容,意思大概是In line explicit 参数重新定义,In line explicit该怎么翻译呢?意会一下吧

*************************分割一下******************************

4.那么 uart_rx这个模块做了点什么事儿呢

module uart_rx
#(
    parameter CLK_FRE = 50,      //clock frequency(Mhz)
    parameter BAUD_RATE = 115200 //serial baud rate
)
(
    input                        clk,              //clock input
    input                        rst_n,            //asynchronous reset input, low active 
    output reg[7:0]              rx_data,          //received serial data
    output reg                   rx_data_valid,    //received serial data is valid
    input                        rx_data_ready,    //data receiver module ready
    input                        rx_pin            //serial data input
);
.
.
.省略若干行
.
.
endmodule 

4.对比一下,第2、3节,并结合第1节看看,是不是有所体会。对了,第2节是从04_uart_test这个工程的顶层文件中摘过来的

5.其他几种例化的格式,只要你看到的,都可以参照第一张图,随便打开一个工程,看看是不是这样的

******************************分割线*****************************

6.在某一层中,通过对各个子模块的输入输出的例化命名,使子模块相连,构成这一层的模块。

那么子模块是怎么相连的呢??

 


module uart_test(
input                           sys_clk,
input                           rst_n,
input                           uart_rx,
output                          uart_tx

);

parameter                      CLK_FRE = 50;//Mhz
localparam                       IDLE =  0;
localparam                       SEND =  1;   //send HELLO ALINX\r\n
localparam                       WAIT =  2;   //wait 1 second and send uart received data
reg[7:0]                         tx_data;
reg[7:0]                         tx_str/*synthesis syn_keep=1*/;
reg                              tx_data_valid;
wire                             tx_data_ready;
reg[7:0]                         tx_cnt;
wire[7:0]                        rx_data;
wire                             rx_data_valid;
wire                             rx_data_ready;

reg[31:0]                        wait_cnt;
reg[3:0]                         state;

uart_rx#
(
    .CLK_FRE(CLK_FRE),
    .BAUD_RATE(115200)
) uart_rx_inst
(
    .clk                        (sys_clk                  ),
    .rst_n                      (rst_n                    ),
    .rx_data                    (rx_data                  ),
    .rx_data_valid              (rx_data_valid            ),
    .rx_data_ready              (rx_data_ready            ),
    .rx_pin                     (uart_rx                  )
);

uart_tx#
(
    .CLK_FRE(CLK_FRE),
    .BAUD_RATE(115200)
) uart_tx_inst
(
    .clk                        (sys_clk                  ),
    .rst_n                      (rst_n                    ),
    .tx_data                    (tx_data                  ),
    .tx_data_valid              (tx_data_valid            ),
    .tx_data_ready              (tx_data_ready            ),
    .tx_pin                     (uart_tx                  )
);
endmodule

将子模块看成一个独立的模块,那么各个子模块是怎么连接的呢???

7.把所有用到的子模块放到黑匣子里,那么对外接口就是

module uart_test(
input                           sys_clk,
input                           rst_n,
input                           uart_rx,
output                          uart_tx

);

里面的输入和输出

8.黑匣子中子模块怎么连接的?? 请看第6节中的类型为wire的变量

*************************总结一下*************************

力学中的受力分析有整体法和分解法

顶层模块就像使用整体法,可以先不关注内部子模块的连接

子模块就是把每个模块单独拿出来,看看都有哪些接口

 

心态崩了,以后先在记事本里写,然后粘贴吧

下篇博文再见~

相关文章

Digi-Key