• 串并转换与数据映射——FPGA子模块整理


    刚写完2w字报告,写点verilog压压惊。

    造轮子是件好玩儿的事。

    不务正业,游手好闲……

    1.串并转换模块(1 to 8)

     1 `timescale 1ns / 1ps
     2 //////////////////////////////////////////////////////////////////////////////////
     3 // Company: 
     4 // Engineer: 
     5 // 
     6 // Create Date:    20:30:15 04/14/2015 
     7 // Design Name: 
     8 // Module Name:    SerialToParallel 
     9 // Project Name: 
    10 // Target Devices: 
    11 // Tool versions: 
    12 // Description: 
    13 //
    14 // Dependencies: 
    15 //
    16 // Revision: 
    17 // Revision 0.01 - File Created
    18 // Additional Comments: 
    19 //
    20 //////////////////////////////////////////////////////////////////////////////////
    21 module SerialToParallel(
    22     input         CLK,    //时钟
    23     input         RSTn,    //复位
    24     input         Enable,    //输入有效
    25     input         DataIn,    //串行输入
    26     output reg    Ready,    //输出有效
    27     output[7:0]    Index,    //并行数据索引
    28     output[7:0] ParallelData    //并行数据输出
    29     );
    30     
    31     reg[7:0]    Data_Temp;    //数据缓存
    32     reg[3:0]    counter;    //位数计数器
    33     reg[3:0]    state;        //状态机
    34     reg[7:0]    Index_Temp;    //索引缓存
    35     
    36     assign    Index=Index_Temp;
    37     assign    ParallelData=Ready?Data_Temp:8'd0;
    38     
    39     ////////////////////////////////////////
    40     //state:
    41     //4'd0:复位 
    42     //
    43     //4'd1:未复位,未使能
    44     //
    45     //4'd2:未复位,输入使能
    46     //
    47     
    48     always@(posedge CLK or negedge RSTn)
    49     if(!RSTn)
    50         begin
    51             state<=4'd0;        //复位
    52             Ready<=0;
    53             counter<=4'd0;
    54             Data_Temp<=8'd0;
    55             Index_Temp<=8'd0;
    56         end
    57     else
    58         begin
    59             case(state)
    60                 4'd0:
    61                 begin
    62                     if(!Enable)state<=4'd1;
    63                     else state<=4'd2;
    64                     Ready<=0;
    65                 end
    66                 4'd1:
    67                 begin
    68                     if(!Enable)state<=4'd1;
    69                     else state<=4'd2;
    70                     Ready<=0;
    71                     counter<=4'd0;
    72                     Data_Temp<=8'd0;
    73                 end
    74                 4'd2:
    75                 begin
    76                     if(!Enable)state<=4'd1;
    77                     else state<=4'd2;
    78                     case(counter)
    79                     4'd0:begin Data_Temp[0]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    80                     4'd1:begin Data_Temp[1]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    81                     4'd2:begin Data_Temp[2]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    82                     4'd3:begin Data_Temp[3]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    83                     4'd4:begin Data_Temp[4]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    84                     4'd5:begin Data_Temp[5]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    85                     4'd6:begin Data_Temp[6]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    86                     4'd7:begin Data_Temp[7]<=DataIn;counter<=4'd0;Index_Temp<=Index_Temp + 1'b1;Ready<=1'b1;end
    87                     endcase
    88                 end
    89             endcase
    90         end
    91 
    92 endmodule

    2.串并转换测试文件

     1 `timescale 1ns / 1ps
     2 
     3 ////////////////////////////////////////////////////////////////////////////////
     4 // Company: 
     5 // Engineer:
     6 //
     7 // Create Date:   22:02:53 04/14/2015
     8 // Design Name:   SerialToParallel
     9 // Module Name:   C:/Users/Administrator/Documents/Tencent Files/1577197070/FileRecv/SerialToParallel/TB_SerialToParallel.v
    10 // Project Name:  SerialToParallel
    11 // Target Device:  
    12 // Tool versions:  
    13 // Description: 
    14 //
    15 // Verilog Test Fixture created by ISE for module: SerialToParallel
    16 //
    17 // Dependencies:
    18 // 
    19 // Revision:
    20 // Revision 0.01 - File Created
    21 // Additional Comments:
    22 // 
    23 ////////////////////////////////////////////////////////////////////////////////
    24 
    25 module TB_SerialToParallel;
    26 
    27     // Inputs
    28     reg CLK;
    29     reg RSTn;
    30     reg Enable;
    31 
    32     // Outputs
    33     wire Ready;
    34     wire [7:0] Index;
    35     wire [7:0] ParallelData;
    36 
    37     // Instantiate the Unit Under Test (UUT)
    38     SerialToParallel uut (
    39         .CLK(CLK), 
    40         .RSTn(RSTn), 
    41         .Enable(Enable), 
    42         .DataIn(data), 
    43         .Ready(Ready), 
    44         .Index(Index), 
    45         .ParallelData(ParallelData)
    46     );
    47 
    48     initial begin
    49         // Initialize Inputs
    50         CLK = 0;
    51         RSTn = 0;
    52         Enable = 0;
    53 
    54         // Wait 100 ns for global reset to finish
    55         #100;RSTn = 1;Enable = 1;
    56         
    57         // Add stimulus here
    58         forever #5 CLK = ~CLK;
    59     end
    60     
    61     wire data;
    62     data_generator    unit1(
    63         .clock(CLK),
    64         .reset(RSTn),
    65         .data(data)
    66     );
    67     
    68       
    69 endmodule

    3.随机信号发生器(内含两个版本)

     1 `timescale 1ns / 1ps
     2 //////////////////////////////////////////////////////////////////////////////////
     3 // Company: 
     4 // Engineer: 
     5 // 
     6 // Create Date:    22:22:03 04/14/2015 
     7 // Design Name: 
     8 // Module Name:    data_generator 
     9 // Project Name: 
    10 // Target Devices: 
    11 // Tool versions: 
    12 // Description: 
    13 //
    14 // Dependencies: 
    15 //
    16 // Revision: 
    17 // Revision 0.01 - File Created
    18 // Additional Comments: 
    19 //
    20 //////////////////////////////////////////////////////////////////////////////////
    21 module data_generator(
    22 
    23     // Inputs
    24     input     clock,
    25     input     reset,
    26     
    27     // Outputs
    28     output    data
    29     );
    30     
    31     reg        data_temp;
    32     
    33     assign    data = data_temp;
    34     
    35     always@(posedge clock or negedge reset)
    36     if(!reset)
    37         data_temp<=1'b0;
    38     else
    39         data_temp<={$random} % 2;
    40     
    41 endmodule
    42 //////////////////////////////////////////////////////////////////////////////////
    43 //module data_generator(
    44 //
    45 //    // Inputs
    46 //    input     clock,
    47 //    input     reset,
    48 //    
    49 //    // Outputs
    50 //    output[7:0]        data
    51 //    );
    52 //    
    53 //    reg[7:0]            data_temp;
    54 //    
    55 //    assign    data = data_temp;
    56 //    
    57 //    always@(posedge clock or negedge reset)
    58 //    if(!reset)
    59 //        data_temp<=8'd0;
    60 //    else
    61 //        data_temp<={$random} % 256;
    62 //    
    63 //endmodule

     4.测试图

    从图中可以清晰看到,模块每采集8个串行数据执行一次输出,同时输出有效置1。

    5.应用

    以数字调制中的16QAM为例

    输入的信息每四位进行一次编码,实轴和虚轴分别代表调制后的同相分量与正交分量,除以1/sqrt(10)进行归一化,再用8位定点数表示。

    这样信息就被分成IM和RE两路。

    测试图:

    串并转换模块的Index[7:0]、Ready、ParallelData同步

    数据映射模块的IndexOut[7:0]、QAM_Ready、RE_TEMP、IM_TEMP同步,且比串并转换模块晚一个时钟。

    首先要每四位做一次串并转换,对原模板进行修改

     1 `timescale 1ns / 1ps
     2 //////////////////////////////////////////////////////////////////////////////////
     3 // Company: 
     4 // Engineer: 
     5 // 
     6 // Create Date:    20:30:15 04/14/2015 
     7 // Design Name: 
     8 // Module Name:    SerialToParallel 
     9 // Project Name: 
    10 // Target Devices: 
    11 // Tool versions: 
    12 // Description: 
    13 //
    14 // Dependencies: 
    15 //
    16 // Revision: 
    17 // Revision 0.01 - File Created
    18 // Additional Comments: 
    19 //
    20 //////////////////////////////////////////////////////////////////////////////////
    21 module SerialToParallel(
    22     input         CLK,
    23     input         RSTn,
    24     input         Enable,        
    25     input         DataIn,
    26     output reg    Ready,
    27     output[7:0]    Index,
    28     output[3:0] ParallelData
    29     );
    30     
    31     reg[3:0]    Data_Temp;
    32     reg[3:0]    counter;
    33     reg[3:0]    state;
    34     reg[7:0]    Index_Temp;
    35     
    36     assign    Index=Index_Temp;
    37     assign    ParallelData=Ready?Data_Temp:4'd0;
    38     
    39     ////////////////////////////////////////
    40     //state:
    41     //4'd0:复位 
    42     //        转换计数清零,输出计数清零,输出数据清零
    43     //4'd1:未复位,未使能
    44     //        转换计数清零,输出数据清零
    45     //4'd2:未复位,输入使能
    46     //
    47     
    48     always@(posedge CLK or negedge RSTn)
    49     if(!RSTn)
    50         begin
    51             state<=4'd0;        //复位
    52             Ready<=0;
    53             counter<=4'd0;
    54             Data_Temp<=4'd0;
    55             Index_Temp<=8'd0;
    56         end
    57     else
    58         begin
    59             case(state)
    60                 4'd0:
    61                 begin
    62                     if(!Enable)state<=4'd1;
    63                     else state<=4'd2;
    64                     Ready<=0;
    65                 end
    66                 4'd1:
    67                 begin
    68                     if(!Enable)state<=4'd1;
    69                     else state<=4'd2;
    70                     Ready<=0;
    71                     counter<=4'd0;
    72                     Data_Temp<=4'd0;
    73                 end
    74                 4'd2:
    75                 begin
    76                     if(!Enable)state<=4'd1;
    77                     else state<=4'd2;
    78                     case(counter)
    79                     4'd0:begin Data_Temp[0]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    80                     4'd1:begin Data_Temp[1]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    81                     4'd2:begin Data_Temp[2]<=DataIn;counter<=counter + 1'b1;Ready<=0;end
    82                     4'd3:begin Data_Temp[3]<=DataIn;counter<=4'd0;Index_Temp<=Index_Temp + 1'b1;Ready<=1'b1;end
    83                     endcase
    84                 end
    85             endcase
    86         end
    87 
    88 endmodule


    然后进行映射:

     1 `timescale 1ns / 1ps
     2 //////////////////////////////////////////////////////////////////////////////////
     3 // Company: 
     4 // Engineer: 
     5 // 
     6 // Create Date:    22:54:28 04/14/2015 
     7 // Design Name: 
     8 // Module Name:    dataout 
     9 // Project Name: 
    10 // Target Devices: 
    11 // Tool versions: 
    12 // Description: 
    13 //
    14 // Dependencies: 
    15 //
    16 // Revision: 
    17 // Revision 0.01 - File Created
    18 // Additional Comments: 
    19 //
    20 //////////////////////////////////////////////////////////////////////////////////
    21 module QAM16(
    22     
    23     // Inputs
    24     input             CLK,
    25     input             RSTn,
    26     input             Enable,    //输入数据有效
    27     input    [3:0]        Data,        //输入数据
    28     input    [7:0]        Index,    //输入数据索引
    29     
    30     // Outputs
    31     output reg    QAM_Ready,        //输出数据有效
    32     output reg    [7:0]    RE_TEMP,    //输出数据实部
    33     output reg    [7:0]    IM_TEMP,    //输出数据虚部
    34     output reg    [7:0]    IndexOut    //输出数据索引
    35     );
    36     
    37     always@(posedge CLK or negedge RSTn)
    38     if(!RSTn)
    39         begin
    40             RE_TEMP<=8'd0;
    41             IM_TEMP<=8'd0;
    42             QAM_Ready<=0;
    43             IndexOut<=8'd0;
    44         end
    45     else
    46         begin
    47             if(Enable)
    48                 begin    //数据映射
    49                     case(Data[1:0])
    50                     2'b00:RE_TEMP[7:0]<=8'b11000011;
    51                     2'b10:RE_TEMP[7:0]<=8'b11101100;
    52                     2'b01:RE_TEMP[7:0]<=8'b00111101;
    53                     2'b11:RE_TEMP[7:0]<=8'b00010100; 
    54                     endcase
    55                     case(Data[3:2])
    56                     2'b00:IM_TEMP[7:0]<=8'b11000011;
    57                     2'b10:IM_TEMP[7:0]<=8'b11101100;
    58                     2'b01:IM_TEMP[7:0]<=8'b00111101;
    59                     2'b11:IM_TEMP[7:0]<=8'b00010100;
    60                     endcase
    61                     IndexOut<=Index;
    62                     QAM_Ready<=1;
    63                 end
    64             else 
    65                 begin
    66                     RE_TEMP<=8'd0;
    67                     IM_TEMP<=8'd0;
    68                     QAM_Ready<=0;
    69                 end
    70         end
    71 
    72 endmodule

    测试

     1 `timescale 1ns / 1ps
     2 
     3 ////////////////////////////////////////////////////////////////////////////////
     4 // Company: 
     5 // Engineer:
     6 //
     7 // Create Date:   22:02:53 04/14/2015
     8 // Design Name:   SerialToParallel
     9 // Module Name:   C:/Users/Administrator/Documents/Tencent Files/1577197070/FileRecv/SerialToParallel/TB_SerialToParallel.v
    10 // Project Name:  SerialToParallel
    11 // Target Device:  
    12 // Tool versions:  
    13 // Description: 
    14 //
    15 // Verilog Test Fixture created by ISE for module: SerialToParallel
    16 //
    17 // Dependencies:
    18 // 
    19 // Revision:
    20 // Revision 0.01 - File Created
    21 // Additional Comments:
    22 // 
    23 ////////////////////////////////////////////////////////////////////////////////
    24 
    25 module TB_16QAM;
    26 
    27     // Inputs
    28     reg CLK;
    29     reg RSTn;
    30     reg Enable;
    31 
    32     // Outputs
    33     wire data;
    34     wire Ready;
    35     wire QAM_Ready;
    36     wire [7:0] Index;
    37     wire [3:0] ParallelData;
    38     wire [7:0]    RE_TEMP;
    39     wire [7:0]    IM_TEMP;
    40     wire [7:0]    IndexOut;
    41 
    42     // Instantiate the Unit Under Test (UUT)
    43     data_generator    uut1(
    44         .clock(CLK),
    45         .reset(RSTn),
    46         .data(data)
    47     );
    48     
    49     SerialToParallel uut2 (
    50         .CLK(CLK), 
    51         .RSTn(RSTn), 
    52         .Enable(Enable), 
    53         .DataIn(data), 
    54         .Ready(Ready), 
    55         .Index(Index), 
    56         .ParallelData(ParallelData)
    57     );
    58     QAM16 uut3 (
    59          .CLK(CLK), 
    60          .RSTn(RSTn), 
    61          .Enable(Ready), 
    62          .Data(ParallelData), 
    63          .Index(Index), 
    64          .RE_TEMP(RE_TEMP), 
    65          .IM_TEMP(IM_TEMP), 
    66          .IndexOut(IndexOut),
    67          .QAM_Ready(QAM_Ready)
    68     );
    69 
    70     initial begin
    71         // Initialize Inputs
    72         CLK = 0;
    73         RSTn = 0;
    74         Enable = 0;
    75 
    76         // Wait 100 ns for global reset to finish
    77         #100;RSTn = 1;Enable = 1;
    78         
    79         // Add stimulus here
    80         forever #5 CLK = ~CLK;
    81     end
    82         
    83 endmodule
  • 相关阅读:
    bootstrap图片上传控件 fileinput
    Redis学习总结(一)--Redis入门
    Spring学习之旅(十五)--SpringBoot
    Spring学习之旅(十四)--缓存
    Spring学习之旅(十三)--使用NoSQL数据库
    Spring学习之旅(十二)--持久化框架
    Spring学习之旅(十一)--JDBC
    Spring学习之旅(十)--MockMvc
    Spring学习之旅(九)--SpringMVC高级技术
    Spring学习之旅(八)--SpringMVC请求参数
  • 原文地址:https://www.cnblogs.com/nwpuxuezha/p/4427349.html
Copyright © 2020-2023  润新知