我是剛進公司實習生,之前沒怎么接觸過verilog語言,今天師傅讓我寫這三個模塊,說讓我看看spi,異步FIFO,我感覺懵懵的,下不了手
其中spi依葫蘆畫瓢寫出來了?那兩個模塊還不知道咋寫?
師傅又說我可以寫個測驗檔案
我現在腦袋里裝滿了問號?有沒有大神指點一下 給我指條路 我接下來該怎么學習這一塊知識 ?(我之前專業是資訊工程 硬體只學了皮毛 數電 VHDL)
貼一下 spi那一塊代碼
module SPI
(
input I_clk , //時鐘信號
input I_rst , //復位
input I_rx_en , //允許讀資料
input I_tx_en , //允許發資料
input [7:0] I_data_in , //
output reg [7:0] O_data_out , //
output reg O_tx_done , //傳輸完成標志
output reg O_rx_done , //讀取完成標志
// spi信號定義
output reg O_CS ,//片選
output reg O_SCLK ,//時鐘
output reg O_SDI ,//輸出
input I_SDO //輸入
);
//0-15讀寫狀態選擇
reg[3:0] R_tx_state;
reg[3:0] R_rx_state;
always@(posedge I_clk or negedge I_rst)
begin
if(!I_rst) //復位回應
begin
R_tx_state <= 4'd0 ;
R_rx_state <= 4'd0 ;
O_data_out <= 8'd0 ;
O_tx_done <= 1'd0 ;
O_rx_done <= 1'd0 ;
O_SDI <= 1'd0 ;
O_SCLK <= 1'd0 ;
O_CS <= 1'd1 ;
end
else if(I_tx_en)//發信號
begin
O_CS <= 1'd0 ;
case (R_tx_state)
4'd1, 4'd3 , 4'd5 , 4'd7 , 4'd9, 4'd11, 4'd13, 4'd15 : //整合奇數
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b0 ;
O_SCLK <= 1'b1 ;
end
4'd0: //第七位
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b0 ;
O_SDI <= O_data_out[0] ;
O_SCLK <= 1'b0 ;
end
4'd2: //第六位
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b0 ;
O_SDI <= O_data_out[1] ;
O_SCLK <= 1'b0 ;
end
4'd4: //第五位
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b0 ;
O_SDI <= O_data_out[2] ;
O_SCLK <= 1'b0 ;
end
4'd6: //第四位
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b0 ;
O_SDI <= O_data_out[3] ;
O_SCLK <= 1'b0 ;
end
4'd8: //第三位
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b0 ;
O_SDI <= O_data_out[4] ;
O_SCLK <= 1'b0 ;
end
4'd10: //第二位
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b0 ;
O_SDI <= O_data_out[5] ;
O_SCLK <= 1'b0 ;
end
4'd12: //第一位
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b0 ;
O_SDI <= O_data_out[6] ;
O_SCLK <= 1'b0 ;
end
4'd14: //第零位
begin
R_tx_state <= R_tx_state + 1'b1 ;
O_tx_done <= 1'b1 ;
O_SDI <= O_data_out[7] ;
O_SCLK <= 1'b0 ;
end
default: R_tx_state <= 4'd0 ;
endcase
end
else if(I_rx_en)//收信號
begin
O_CS <= 1'b0 ; // 拉低片選信號CS
case(R_rx_state)
4'd0, 4'd2 , 4'd4 , 4'd6 , 4'd8, 4'd10, 4'd12, 4'd14 : //整合偶數狀態
begin
O_SCLK <= 1'b0 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b0 ;
end
4'd1: // 接收第7位
begin
O_SCLK <= 1'b1 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b0 ;
O_data_out[7] <= I_SDO ;
end
4'd3: // 接收第6位
begin
O_SCLK <= 1'b1 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b0 ;
O_data_out[6] <= I_SDO ;
end
4'd5: // 接收第5位
begin
O_SCLK <= 1'b1 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b0 ;
O_data_out[5] <= I_SDO ;
end
4'd7: // 接收第4位
begin
O_SCLK <= 1'b1 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b0 ;
O_data_out[4] <= I_SDO ;
end
4'd9: // 接收第3位
begin
O_SCLK <= 1'b1 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b0 ;
O_data_out[3] <= I_SDO ;
end
4'd11: // 接收第2位
begin
O_SCLK <= 1'b1 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b0 ;
O_data_out[2] <= I_SDO ;
end
4'd13: // 接收第1位
begin
O_SCLK <= 1'b1 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b0 ;
O_data_out[1] <= I_SDO ;
end
4'd15: // 接收第0位
begin
O_SCLK <= 1'b1 ;
R_rx_state <= R_rx_state + 1'b1 ;
O_rx_done <= 1'b1 ;
O_data_out[0] <= I_SDO ;
end
default:R_rx_state <= 4'd0 ;
endcase
end
else
begin
R_tx_state <= 4'd0 ;
R_rx_state <= 4'd0 ;
O_tx_done <= 1'b0 ;
O_rx_done <= 1'b0 ;
O_CS <= 1'b1 ;
O_SCLK <= 1'b0 ;
O_SDI <= 1'b0 ;
O_data_out <= 8'd0 ;
end
end
endmodule
uj5u.com熱心網友回復:
很痛苦,對著電腦不知道怎么下手uj5u.com熱心網友回復:
從基本學吧,一步一步搞懂,急于求成只是應付,這畢竟是作業,不能混的uj5u.com熱心網友回復:
測驗檔案就是測驗你這個程式是否成功的檔案,testuj5u.com熱心網友回復:
先要把你制作器件的功能時序弄清楚,才能編程式,寫測驗檔案。uj5u.com熱心網友回復:
前面說的不錯,一步步來,要寫檔案說明,代碼做仿真,找本相關的書看看,例題都有SPI的,入門很容易的,實作方法有多種。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/33869.html
標籤:硬件設計
下一篇:關于Gpio配置的相關問題
