色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Verilog實現講解

冬至子 ? 來源:Bug記錄 ? 作者:woodfan ? 2023-06-16 09:52 ? 次閱讀

verilog第一步肯定需要將輸入輸出端口,常量等信息補齊全;

module spi_ctrl
#(
parameter	SPI_ADDR_WIDTH = 16,
parameter	SPI_CMD_WIDTH  = 24,
parameter	SPI_IDLE = 0
)
(
	/* System signal */
	input					clk			,
	input					rst			,
	
	/* User Data */
	input		[23:0]			cmd_data		,
	output 	reg	[ 7:0]			read_data		,
	input					en			,
	input					ready			,
	output	reg				sink_vld		,
	
	/* SPI interface */
	output	reg			 	spi_clk			,
	output	reg				spi_enb			,
	output	reg				spi_di			,
	input					spi_do
);

設置SPI_ADDR_WIDTH標記SPI傳輸數據命令的寄存器地址值寬度,SPI_CMD_WIDTH變量標記SPI傳輸數據的整體寬度。

輸入輸出變量中,clk時鐘信號和rst復位信號都是必備的系統信號;除去SPI接口的4根數據線外,還有輸入的24位cmd_data,將需要發送的數據從這個端口傳遞給SPI處理;輸出的8位read_data,將讀取到的寄存器數據輸出便于做后續處理;以及控制信號,en控制SPI的工作速率,ready指示SPI發送工作的開始,sink_vld指示SPI發送讀取工作的結束。

上一篇文章談到,我們將整個SPI的發送讀取分為5個狀態,

圖片

SPI狀態機的5種狀態

現在我們需要捋順每個狀態跳轉的條件;IDLE空閑狀態跳轉到WRITE_ADDR寫地址狀態,說明此時需要發送SPI數據,所以ready信號是跳轉條件;從上圖可以看到,WRITE_ADDR寫地址狀態可以跳轉到WRITE_DATA狀態或READ狀態,而決定條件是SPI的命令是讀取命令還是寫入命令,這取決于SPI寫入數據的MSB(最高位);WRITE_DATA狀態和READ狀態跳轉回IDLE空閑狀態的條件是需要發送的數據已經發送完畢或需要讀取的數據已經讀取完畢。

另外,在WRITE_ADDR寫地址狀態,WRITE_DATA狀態和READ狀態里面需要用到計數器,記錄當前已經發送或讀取的數據量,作為跳出該狀態的判斷依據之一。

由于這部分的狀態機比較簡單,所以第一版我采用了一段式狀態機。為了便于理解SPI_CLK的產生,我選擇使用分頻操作生成SPI_CLK,但其實更推薦的方式是使用MMCM,PLL等方式產生SPI_CLK。

localparam	SPI_DATA_WIDTH  = SPI_CMD_WIDTH - SPI_ADDR_WIDTH;

