之前做LDPC编码器时,学习了一下异步FIFO的相关知识,主要参考了http://www.cnblogs.com/aslmer/p/6114216.html,并在此基础上根据项目需求,添加了一个读控制模块。因为后面编码模块的需要,因此fifo_in模块要求满足下面功能:

a、存储输入数据

b、当fifo中存储数据的个数达到x时,产生激励信号,并连续输出这x个数据

c、当后面编码模块处于编码过程中时,禁止数据输出

d、x是根据不同编码码率而确定的,因此要时常变化(这个功能时联合其他模块共同实现的)

1、fifo_in.v  是顶层模块,作用是将各个小模块例化联系起来。

输入信号encoding是由后面编码模块产生,表示是否在编码过程中。输入信号in_length输入的数就是个数要求x,由码率选择模块产生。

输出信号start_code是给编码模块的激励信号。输出信号rd_over表示当前一串数据已经输出完毕,主要用于给码率选择模块改变x的值时用。

  1. module fifo_in
  2. (
  3. //input
  4. input wr_clk,
  5. input encoding,
  6. input wr_rst_n,
  7. input wr_ask,
  8. input [:] wr_data,
  9. input rd_clk,
  10. input rd_rst_n,
  11. input [:] in_length,
  12. //output
  13. output wr_full,//写满
  14. output rd_empty,//读空
  15. output [:] rd_data,
  16. output rd_en,
  17. output start_code,
  18. output rd_over
  19. );
  20. wire wr_en;
  21. wire [:] wr_addr;
  22. wire [:] rd_addr;
  23. wire rd_ask;
  24.  
  25. assign wr_en =(wr_ask) && (!wr_full);
  26. fifo_in_control fifo_in_control
  27. (
  28. //input
  29. .wr_clk(wr_clk),
  30. .wr_rst_n(wr_rst_n),
  31. .wr_ask(wr_ask),
  32. //.wr_data(wr_data),
  33. .rd_clk(rd_clk),
  34. .rd_rst_n(rd_rst_n),
  35. .rd_ask(rd_ask),
  36. //output
  37. .wr_full(wr_full),//写满
  38. .rd_empty(rd_empty),//读空
  39. .wr_addr(wr_addr),
  40. .rd_addr(rd_addr)
  41. //output [2:0] rd_data
  42. );
  43. fifo_in_rd_control fifo_in_rd_control
  44. (
  45. //input
  46. .rd_clk(rd_clk),
  47. .rd_rst_n(rd_rst_n),
  48. .rd_addr(rd_addr),
  49. .wr_addr(wr_addr),
  50. .in_length(in_length),
  51. .encoding(encoding),
  52. //output
  53. .rd_ask(rd_ask),
  54. .start_code_1(start_code),
  55. .rd_en_1(rd_en),
  56. .rd_over(rd_over)
  57.  
  58. );
  59. fifo_in_mem fifo_in_mem (
  60. .data(wr_data),
  61. .rdaddress(rd_addr),
  62. .rdclock(rd_clk),
  63. .wraddress(wr_addr),
  64. .wrclock(wr_clk),
  65. .wren(wr_en),
  66. .q(rd_data)
  67. );
  68. endmodule

