1 module DDS_SPI_dualRAM( 2 input clk, 3 input nrst, 4 output led, 5 output samp_syc_sig, 6 output mosi, 7 output sck, 8 output cs, 9 //以下连接主机接收波形数据的SPI线 10 input sck_host, 11 input mosi_host, 12 input cs_host1,//主机输出的第一个cs,用于选通和数据RAM通信 13 input cs_host2,//主机输出的第而个cs,用于选通和DDS累加器增加值寄存器 14 //以下测试管脚 15 output test_pin 16 ); 17 //wire samp_syc_sig; 18 wire[7:0] dds_addr; 19 wire[11:0] tab_data; 20 wire[15:0] delta_addr; 21 wire clk_25m; 22 assign test_pin = inc_addr_host[0]; 23 //assign clk_25m = clk; 24 //////////////从板载20MHz有源振荡通过PLL产生25MHz时钟///////// 25 expll_2_25M i_ex_pll_25M( 26 .clkin(clk), 27 .clkfb(clk_25m), 28 .pllen(1'b1), 29 .resetn(nrst), 30 .clkout0en(1'b1), 31 .clkout1en(1'b0), 32 .clkout2en(1'b0), 33 .clkout3en(1'b0), 34 .clkout0(clk_25m), 35 .clkout1(), 36 .clkout2(), 37 .clkout3(), 38 .lock() 39 ); 40 //////////////以下DAC侧的电路描述///////////// 41 samp_syc_sig i_syc_sig(//产生DAC输出的时钟 42 .clk_25m(clk_25m), 43 .nrst(nrst), 44 .samp_syc_sig(samp_syc_sig) 45 ); 46 47 run_led i_led( 48 .clk(clk_25m), 49 .nrst(nrst), 50 .led(led) 51 ); 52 DAC7512 iDAC7512( 53 .clk_25m(clk_25m), 54 .nrst(nrst), 55 .syc_sig(samp_syc_sig), 56 .cs_da(cs), 57 .mosi_da(mosi), 58 .sck_da(sck), 59 .data_in(tab_data[11:0]) 60 ); 61 //////////////以下双口RAM侧的电路描述///////////// 62 wire[15:0] data_host;//从主机接收的数据的并行接口 63 wire[7:0] inc_addr_host;//连接到主机端存储器端口的地址线,由计数器自动产生 64 wire mosi_ram_host,mosi_DdsDelta_host,sck_ram_host,sck_DdsDelta_host; 65 wire[15:0] delta_val; 66 dualRAM_DATA i_dualRAM_DATA( 67 .Clk0(cs_host1),//用接收端串行接收选通信号作为存储信号的时钟 68 .Clk1(samp_syc_sig), 69 .ClkEn0(1'b1), 70 .ClkEn1(1'b1),//时钟有效信号,可以一直为高 71 .AsyncReset0(1'b0),//复位信号,高有效,可以一直不复位 72 .AsyncReset1(1'b0),//复位信号,高有效,可以一直不复位 73 .WeRenA(1'b1),//写数据有效信号,高有效 74 .ReB(1'b1 ), //端口1读数据有效信号,高有效 75 .DataInA(data_host[11:0]),//只使用接收数据的低12位 76 .AddressA(inc_addr_host[7:0]), 77 .AddressB(dds_addr[7:0]), 78 .DataOutB(tab_data[11:0]) 79 ); 80 //////////////以下主控MCU侧的电路描述///////////// 81 mux_HostSpi i_mux_HostSpi(//数据多路器,用于选择SPI口初始化的是RAM还是DDS累加地址 82 .mosi(mosi_host), 83 .sck(sck_host), 84 .cs1(cs_host1), 85 .cs2(cs_host2), 86 .mosi_ram(mosi_ram_host), 87 .mosi_DdsDelta(mosi_DdsDelta_host), 88 .sck_ram(sck_ram_host), 89 .sck_DdsDelta(sck_DdsDelta_host) 90 ); 91 //以下移位寄存器用于通过CS1选通后接收主机发来的波形数据 92 shift_reg i_ram_shift_reg_host( 93 .mosi(mosi_ram_host), 94 .sck(sck_ram_host), 95 .nrst(nrst),//低电平复位 96 .ini_data(16'd0), 97 .data_out(data_host[15:0]) 98 ); 99 addr_generator i_addr_generator_host(//每次加一的方式遍历所有地址 100 .clk(cs_host1), 101 .nrst(nrst), 102 .inc_addr(inc_addr_host[7:0]) 103 ); 104 //以下移位寄存器用于通过CS2选通后接收主机发来的地址累加值 105 shift_reg i_delta_shift_reg_host( 106 .mosi(mosi_DdsDelta_host), 107 .sck(sck_DdsDelta_host), 108 .nrst(nrst),//低电平复位 109 .ini_data(16'd328),//复位后的初始化为500Hz输出 110 .data_out(delta_val[15:0]) 111 ); 112 addr_adder i_dds_addr_adder(//DDS算法产生下一个需要DAC数据数据的地址 113 .clk(samp_syc_sig), 114 .nrst(nrst), 115 .delta_addr(delta_val[15:0]), 116 .high_byte_addr(dds_addr[7:0]) 117 ); 118 endmodule 顶层例化电路