assign  flag_write_addr_update = (cnt < SPI_ADDR_WIDTH && spi_clk == 1'b0) ? 1'b1 : 1'b0; 

assign	flag_write_addr_hold = (cnt < SPI_ADDR_WIDTH) ? 1'b1 : 1'b0 ;

assign	flag_data_update = (cnt < SPI_DATA_WIDTH && spi_clk == 1'b0) ? 1'b1 : 1'b0 ;

assign	flag_data_hold = (cnt < SPI_DATA_WIDTH) ? 1'b1 : 1'b0 ;

always @ (posedge clk or posedge rst)
begin
	if (rst)
	begin
		spi_clk		<=	SPI_IDLE	;
		spi_enb		<=	1'b1		;
		spi_di		<=	1'b0		;
		read_data	<=	'd0			;
		sink_vld	<=	1'b0		;
		state		<=	IDLE		;
		cmd_data_r	<=	'd0			;
		cnt			<=	'd0			;
		flag_read	<=	1'b0		;
	end
	else if (en)
	begin
		case (state)
		IDLE:
		begin
			if (ready)
			begin
				state		<= WRITE_ADDR		;
				spi_enb		<=	1'b0		;
				cmd_data_r	<=cmd_data		;
				cnt		<=	'd0		;
				flag_read 	<= !cmd_data[23]	;
			end
			sink_vld 	<=	1'b0;
			spi_di		<=	1'b0;
			spi_enb		<=	1'b1;
		end
		
		WRITE_ADDR:
		begin	
			spi_enb		<=	1'b0;
			if (flag_write_addr_update)
			begin
				spi_di		<=	cmd_data_r[23]			;
				cmd_data_r	<=	{cmd_data_r[22:0], 1'b0}	;
				spi_clk		<=	1'b1				;
				cnt			<=	cnt + 8'd1		;
			end	
			else if (flag_write_addr_hold)
			begin
				spi_clk	<=	1'b0;
			end
			else 
			begin
				if (flag_read)
					state	<=	READ		;
				else
					state	<=	WRITE_DATA	;
				cnt		<=	'd0		;
				spi_clk	<=	1'b0			;
			end
		end
		
		WRITE_DATA:
		begin
			if (flag_data_update)
			begin
				spi_di		<=	cmd_data_r[23]			;
				cmd_data_r	<=	{cmd_data_r[22:0], 1'b0}	;
				spi_clk		<=	1'b1				;
				cnt		<=	cnt + 8'd1			;
			end	
			else if (flag_data_hold)
			begin
				spi_clk		<=	1'b0	;
			end
			else 
			begin
				state 	<= 	IDLE	;
				spi_clk <=	1'b0	;
				sink_vld<=  	1'b1    ;
			end
		end
		
		READ:
		begin
			if (flag_data_update)
			begin
				spi_clk	<=	1'b1	;
			end	
			else if (flag_data_hold)
			begin
				spi_clk		<=	1'b0			;
				read_data[0]	<=	spi_do			;
				read_data[7:1]	<=	read_data[6:0]		;
				cnt		<=	cnt + 8'd1		;
			end
			else 
			begin
				state 		<= IDLE;
				sink_vld 	<= 1'b1;
			end
		end
		default : state <= IDLE;
		endcase
	end
end

從上一個文章里面,我們可以看到,在WRITE_ADDR寫地址狀態,WRITE_DATA狀態里,我們需要在SPI_CLK時鐘的上升沿更新SPI_DO值,在SPI_CLK下降沿保持SPI_DO值;

所以我們需要判斷,

  1. 當SPI_CLK為低電平并且傳輸還沒有結束時,我們需要將SPI_CLK拉高,將需要的發送數據串行數據更新到SPI_DI,更新計數器值;
  2. 而當SPI_CLK為高電平并且傳輸還沒有結束時,我們僅需要將SPI_CLK拉低,保持SPI_DI不變。

READ狀態里,我們僅需要在SPI_CLK時鐘的下降沿采樣SPI_DO值;即

  1. 當SPI_CLK為高電平并且傳輸還沒有結束時,我們需要將SPI_CLK拉低,將SPI_DO采樣并保存至read_data,更新計數器值;
  2. 而當SPI_CLK為低電平并且傳輸還沒有結束時,我們僅需要將SPI_CLK拉高。整個電路的流程就已經被我們用verilog描述出來了。

使用VCS仿真之后的結果,可以見下圖:

圖片

希望通過這一版簡單的講解,能讓大家對SPI的verilog描述有更加清晰的認識。

這一版本的SPI最終上板測試沒有問題,但確實還存在一些問題,不推薦使用生成時鐘做SPI_CLK, 如果還有更好的建議可以提出來一起討論。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 寄存器
    +關注

    關注

    31

    文章

    5357

    瀏覽量

    120715
  • VCS
    VCS
    +關注

    關注

    0

    文章

    80

    瀏覽量

    9625
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27579
  • CLK
    CLK
    +關注

    關注

    0

    文章

    127

    瀏覽量

    17185
  • Verilog語言
    +關注

    關注

    0

    文章

    113

    瀏覽量

    8282
收藏 人收藏

    評論

    相關推薦

    Verilog語言練習與講解

    Verilog語言練習與講解
    發表于 08-15 16:39

    Verilog語言練習與講解

    Verilog語言練習與講解
    發表于 03-07 13:32

    VHDL 和verilog HDL講解

    VHDL 和verilog HDL講解
    發表于 10-09 20:32

    Verilog語法基礎講解之參數化設計

    本帖最后由 lee_st 于 2017-10-31 08:46 編輯 Verilog語法基礎講解之參數化設計
    發表于 10-21 20:56

    Verilog實現8255芯片功能

    Verilog實現8255芯片功能
    發表于 11-03 17:06 ?144次下載

    夏宇聞-verilog經典教材

    verilog語言經典教材,本書講解verilog的基本語法和經典例子等等。
    發表于 11-10 11:44 ?23次下載

    數字系統設計:VERILOG實現

    數字系統設計:VERILOG實現 (第2版)
    發表于 11-30 10:21 ?0次下載

    verilog_實現_LCD顯示

    關于fpga和LCD方面的知識,verilog實現的LCD顯示的設計
    發表于 05-16 18:04 ?47次下載

    Verilog語言練習與講解2

    Verilog語言練習與講解2,感興趣的小伙伴們可以瞧一瞧。
    發表于 11-10 15:29 ?1次下載

    Verilog語言練習與講解1

    Verilog語言練習與講解1,感興趣的小伙伴們可以瞧一瞧。
    發表于 11-10 15:29 ?2次下載

    Verilog實現74LS194芯片設計程序

    Verilog作為一種種硬件描述語言目前已經得到了普遍運用。本文主要介紹了Verilog特點、Verilog用途以及Verilog實現74L
    發表于 12-22 17:26 ?6794次閱讀

    FPGA verilog相關視頻:quartus中的qsys的講解

    該課程是正點原子團隊編寫,詳細講解了quartus中的qsys。也可以從我頭像點進去看FPGA verilog相關的視頻。
    的頭像 發表于 08-06 06:02 ?3109次閱讀
    FPGA <b class='flag-5'>verilog</b>相關視頻:quartus中的qsys的<b class='flag-5'>講解</b>

    FPGA設計中DAC控制的Verilog實現圖文稿

    FPGA設計中DAC控制的Verilog實現圖文稿(ltspice 放置電源)-該文檔為FPGA設計中DAC控制的Verilog實現圖文稿資料,講解
    發表于 07-26 12:17 ?10次下載
    FPGA設計中DAC控制的<b class='flag-5'>Verilog</b><b class='flag-5'>實現</b>圖文稿

    FPGA設計中DAC控制的Verilog實現

    FPGA設計中DAC控制的Verilog實現(單片機電源維修)-該文檔為FPGA設計中DAC控制的Verilog實現資料,講解的還不錯,感興
    發表于 07-26 12:18 ?18次下載
    FPGA設計中DAC控制的<b class='flag-5'>Verilog</b><b class='flag-5'>實現</b>

    FPGA設計中DAC控制的Verilog實現修訂稿

    FPGA設計中DAC控制的Verilog實現修訂稿(空調電源芯片)-該文檔為FPGA設計中DAC控制的Verilog實現修訂稿資料,講解的還
    發表于 07-26 13:13 ?10次下載
    FPGA設計中DAC控制的<b class='flag-5'>Verilog</b><b class='flag-5'>實現</b>修訂稿
    主站蜘蛛池模板: 18动漫在线观看| 动漫美女被吸奶| 国产精品人妻无码99999| 日本熟妇乱人伦A片精品软件| 99精品电影一区二区免费看| 妈妈的朋友6未删减版完整在线 | 97午夜理论片影院在线播放| 麻豆一二三四区乱码| 99精品免费在线观看| 清晨紧湿爱运动h高h| 成人无码在线视频区| 少妇精品久久久一区二区三区| 国产成久久免费精品AV片天堂| 忘忧草在线社区WWW日本-韩国| 国产日韩久久久精品影院首页| 亚洲精品国产SUV| 久久欧洲AV无码精品色午夜麻豆| 60老妇性xxxxhd| 琪琪伦伦影院理论片| 国产成人久久精品激情| 亚洲精品一二三区区别在哪| 久久久性色精品国产免费观看 | 成人区在线观看免费视频| 午夜福利电影网站鲁片大全| 狠狠色狠狠色88综合日日91| 中文字幕亚洲无线码在线| 欧美黑人巨大xxxxx| 国产69TV精品久久久久99| 亚洲AV午夜福利精品香蕉麻豆 | 精品视频久久久久| 99爱在线观看精品视频| 色婷婷亚洲精品天天综合影院| 国产亚洲欧美高清在线| 中文字幕一区二区三区在线播放 | 男女高潮又爽又黄又无遮挡| www.色片| 亚洲黄色在线视频| 免费的好黄的漫画| 国产成人一区二区三区在线观看 | 夜夜女人国产香蕉久久精品| 欧美丰满白嫩bbxx|