2、fifo_in_control.v 是异步fifo的主要程序,我从上面那个网址抄来的,网址内的讲解也非常清楚,使用格雷码来避免读写地址的混乱。

  1. module fifo_in_control
  2. (
  3. //input
  4. input wr_clk,
  5. input wr_rst_n,
  6. input wr_ask,
  7. //input [2:0] wr_data,
  8. input rd_clk,
  9. input rd_rst_n,
  10. input rd_ask,
  11. //output
  12. output reg wr_full,//写满
  13. output reg rd_empty,//读空
  14. output [:] wr_addr,
  15. output [:] rd_addr
  16. //output [2:0] rd_data
  17. );
  18.  
  19. reg [:] rd_proint_gray;//格雷码形式的写指针
  20. reg [:] rd_proint_gray_1;//格雷码形式的写指针_延时一个写时钟
  21. reg [:] rd_proint_gray_2;//格雷码形式的写指针_延时两个写时钟(同步到写时钟的读指针)
  22.  
  23. reg [:] wr_proint_gray;//格雷码形式的读指针
  24. reg [:] wr_proint_gray_1;//格雷码形式的读指针_延时一个读时钟
  25. reg [:] wr_proint_gray_2;//格雷码形式的读指针_延时两个读时钟(同步到读时钟的写指针)
  26.  
  27. reg [:] wr_proint_bin;//二进制形式的写指针
  28. wire [:] wr_proint_bin_next;
  29. wire [:] wr_proint_gray_next;
  30. wire wr_full_val;
  31.  
  32. reg [:] rd_proint_bin;//二进制形式的读指针
  33. wire [:] rd_proint_bin_next;
  34. wire [:] rd_proint_gray_next;
  35. wire rd_empty_val;
  36. //---------------------------------------------------------------------------------
  37. always @(posedge wr_clk or negedge wr_rst_n)//读指针同步到写时钟
  38. begin
  39. if (!wr_rst_n)
  40. begin
  41. rd_proint_gray_1 <= ;
  42. rd_proint_gray_2 <= ;
  43. end
  44. else
  45. begin
  46. rd_proint_gray_1 <= rd_proint_gray;
  47. rd_proint_gray_2 <= rd_proint_gray_1;
  48. end
  49. end
  50. //--------------------------------------------------------------------------------
  51. always @(posedge rd_clk or negedge rd_rst_n)//写指针同步到读时钟
  52. begin
  53. if (!rd_rst_n)
  54. begin
  55. wr_proint_gray_1 <= ;
  56. wr_proint_gray_2 <= ;
  57. end
  58. else
  59. begin
  60. wr_proint_gray_1 <= wr_proint_gray;
  61. wr_proint_gray_2 <= wr_proint_gray_1;
  62. end
  63. end
  64. //---------------------------------------------------------------------------------
  65. //写满判决
  66. always @(posedge wr_clk or negedge wr_rst_n)
  67. begin
  68. if (!wr_rst_n)
  69. {wr_proint_bin, wr_proint_gray} <= ;
  70. else
  71. {wr_proint_bin, wr_proint_gray} <= {wr_proint_bin_next, wr_proint_gray_next};
  72. end
  73.  
  74. // Memory write-address pointer (okay to use binary to address memory)
  75. assign wr_addr = wr_proint_bin[:];
  76. assign wr_proint_bin_next = wr_proint_bin + (wr_ask & ~wr_full);
  77. assign wr_proint_gray_next = (wr_proint_bin_next>>) ^ wr_proint_bin_next; //二进制转为格雷码
  78. assign wr_full_val = (wr_proint_gray_next=={~rd_proint_gray_2[:],rd_proint_gray_2[:]}); //当最高位和次高位不同其余位相同时则写指针超前于读指针一圈,即写满
  79.  
  80. always @(posedge wr_clk or negedge wr_rst_n)
  81. begin
  82. if (!wr_rst_n)
  83. wr_full <= 'b0;
  84. else
  85. wr_full <= wr_full_val;
  86. end
  87. //----------------------------------------------------------------------------------
  88. //读空判决
  89. always @(posedge rd_clk or negedge rd_rst_n)
  90. begin
  91. if (!rd_rst_n)
  92. begin
  93. rd_proint_bin <= ;
  94. rd_proint_gray <= ;
  95. end
  96. else
  97. begin
  98. rd_proint_bin <= rd_proint_bin_next; //直接作为存储实体的地址
  99. rd_proint_gray <= rd_proint_gray_next;
  100. end
  101. end
  102. // Memory read-address pointer (okay to use binary to address memory)
  103. assign rd_addr = rd_proint_bin[:]; //直接作为存储实体的地址
  104. assign rd_proint_bin_next = rd_proint_bin + (rd_ask & ~rd_empty);//不空且有读请求的时候读指针加1
  105. assign rd_proint_gray_next = (rd_proint_bin_next>>) ^ rd_proint_bin_next;//将二进制的读指针转为格雷码
  106. // FIFO empty when the next rptr == synchronized wptr or on reset
  107. assign rd_empty_val = (rd_proint_gray_next == wr_proint_gray_2); //当读指针等于同步后的写指针,则为空。
  108.  
  109. always @(posedge rd_clk or negedge rd_rst_n)
  110. begin
  111. if (!rd_rst_n)
  112. rd_empty <= 'b1;
  113. else
  114. rd_empty <= rd_empty_val;
  115. end
  116.  
  117. endmodule

