📄 serial_rd.v
字号:
`timescale 1ns / 1ps//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: // // Create Date: 09:23:42 12/05/2007 // Design Name: // Module Name: serial_rd // Project Name: // Target Devices: // Tool versions: // Description: //// Dependencies: //// Revision: // Revision 0.01 - File Created// Additional Comments: ////////////////////////////////////////////////////////////////////////////////////module serial_rd(clk, nrst, addr, dout, start, ncs, sclk, sdio, gend); input clk; input nrst; input addr;
input start;
output [7:0] dout; output ncs; output sclk; output sdio; output gend; reg [7:0] dout; reg ncs; reg sclk; reg sdio; reg gend;
////////////////////////////////////////////////////////////////////////////////
reg g_addr_data; reg [7:0] shift_data,shift_cnt; reg [4:0] state_cur,state_next; parameter STATE_IDLE = 5'b00000, STATE1 = 5'b0001, STATE2 = 5'b0010, STATE3 = 5'b0011, STATE4 = 5'b0111, STATE5 = 5'b0110, STATE6 = 5'b0100, STATE7 = 5'b0101, STATE8 = 5'b1101,
STATE9 = 5'b1101; parameter LEN_WORD = 8; reg[1:0] dly_cnt; /////////////////////////////////////////////////////////////////////////// //assign /////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////// //fsm always@(posedge clk,negedge nrst) begin if(!nrst) state_cur <= STATE_IDLE; else state_cur <= state_next; end //////////////////////////////// // always@(nrst,state_cur,shift_cnt,start,dly_cnt) begin if(!nrst) state_next <= STATE_IDLE; else begin case(state_cur) STATE_IDLE: begin if(start == 1) state_next <= STATE1; else state_next <= STATE_IDLE; end /////////////////////////write addr/data to serial interface STATE1: begin state_next <= STATE2; end STATE2: //delay 4 clk period begin if(dly_cnt == 3) state_next <= STATE3; end STATE3: //delay 4 clk period begin if(dly_cnt == 3) state_next <= STATE4; end STATE4: begin if(shift_cnt == 0) // end to write state_next <= STATE5; else // continue to write state_next <= STATE1; end /////////////////////////read data from serial interface STATE5: begin state_next <= STATE6; end STATE6: //delay 4 clk period begin if(dly_cnt == 3) state_next <= STATE7; end STATE7: //delay 4 clk period begin if(dly_cnt == 3) state_next <= STATE8; end STATE8: begin if(shift_cnt != 0) //continue to read data state_next <= STATE5; else //end to read data state_next <= STATE9; end STATE9: begin if(start != 0) //wait for end signal state_next <= STATE9; else state_next <= STATE_IDLE; end default: begin state_next <= STATE_IDLE; end endcase end end ////////////////////////////////// always@(posedge clk) begin if(!nrst) init; else begin case(state_cur) STATE_IDLE: begin init; end STATE1: begin ncs <= 1'b0; sdio <= shift_data[shift_cnt]; sclk <= 1'b0; end STATE2: begin if(dly_cnt == 3) dly_cnt <= 0; else dly_cnt <= dly_cnt + 1; end STATE3: begin sclk <= 1'b1; if(dly_cnt == 3) dly_cnt <= 0; else dly_cnt <= dly_cnt + 1; end STATE4: begin sclk <= 1'b1; if(shift_cnt != 0) shift_cnt <= shift_cnt - 1;
else
shift_cnt <= 3'b111; end ////////////////////////read data from serial interface STATE5: begin ncs <= 1'b0; sclk <= 1'b0; end STATE6: //delay 4 clk period begin if(dly_cnt == 3) dly_cnt <= 0; else dly_cnt <= dly_cnt + 1; end STATE7: //delay 4 clk period begin sclk <= 1'b1; if(dly_cnt == 3) dly_cnt <= 0; else dly_cnt <= dly_cnt + 1; end STATE8: begin dout[shift_cnt] <= sdio; end STATE9: begin gend <= 1'b1; end default: begin end endcase end end ///////////////////////////////////////// task init; begin ncs <= 1'b1; sdio <= 1'b0; sclk <= 1'b0; gend <= 1'b0; dout <= 8'b00000000; shift_data <= addr; shift_cnt <= LEN_WORD -1; end endtaskendmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -