假设三个模块module top_m, bottom1_m, bottom2_m
请教各位大侠了!……
在Verilog中,调用底层模块的语法结构为:
底层模块名 实例名 参数定义
比如在top_m里,如果已经全部源文件加到了同一个工程里,那么可以直接
bottom1_m bottom1_m(A,B,C)
注意 A,B,C这些参数的顺序,要和底层定义的是一致的。名字可以不一致。
如果没有加到同一个工程,可以使用
'include "bottom1.v"
可不可以综合,这个得看你代码怎么写的,和层次无关。
module uart_top(clk, nreset, rec, send, data);
parameter len = 16;
output [len:0]data;
uart_rec rec1( //底层模块1
.rec(rec),
.clk(clk),
.nreset(nreset),
.data(data)
);
endmodule
你的子模块 uart_rec和uart_send模块我不知道具体的实现,只能告诉你:
第一,模块实例化以后,相当于一个实际的电路,是物理上存在的实体,并非函数。所以,不存在always调用这一说。如果你的子模块设计得当,那么,只要输入的信号满足你的条件,模块就有相应输出;
第二,你要看子模块的相关文档,如果是自己写的,要搞清楚UART时序;
第三,不要把接收寄存器(data)和发送寄存器用同一个,而且,17位的寄存器有点怪;
第四,你可以在代码里用always来完成判断什么时候该去从模块中读取数据(或者写入),什么时候复位等等。always后面的条件,可能是9个时钟(看你的UART设置),又或者是data被赋值或清空,这个要看子模块如何设计的;
第五,网络上有verilog或者VHDL实现UART的代码,google一下很容易找到,可以用来做参考,学习的效果应该比在这里问问题要强一点,也要连续一些。
///
ADI的代码:
// Company: Analog Devices Inc.
// Engineer: MH
//
// Design Name: AD9239 ADI Link
// Project Name: AD9239 ADI Link
// Target Devices: Altera Stratix II GX
// Tool versions: Quartus II v8.0 sp1
//
// Description: Top module.
//
// Dependencies: None
//
// Revision:
//
//
// Additional Comments:
//
//
module ad9239_gxb_adi
input chan_a, chan_b, chan_c, chan_d;
input mr, wen, ren_a, rclk, core_clk;
input cs_fpga, sclk, sdi;
output pgm0, pgm1, pgm2, pgm3, sdo;
output data_rdy, pwr_dwn, spi_rst;
output led6, led4, led1, led2;
output led3, led5, led7, full;
output [15:0] data;
wire freqlocked;
wire analog_rst, digital_rst;
wire frame, par_dclk;
wire [1:0] chan_sel;
wire [1:0] dut_ctrl;
wire [2:0] scram_sel;
wire [3:0] serial_data;
wire [63:0] par_dat, descram_dat;
// use LED's to indicate configuration
assign led1 = ~chan_sel[1];
assign led2 = ~chan_sel[0];
assign led3 = ~scram_sel[2];
assign led4 = ~scram_sel[1];
assign led5 = ~scram_sel[0];
assign led6 = ~dut_ctrl[1];
assign led7 = ~dut_ctrl[0];
assign serial_data = {chan_a, chan_b, chan_c, chan_d};
assign pgm3 = frame;
assign pgm2 = frame;
assign pgm1 = frame;
assign pgm0 = frame;
assign spi_rst = dut_ctrl[1];
assign pwr_dwn = dut_ctrl[0];
// apply analog and digital reset
reset_cntrl U1 (.clk(core_clk),
// use SPI for channel select
spi_rw U2 (.I_sclk(sclk),
// create 64-bit parallel packet
packet U3
// descramble data
descramble U4 (.scram_sel(scram_sel[2:0]),
// write to and read from FIFO
fifo16
endmodule
//
// Company: Analog Devices Inc.
// Engineer: MH
//
// Design Name: AD9239 ADI Link
// Project Name: AD9239 ADI Link
// Target Devices: Altera Stratix II GX
// Tool versions: Quartus II v8.0 sp1
//
// Description: reset_cntrl module.
//
// Dependencies: ff1.v, counter12.v
//
// Revision:
//
//
// Additional Comments:
//
//
module reset_cntrl(clk, gxb_rst, freq_lock,
input clk, gxb_rst;
input freq_lock;
output analog_rst;
output digital_rst;
wire [11:0] cnt_a, cnt_d;
ff1
ff1
counter12 C1 (.aclr(gxb_rst),
counter12 C2 (.aclr(gxb_rst),
endmodule
///
// Company: Analog Devices Inc.
// Engineer: MH
//
// Design Name: AD9239 ADI Link
// Project Name: AD9239 ADI Link
// Target Devices: Altera Stratix II GX
// Tool versions: Quartus II v8.0 sp1
//
// Description: spi_control
//
// Dependencies: none
//
// Revision:
//
//
// Additional Comments:
//
//
module spi_control
(
);
//Use one-hot state encoding for FPGA.
localparam [9:0] S_RESET = 10'b00_0000_0001,
reg [9:0] state, next;
reg [4:0] sclk_count;
//
always @(posedge I_sclk or posedge _I_csb)
//
always @(posedge I_sclk or posedge _I_csb)
//
always @(posedge I_sclk or posedge _I_csb) begin
end
//
//
always @(state or I_sdi or sclk_count) begin
end
endmodule