3、fifo_in_rd_control.v 是fifo_in的读控制模块,状态机分为五个状态。数据length记录当前fifo中存储数据的个数,当其大于x(in_length)时,可以进行输出。当fifo中存储数据的个数一直大于x时,两串输出数据的间隔只有几个时钟周期,有时会造成encoding信号还没有生效,新的一串数据已经开始输出,因此设置delay状态,稍等几个周期,确定编码模块是否在工作。

  1. module fifo_in_rd_control
  2. (
  3. //input
  4. input rd_clk,
  5. input rd_rst_n,
  6. input [:] rd_addr,
  7. input [:] wr_addr,
  8. input [:] in_length,
  9. input encoding,
  10. //output
  11. output reg rd_ask,
  12. output reg start_code_1,
  13. output reg rd_en_1,
  14. output reg rd_over
  15. );
  16. reg [:] length;//当前fifo中存储数据的个数
  17. reg [:] state;
  18. reg [:] count;//计输出数据的个数
  19. // reg [9:0] in_length_next;
  20. //reg rd_over;
  21. reg start_code;
  22. reg rd_en;
  23. reg [:]i;//延时几个时钟
  24.  
  25. parameter hold = 'b00001;
  26. parameter delay = 'b00010;
  27. parameter start = 'b00100;
  28. parameter read = 'b01000;
  29. parameter over = 'b10000;
  30.  
  31. always @(posedge rd_clk or negedge rd_rst_n)
  32. begin
  33. start_code_1 <= start_code;
  34. rd_en_1 <= rd_en;
  35. end
  36. always @(posedge rd_clk or negedge rd_rst_n)
  37. begin
  38. if(!rd_rst_n)
  39. begin
  40. state <= hold;
  41. rd_ask <= ;
  42. start_code <= ;
  43. rd_en <= ;
  44. rd_over <= ;
  45. end
  46. else if(encoding)
  47. begin
  48. state <= hold;
  49. rd_ask <= ;
  50. start_code <= ;
  51. rd_en <= ;
  52. rd_over <= ;
  53. end
  54. else
  55. case(state)
  56. hold:
  57. if(in_length <= length)
  58. begin
  59. state <= delay;
  60. rd_over <= ;
  61. i <= 'b00;
  62. end
  63. else
  64. begin
  65. state <= hold;
  66. rd_over <= ;
  67. end
  68. delay:
  69. if(i >= )
  70. state <= start;
  71. else
  72. i <= i + ;
  73. start:
  74. begin
  75. state <= read;
  76. start_code <= ;
  77. end
  78. read:
  79. if(count == in_length-)
  80. begin
  81. state <= over;
  82. rd_en <= ;
  83. rd_ask <= ;
  84. end
  85. else
  86. begin
  87. state <= read;
  88. rd_en <= ;
  89. rd_ask <= ;
  90. start_code <= ;
  91. end
  92. over:
  93. begin
  94. state <= hold;
  95. rd_over <= ;
  96. end
  97. default:state <= hold;
  98. endcase
  99. end
  100.  
  101. always @(posedge rd_clk or negedge rd_rst_n)
  102. begin
  103. if(!rd_rst_n)
  104. length <= ;
  105. else if(wr_addr < rd_addr)
  106. length <= ('d1023 ^ rd_addr) + wr_addr + 10'd1;
  107. else
  108. length <= wr_addr - rd_addr;
  109. end
  110.  
  111. always @(posedge rd_clk or negedge rd_rst_n)
  112. begin
  113. if(!rd_rst_n)
  114. count <= 'd0;
  115. else if(rd_en)
  116. count <= count + 'd1;
  117. else if(start_code)
  118. count <= 'd0;
  119. else
  120. count <= count;
  121. end
  122.  
  123. // always @(posedge rd_clk or negedge rd_rst_n)
  124. // begin
  125. // if(!rd_rst_n)
  126. // in_length_next <= in_length;
  127. // else if(rd_over)
  128. // in_length_next <= in_length;
  129. // else
  130. // in_length_next <= in_length_next;
  131. // end
  132.  
  133. endmodule

4、fifo_in_mem.v 生成存储实体,FIFO 的本质是RAM,因此在设计存储实体的时候有两种方法:用数组存储数据或者调用RAM的IP核。我是采用IP核的方法。

  1. // megafunction wizard: %RAM: 2-PORT%
  2. // GENERATION: STANDARD
  3. // VERSION: WM1.0
  4. // MODULE: altsyncram
  5.  
  6. // ============================================================
  7. // File Name: fifo_in_mem.v
  8. // Megafunction Name(s):
  9. // altsyncram
  10. //
  11. // Simulation Library Files(s):
  12. // altera_mf
  13. // ============================================================
  14. // ************************************************************
  15. // THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
  16. //
  17. // 17.1.0 Build 590 10/25/2017 SJ Standard Edition
  18. // ************************************************************
  19.  
  20. //Copyright (C) 2017 Intel Corporation. All rights reserved.
  21. //Your use of Intel Corporation's design tools, logic functions
  22. //and other software and tools, and its AMPP partner logic
  23. //functions, and any output files from any of the foregoing
  24. //(including device programming or simulation files), and any
  25. //associated documentation or information are expressly subject
  26. //to the terms and conditions of the Intel Program License
  27. //Subscription Agreement, the Intel Quartus Prime License Agreement,
  28. //the Intel FPGA IP License Agreement, or other applicable license
  29. //agreement, including, without limitation, that your use is for
  30. //the sole purpose of programming logic devices manufactured by
  31. //Intel and sold by Intel or its authorized distributors. Please
  32. //refer to the applicable agreement for further details.
  33.  
  34. // synopsys translate_off
  35. `timescale ps / ps
  36. // synopsys translate_on
  37. module fifo_in_mem (
  38. data,
  39. rdaddress,
  40. rdclock,
  41. wraddress,
  42. wrclock,
  43. wren,
  44. q);
  45.  
  46. input [:] data;
  47. input [:] rdaddress;
  48. input rdclock;
  49. input [:] wraddress;
  50. input wrclock;
  51. input wren;
  52. output [:] q;
  53. `ifndef ALTERA_RESERVED_QIS
  54. // synopsys translate_off
  55. `endif
  56. tri1 wrclock;
  57. tri0 wren;
  58. `ifndef ALTERA_RESERVED_QIS
  59. // synopsys translate_on
  60. `endif
  61.  
  62. wire [:] sub_wire0;
  63. wire [:] q = sub_wire0[:];
  64.  
  65. altsyncram altsyncram_component (
  66. .address_a (wraddress),
  67. .address_b (rdaddress),
  68. .clock0 (wrclock),
  69. .clock1 (rdclock),
  70. .data_a (data),
  71. .wren_a (wren),
  72. .q_b (sub_wire0),
  73. .aclr0 ('b0),
  74. .aclr1 ('b0),
  75. .addressstall_a ('b0),
  76. .addressstall_b ('b0),
  77. .byteena_a ('b1),
  78. .byteena_b ('b1),
  79. .clocken0 ('b1),
  80. .clocken1 ('b1),
  81. .clocken2 ('b1),
  82. .clocken3 ('b1),
  83. .data_b ({{'b1}}),
  84. .eccstatus (),
  85. .q_a (),
  86. .rden_a ('b1),
  87. .rden_b ('b1),
  88. .wren_b ('b0));
  89. defparam
  90. altsyncram_component.address_aclr_b = "NONE",
  91. altsyncram_component.address_reg_b = "CLOCK1",
  92. altsyncram_component.clock_enable_input_a = "BYPASS",
  93. altsyncram_component.clock_enable_input_b = "BYPASS",
  94. altsyncram_component.clock_enable_output_b = "BYPASS",
  95. altsyncram_component.intended_device_family = "Cyclone V",
  96. altsyncram_component.lpm_type = "altsyncram",
  97. altsyncram_component.numwords_a = ,
  98. altsyncram_component.numwords_b = ,
  99. altsyncram_component.operation_mode = "DUAL_PORT",
  100. altsyncram_component.outdata_aclr_b = "NONE",
  101. altsyncram_component.outdata_reg_b = "CLOCK1",
  102. altsyncram_component.power_up_uninitialized = "FALSE",
  103. altsyncram_component.widthad_a = ,
  104. altsyncram_component.widthad_b = ,
  105. altsyncram_component.width_a = ,
  106. altsyncram_component.width_b = ,
  107. altsyncram_component.width_byteena_a = ;
  108.  
  109. endmodule
  110.  
  111. // ============================================================
  112. // CNX file retrieval info
  113. // ============================================================
  114. // Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0"
  115. // Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0"
  116. // Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0"
  117. // Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0"
  118. // Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0"
  119. // Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0"
  120. // Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8"
  121. // Retrieval info: PRIVATE: BlankMemory NUMERIC "1"
  122. // Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0"
  123. // Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0"
  124. // Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0"
  125. // Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0"
  126. // Retrieval info: PRIVATE: CLRdata NUMERIC "0"
  127. // Retrieval info: PRIVATE: CLRq NUMERIC "0"
  128. // Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0"
  129. // Retrieval info: PRIVATE: CLRrren NUMERIC "0"
  130. // Retrieval info: PRIVATE: CLRwraddress NUMERIC "0"
  131. // Retrieval info: PRIVATE: CLRwren NUMERIC "0"
  132. // Retrieval info: PRIVATE: Clock NUMERIC "1"
  133. // Retrieval info: PRIVATE: Clock_A NUMERIC "0"
  134. // Retrieval info: PRIVATE: Clock_B NUMERIC "0"
  135. // Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0"
  136. // Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0"
  137. // Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "0"
  138. // Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_B"
  139. // Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0"
  140. // Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Cyclone V"
  141. // Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "0"
  142. // Retrieval info: PRIVATE: JTAG_ID STRING "NONE"
  143. // Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0"
  144. // Retrieval info: PRIVATE: MEMSIZE NUMERIC "3072"
  145. // Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0"
  146. // Retrieval info: PRIVATE: MIFfilename STRING ""
  147. // Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "2"
  148. // Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0"
  149. // Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "1"
  150. // Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0"
  151. // Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2"
  152. // Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_A NUMERIC "3"
  153. // Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_PORT_B NUMERIC "3"
  154. // Retrieval info: PRIVATE: REGdata NUMERIC "1"
  155. // Retrieval info: PRIVATE: REGq NUMERIC "0"
  156. // Retrieval info: PRIVATE: REGrdaddress NUMERIC "1"
  157. // Retrieval info: PRIVATE: REGrren NUMERIC "1"
  158. // Retrieval info: PRIVATE: REGwraddress NUMERIC "1"
  159. // Retrieval info: PRIVATE: REGwren NUMERIC "1"
  160. // Retrieval info: PRIVATE: SYNTH_WRAPPER_GEN_POSTFIX STRING "0"
  161. // Retrieval info: PRIVATE: USE_DIFF_CLKEN NUMERIC "0"
  162. // Retrieval info: PRIVATE: UseDPRAM NUMERIC "1"
  163. // Retrieval info: PRIVATE: VarWidth NUMERIC "0"
  164. // Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "3"
  165. // Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "3"
  166. // Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "3"
  167. // Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "3"
  168. // Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0"
  169. // Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "0"
  170. // Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0"
  171. // Retrieval info: PRIVATE: enable NUMERIC "0"
  172. // Retrieval info: PRIVATE: rden NUMERIC "0"
  173. // Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all
  174. // Retrieval info: CONSTANT: ADDRESS_ACLR_B STRING "NONE"
  175. // Retrieval info: CONSTANT: ADDRESS_REG_B STRING "CLOCK1"
  176. // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_A STRING "BYPASS"
  177. // Retrieval info: CONSTANT: CLOCK_ENABLE_INPUT_B STRING "BYPASS"
  178. // Retrieval info: CONSTANT: CLOCK_ENABLE_OUTPUT_B STRING "BYPASS"
  179. // Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Cyclone V"
  180. // Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram"
  181. // Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "1024"
  182. // Retrieval info: CONSTANT: NUMWORDS_B NUMERIC "1024"
  183. // Retrieval info: CONSTANT: OPERATION_MODE STRING "DUAL_PORT"
  184. // Retrieval info: CONSTANT: OUTDATA_ACLR_B STRING "NONE"
  185. // Retrieval info: CONSTANT: OUTDATA_REG_B STRING "CLOCK1"
  186. // Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE"
  187. // Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "10"
  188. // Retrieval info: CONSTANT: WIDTHAD_B NUMERIC "10"
  189. // Retrieval info: CONSTANT: WIDTH_A NUMERIC "3"
  190. // Retrieval info: CONSTANT: WIDTH_B NUMERIC "3"
  191. // Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1"
  192. // Retrieval info: USED_PORT: data 0 0 3 0 INPUT NODEFVAL "data[2..0]"
  193. // Retrieval info: USED_PORT: q 0 0 3 0 OUTPUT NODEFVAL "q[2..0]"
  194. // Retrieval info: USED_PORT: rdaddress 0 0 10 0 INPUT NODEFVAL "rdaddress[9..0]"
  195. // Retrieval info: USED_PORT: rdclock 0 0 0 0 INPUT NODEFVAL "rdclock"
  196. // Retrieval info: USED_PORT: wraddress 0 0 10 0 INPUT NODEFVAL "wraddress[9..0]"
  197. // Retrieval info: USED_PORT: wrclock 0 0 0 0 INPUT VCC "wrclock"
  198. // Retrieval info: USED_PORT: wren 0 0 0 0 INPUT GND "wren"
  199. // Retrieval info: CONNECT: @address_a 0 0 10 0 wraddress 0 0 10 0
  200. // Retrieval info: CONNECT: @address_b 0 0 10 0 rdaddress 0 0 10 0
  201. // Retrieval info: CONNECT: @clock0 0 0 0 0 wrclock 0 0 0 0
  202. // Retrieval info: CONNECT: @clock1 0 0 0 0 rdclock 0 0 0 0
  203. // Retrieval info: CONNECT: @data_a 0 0 3 0 data 0 0 3 0
  204. // Retrieval info: CONNECT: @wren_a 0 0 0 0 wren 0 0 0 0
  205. // Retrieval info: CONNECT: q 0 0 3 0 @q_b 0 0 3 0
  206. // Retrieval info: GEN_FILE: TYPE_NORMAL fifo_in_mem.v TRUE
  207. // Retrieval info: GEN_FILE: TYPE_NORMAL fifo_in_mem.inc FALSE
  208. // Retrieval info: GEN_FILE: TYPE_NORMAL fifo_in_mem.cmp FALSE
  209. // Retrieval info: GEN_FILE: TYPE_NORMAL fifo_in_mem.bsf FALSE
  210. // Retrieval info: GEN_FILE: TYPE_NORMAL fifo_in_mem_inst.v FALSE
  211. // Retrieval info: GEN_FILE: TYPE_NORMAL fifo_in_mem_bb.v FALSE
  212. // Retrieval info: LIB_FILE: altera_mf

5、fifo_in_vlg_tst.vt  测试文件

  1. `timescale ps/ ps
  2. module fifo_in_vlg_tst();
  3.  
  4. // test vector input registers
  5. reg [:] in_length;
  6. reg rd_clk;
  7. reg rd_rst_n;
  8. reg wr_ask;
  9. reg wr_clk;
  10. reg [:] wr_data;
  11. reg wr_rst_n;
  12. reg encoding;
  13. // wires
  14. wire [:] rd_data;
  15. wire rd_empty;
  16. wire rd_en;
  17. wire start_code;
  18. wire wr_full;
  19.  
  20. //malv 1/2
  21. reg [:] din_1_2_1;
  22. reg [:] din_1_2_2;
  23. //malv 2/3
  24. reg [:] din_2_3_1;
  25. reg [:] din_2_3_2;
  26. //malv 3/4
  27. reg [:] din_3_4_1;
  28. reg [:] din_3_4_2;
  29.  
  30. reg [:] din;
  31.  
  32. integer i;
  33. // assign statements (if any)
  34. fifo_in i1 (
  35. // port map - connection between master ports and signals/registers
  36. .in_length(in_length),
  37. .rd_clk(rd_clk),
  38. .rd_data(rd_data),
  39. .rd_empty(rd_empty),
  40. .rd_en(rd_en),
  41. .rd_rst_n(rd_rst_n),
  42. .encoding(encoding),
  43. .start_code(start_code),
  44. .wr_ask(wr_ask),
  45. .wr_clk(wr_clk),
  46. .wr_data(wr_data),
  47. .wr_full(wr_full),
  48. .wr_rst_n(wr_rst_n)
  49. );
  50. initial
  51. begin
  52. din_1_2_1= 'O 216071251457553141656632576654636070430546464764636272066726436705132675575435232347124324703044614365222721255502724213676021274561705551344656470423514271071110356653574261134400253673045231;
  53. din_1_2_2= 'O 734100661755703340504534153032144316624677316012644740643223101214666566170511214734453676261445357016337671034473372575240732732041042256277164745532035241257613727416542012571673163075070075;
  54.  
  55. din = 'o 216071251457553141656632576654636070430546464764636272066726436705132675575435232347124324703044614365222721255502724213676021274561705551344656470423514271071110356653574261134400253673045231542501077035264326753724722702415645614046732574710233250322042102460716671431441473530262042546610650744466305262611705533733122712351603065154647323273235316421143506516144106630415427670155643465425347677600020324722621463553370234733536333100716567137573041454431304700710617024455316156070660472646602537542273606077401560672521652430032221351533114247557647027635331303274633674616747411356624001531310647546770647436137465415055577647400636145042031011105245343036621453170011440755067766413107222350646230152707457233660120421175370554142117010307102307220204650067406225005445562543062450143765000675150052554515760225462106134153160214030062473563507126363205334026511003554051101112212754110754214712305373413166252464223324533002257731665505310611574517450650424331207571764326106555336266645730652715431031526541727120510525350765634442131670406707056477511100472377576251254346444405727273311256506760355125341166701031700462121475030437637137754734100661755703340504534153032144316624677316012644740643223101214666566170511214734453676261445357016337671034473372575240732732041042256277164745532035241257613727416542012571673163075070075245625704322671617635362047135076413476753731354677470024474345061322512112733173643763673247535744201030750013105263300041667311462357154373154267711040374213703605721574716231645607365613476744607305114223334110261556622426642513347671406467730411205542647724246516035625711122704161472013217573704617664621246236471651334606623455633746244704407736142361232671153775635747535713735775004475542740540721021502273646076032514443043033465601376320541316270654550702170455606451457300565274701676216621266442563332577525101140657357427027220712734450406261470005406400160110655754767533701340570327421466614606710363341164260352347602363143776557020642142000303720472010535545757310525545433730156716434355206361077760474607743250274332774733116546441410541354110331500770361665037535147625270260465132341751476532412776714575356407040361753126054573276304142254615065707442061247471350536327530550073001734307224325742130741406344520305075741267260435203513562;
  56.  
  57. din_2_3_1= 'O 542501077035264326753724722702415645614046732574710233250322042102460716671431441473530262042546610650744466305262611705533733122712351603065154647323273235316421143506516144106630415427670155643465425347677600020324722621463553370234733536333100716567137573041454431304700710617024455316156070660472646602537542273606077401560672521652430032221351533114247557647027635331303274633674;
  58. din_2_3_2= 'O 754767533701340570327421466614606710363341164260352347602363143776557020642142000303720472010535545757310525545433730156716434355206361077760474607743250274332774733116546441410541354110331500770361665037535147625270260465132341751476532412776714575356407040361753126054573276304142254615065707442061247471350536327530550073001734307224325742130741406344520305075741267260435203513562;
  59.  
  60. din_3_4_1= 'O 616747411356624001531310647546770647436137465415055577647400636145042031011105245343036621453170011440755067766413107222350646230152707457233660120421175370554142117010307102307220204650067406225005445562543062450143765000675150052554515760225462106134153160214030062473563507126363205334026511003554051101112212754110754214712305373413166252464223324533002257731665505310611574517450650424331207571764326106555336266645730652715431031526541727120510525350765634442131670406707056477511100472377576251254346444405727273311256506760355125341166701031700462121475030437637137754;
  61. din_3_4_2= 'O 245625704322671617635362047135076413476753731354677470024474345061322512112733173643763673247535744201030750013105263300041667311462357154373154267711040374213703605721574716231645607365613476744607305114223334110261556622426642513347671406467730411205542647724246516035625711122704161472013217573704617664621246236471651334606623455633746244704407736142361232671153775635747535713735775004475542740540721021502273646076032514443043033465601376320541316270654550702170455606451457300565274701676216621266442563332577525101140657357427027220712734450406261470005406400160110655;
  62.  
  63. in_length = 'd576;
  64. encoding = ;
  65. rd_clk = ;
  66. wr_clk = ;
  67. rd_rst_n = ;
  68. wr_rst_n = ;
  69. wr_ask = ;
  70. wr_data = 'd0;
  71. #
  72. rd_rst_n = ;
  73. wr_rst_n = ;
  74. #
  75. rd_rst_n = ;
  76. wr_rst_n = ;
  77. // #2000
  78. // in_length = 10'd384;
  79. end
  80. // initial
  81. // begin
  82. // #63950
  83. // encoding = 1;
  84. // #5000
  85. // encoding = 0;
  86. // end
  87. // initial
  88. // begin
  89. // #30000
  90. // in_length = 10'd576;
  91. // end
  92. // initial
  93. // begin
  94. // #60000
  95. // in_length = 10'd192;
  96. // end
  97. // initial
  98. // begin
  99. // #83000
  100. // in_length = 10'd576;
  101. // end
  102.  
  103. always # rd_clk <= ~rd_clk;
  104. always # wr_clk <= ~wr_clk;
  105.  
  106. initial
  107. begin
  108. #
  109. for(i = ; i >=; i = i-)
  110. begin
  111. wr_data[] <= din[i];
  112. wr_data[] <= din[i-];
  113. wr_data[] <= din[i-];
  114. #;
  115. end
  116. end
  117.  
  118. always @ (i)
  119. begin
  120. if (i < )
  121. wr_ask = ;
  122. else
  123. wr_ask = ;
  124. end
  125.  
  126. endmodule

仿真结果

异步fifo with 读控制的更多相关文章

  1. 【iCore、iCore2、iBoard例程】【异步FIFO跨时钟域通信(通过ARM 读FPGA FIFO)】

    欢迎访问电子工程师学堂,以便了解更多内容:http://www.eeschool.org 一.本实验基于iCore2 完成,通过简单改动,即可用在 iCore 核心板.iBoard 电子学堂上. iC ...

  2. 异步fifo的设计

    本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据)           ...

  3. Verilog设计异步FIFO

    转自http://ninghechuan.com 异步FIFO有两个异步时钟,一个端口写入数据,一个端口读出数据.通常被用于数据的跨时钟域的传输. 同步FIFO的设计.一个时钟控制一个计数器,计数器增 ...

  4. 异步FIFO跨时钟域亚稳态如何解决?

    跨时钟域的问题:前一篇已经提到要通过比较读写指针来判断产生读空和写满信号,但是读指针是属于读时钟域的,写指针是属于写时钟域的,而异步FIFO的读写时钟域不同,是异步的,要是将读时钟域的读指针与写时钟域 ...

  5. 异步fifo的读写

    这里不讨论异步fifo是如何实现的,而是在实现fifo的前提下,对fifo的读写. 现在遇到的问题是:总线的数据不能写入fifo中,但是地址能加一. 代码如下: if( !fifo_tx_full & ...

  6. 异步fifo的设计(FPGA)

    本文首先对异步 FIFO 设计的重点难点进行分析 最后给出详细代码 一.FIFO简单讲解 FIFO的本质是RAM, 先进先出 重要参数:fifo深度(简单来说就是需要存多少个数据)           ...

  7. 同步fifo与异步fifo

    参考以下帖子: https://blog.csdn.net/hengzo/article/details/49683707 https://blog.csdn.net/Times_poem/artic ...

  8. 异步FIFO总结+Verilog实现

    异步FIFO简介 异步FIFO(First In First Out)可以很好解决多比特数据跨时钟域的数据传输与同步问题.异步FIFO的作用就像一个蓄水池,用于调节上下游水量. FIFO FIFO是一 ...

  9. 异步FIFO为什么用格雷码

    异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理,将写地址同步到读时钟域再和读地址比较进行FIFO空状态判断(同步后的写地址一定是小于 ...

随机推荐

  1. CSS深入理解之overflow(HTML/CSS)

    简介 overflow看上去其貌不扬,其中蕴含的知识点还是很多的,有很多鲜为人知的特性表现. overflow基本属性值 1.visible(默认) 2.hidden 3.scroll 4.auto ...

  2. JQuery this和$(this)的区别

    this其实是一个Html 元素. $this 只是个变量名,加$是为说明其是个jquery对象. 而$(this)是个转换,将this表示的dom对象转为jquery对象,这样就可以使用jquery ...

  3. map合并,相同键对应的值相加

    最近在做统计钱的计算时遇到的一个需求,需要将一个大类别下的每一种钱进行特定的运算然后获得六年的钱,最后将这些钱按照年份进行汇总,获得总得大类型的六年的钱,在这个过程中采用了这种方法,每次算得钱放在ma ...

  4. session 之session混乱解决方法(转)

    知道了session混乱产生的原因之后,也就知道了问题的根源.同时也引出了很多的问题: 1.如何记录住在线人员(这里只有帐号的系统用户,不包括访客): 2.如何限制同一个帐号在同一时间段内只能够登陆一 ...

  5. tomcat idea optinos

    -server -XX:PermSize=128M -XX:MaxPermSize=256m -Xms512m -Xmx1024m

  6. [翻译] DBCamera 轻量级定制摄像头

    DBCamera 轻量级定制摄像头 https://github.com/danielebogo/DBCamera DBCamera is a simple custom camera with AV ...

  7. Linux通过docker安装运行酷Q--用QQ骰子君进行跑团

    Linux通过docker安装运行酷Q 文:铁乐与猫 需求:和小伙伴周末进行愉快的TRPG跑团,需要在QQ讨论组上加了qq小号后,将qq小号用酷Q配合投骰的应用变成骰子君. 限制:我个人的云计算服务器 ...

  8. PHP设计模式系列 - 单例

    单例模式 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景 例如数据库实例,一般都会走单例模式. 单例模式可以减少类的实例化 代码:来源InitPHP框架,先检测类有 ...

  9. DA-GAN技术【简介】【机器通过文字描述创造图像】

    [题外话:今天上课我做了一个关于DA-GAN技术的ppt演讲,写一点东西留念一下...] 转载请注明出处:https://www.cnblogs.com/GraceSkyer/p/9107471.ht ...

  10. yii在哪些情况下可以加载yiilite.php?

    yii权威指南上说,在开启apc缓存的情况下,可以加载yiilite.php提升性能.我有以下几点疑问: 1.开启apc缓存的情况下,引入yiilite.php能提升性能的原因是因为缓存了opcode ...