色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美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

    文章

    5343

    瀏覽量

    120332
  • VCS
    VCS
    +關注

    關注

    0

    文章

    79

    瀏覽量

    9605
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27538
  • CLK
    CLK
    +關注

    關注

    0

    文章

    127

    瀏覽量

    17165
  • Verilog語言
    +關注

    關注

    0

    文章

    113

    瀏覽量

    8226
收藏 人收藏

    評論

    相關推薦

    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 ?6768次閱讀

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

    該課程是正點原子團隊編寫,詳細講解了quartus中的qsys。也可以從我頭像點進去看FPGA verilog相關的視頻。
    的頭像 發表于 08-06 06:02 ?3093次閱讀
    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>修訂稿
    主站蜘蛛池模板: 20岁αsrian男同志免费| 女人张开腿让男人添| 国产精品色吧国产精品| 白洁在线观看| 把腿张开JI巴CAO死你H教室| 99久久久无码国产AAA精品| 中文字幕人成人乱码亚洲影视S| 亚洲精品久久久久一区二区三 | 嗯啊好爽视频| 免费精品国偷自产在线在线| 美美哒免费影视8| 男人到天堂a在538线| 欧洲最强rapper潮水喷视频| 欧美性最猛xxxx在线观看视频| 毛片手机在线| 欧美精品AV一区二区无码| 捏奶动态图吃奶动态图q| 强开少妇嫩苞又嫩又紧九色| 日本一本在线播放| 天堂在线亚洲精品专区| 午夜亚洲国产理论片二级港台二级 | 国产亚洲高清视频| 好吊妞国产欧美日韩视频| 精品日韩二区三区精品视频| 久久精品一本到东京热| 蜜桃TV成人网站免费打开| 人妻系列合集| 无码人妻精品国产婷婷| 亚洲欧美人成视频在线| 中文字幕在线观看亚洲| 99久久精品国产交换| 福利社的阿姨| 嗨嗨快播电影| 蜜桃传媒在线观看| 日韩欧美精品有码在线播放| 亚洲AV综合99一二三四区| 中文字幕成人免费高清在线| 99视频在线国产| 国产人妻人伦精品59HHH| 久久人妻少妇嫩草AV蜜桃99| 欧美成人国产|