詳細代碼及仿真源文件已同步上傳至個人主頁資源(原創不易,轉載請注明出處)
目錄
模塊圖
代碼實現
時序圖
仿真圖
HMC7044介紹
一、概述
? ? ? ? HMC7044是帶有 JESD204B 接口的高性能、3.2 GHz、14 路輸出抖動衰減器,提供 14 路低噪聲且可配置的輸出,可以靈活地與許多不同器件接口,包括數據轉換器、現場可編程門陣列(FPGA)和混頻器本振(LO)。
查閱官方手冊,這里我們需要關心的是:
1.查找SPI總線頻率
2.SPI的發送時序,發送模式,發送多少數據
由官網手冊可知,每次通過SPI發送24bit數據,且SPI工作模式為模式0
模塊圖
模塊分析:
PLL模塊:用于生成所需時鐘,這里低于10MHZ即可,本實驗設置為5MHZ
SPI_send模塊:用于發送配置的24bit數據
SPI_ctrl模塊:用于對所需要發送的數據進行控制,以滿足HMC7044芯片的時序要求
代碼實現
module spi_send(input wire div_clk ,//分頻時鐘5MHzinput wire sys_rst_n ,//復位信號,低電平有效input wire str_flag ,//開始標志信號input wire [23:0]data ,//數據24位
/* input wire spi_done ,//全部配置完成信號 */output reg slen ,//cs#片選信號,低電平有效output wire sclk ,//spi傳輸時鐘output reg sdata ,//spi傳輸數據,MSBoutput reg send_done
);/**************define code*********************/parameter IDLE = 5'd0 ,S0 = 5'd1 ,S1 = 5'd2 ,S2 = 5'd3 ,S3 = 5'd4 ;reg[2:0] state ;//狀態機5個狀態reg[4:0] cnt_bit ;//對數計數0-23reg clk_en ;//時鐘使能信號wire div_clk_n ;//對分頻時鐘取反
/**************main code*********************/
//describe div_clk_nassign div_clk_n = ~div_clk ;//describe cnt_bitalways@(posedge div_clk , negedge sys_rst_n)beginif(~sys_rst_n)cnt_bit <= 5'd0 ;else if(cnt_bit == 5'd25)cnt_bit <= 5'd0 ;else if(state == S1)cnt_bit <= cnt_bit + 1'd1 ;end//describe clk_enalways@(posedge div_clk , negedge sys_rst_n)beginif(~sys_rst_n)clk_en <= 1'd0 ;else if(((cnt_bit >= 5'd0) && (cnt_bit <= 5'd23))&&(state == S1)) clk_en <= 1'd1 ;else clk_en <= 1'd0 ;end//兩段式狀態機,第一段,時序邏輯,描述狀態轉移always@(posedge div_clk , negedge sys_rst_n)beginif(~sys_rst_n)state <= IDLE ;else case(state)IDLE :beginif(str_flag)state <= S0 ;elsestate <= state ;endS0 : state <= S1 ;S1 :beginif(cnt_bit == 5'd24)state <= S2 ;elsestate <= state ;endS2 : state <= S3 ;S3 : beginif(send_done)state <= IDLE ;elsestate <= state ;enddefault : state <= IDLE ;endcaseend//第二段,時序邏輯,描述輸出always@(posedge div_clk , negedge sys_rst_n)beginif(~sys_rst_n)slen <= 1'd1 ;else if(str_flag)slen <= 1'd0 ;else if(state == S2)slen <= 1'd1 ;elseslen <= slen ;end
//describe sclk assign sclk = (clk_en == 1'd1) ? div_clk_n : 1'd0 ;//describe sdata always@(posedge div_clk , negedge sys_rst_n)beginif(~sys_rst_n)sdata <= 1'd0 ;else case(cnt_bit)5'd1 : sdata <= data[23] ;//MSB5'd2 : sdata <= data[22] ;5'd3 : sdata <= data[21] ;5'd4 : sdata <= data[20] ;5'd5 : sdata <= data[19] ;5'd6 : sdata <= data[18] ;5'd7 : sdata <= data[17] ;5'd8 : sdata <= data[16] ;5'd9 : sdata <= data[15] ;5'd10 : sdata <= data[14] ;5'd11 : sdata <= data[13] ;5'd12 : sdata <= data[12] ;5'd13 : sdata <= data[11] ;5'd14 : sdata <= data[10] ;5'd15 : sdata <= data[9] ;5'd16 : sdata <= data[8] ;5'd17 : sdata <= data[7] ;5'd18 : sdata <= data[6] ;5'd19 : sdata <= data[5] ;5'd20 : sdata <= data[4] ;5'd21 : sdata <= data[3] ;5'd22 : sdata <= data[2] ;5'd23 : sdata <= data[1] ;5'd24 : sdata <= data[0] ;default : sdata <= 1'd0 ;endcaseend//describe send_done always@(posedge div_clk , negedge sys_rst_n)beginif(~sys_rst_n) send_done <= 1'd0 ;else if(state == S2)send_done <= 1'd1 ;else send_done <= 1'd0 ;endendmodule
由于篇幅有限,其他模塊已經上傳至個人主頁資源
時序圖
參考SPI發送數據時序,將數據位改為24bit即可
仿真圖
可以看到FPGA通過SPI發送了8'h98條數據進行HMC7044配置,當配置完成的時候,進行正常工作,即配置完成