FPGA設計思想之串並轉換


數據流中,用面積換速度-串行轉並行的操作

並行轉串行數據輸出:采用計數方法,將並行的數據的總數先表示出來,然后發送一位數據減一,后面的接收的這樣表示: data_out <= data[cnt];//cnt表示計數器

`timescale  1ns/1ns

module  p2s
    (
      input         clk,
      input         rst_n,
      input         load,
      input [7:0]   pdata,
      output        sclk,
      output        sdat
    );
`define FULL  4'hf 
reg [3:0]   bitcnt;
reg         en;
reg [7:0]   sbuff;
always @(posedge clk or negedge rst_n)
  if(!rst_n)      en  <=  0;
  else if(load) en  <=  1'b1; 
  else if(bitcnt==`FULL)  en  <= 1'b0; 
always @(posedge clk or negedge rst_n)
 if(!rst_n)  bitcnt  <=  0;
  else if(en) bitcnt  <=  bitcnt + 'b1;
  else  bitcnt  <=  0;
assign  sclk  = bitcnt[0];
always @(posedge clk or negedge rst_n)
  if(!rst_n)  sbuff <=  8'b0;
  else if(load) sbuff <=  pdata;
  else if(sclk) sbuff <=  sbuff<<1;
assign  sdat  = sbuff[7];
endmodule


串行轉並行數據輸出:采用位拼接結束,將串行的數據總數先表示出來,然后發送一位數據加一,后面的接收的這樣標志:data <= {data[6:0],data_out };------用過的74HC595

module SerialToParallel(
    input         CLK,    //時鍾
    input         RSTn,    //復位
    input         Enable,    //輸入有效
    input         DataIn,    //串行輸入
    output reg    Ready,    //輸出有效
    output[7:0]    Index,    //並行數據索引
    output[7:0] ParallelData    //並行數據輸出
    );
    
    reg[7:0]    Data_Temp;    //數據緩存
    reg[3:0]    counter;    //位數計數器
    reg[3:0]    state;        //狀態機
    reg[7:0]    Index_Temp;    //索引緩存
    
    assign    Index=Index_Temp;
    assign    ParallelData=Ready?Data_Temp:8'd0;
    
    ////////////////////////////////////////
    //state:
    //4'd0:復位 
    //
    //4'd1:未復位,未使能
    //
    //4'd2:未復位,輸入使能
    //
    
    always@(posedge CLK or negedge RSTn)
    if(!RSTn)
        begin
            state<=4'd0;        //復位
            Ready<=0;
            counter<=4'd0;
            Data_Temp<=8'd0;
            Index_Temp<=8'd0;
        end
    else
        begin
            case(state)
                4'd0:
                begin
                    if(!Enable)state<=4'd1;
                    else state<=4'd2;
                    Ready<=0;
                end
                4'd1:
                begin
                    if(!Enable)state<=4'd1;
                    else state<=4'd2;
                    Ready<=0;
                    counter<=4'd0;
                    Data_Temp<=8'd0;
                end
                4'd2:
                begin
                    if(!Enable)state<=4'd1;
                    else state<=4'd2;
                    case(counter)
                    4'd0:begin Data_Temp[0]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
                    4'd1:begin Data_Temp[1]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
                    4'd2:begin Data_Temp[2]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
                    4'd3:begin Data_Temp[3]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
                    4'd4:begin Data_Temp[4]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
                    4'd5:begin Data_Temp[5]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
                    4'd6:begin Data_Temp[6]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
                    4'd7:begin Data_Temp[7]<=DataIn;counter<=4'd0;Index_Temp<=Index_Temp + 1'b1;Ready<=1'b1;end
                    endcase
                end
            endcase
        end

endmodule

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM