wpulse.v.txt
上传用户:saul_905
上传日期:2013-11-27
资源大小:184k
文件大小:4k
源码类别:

VHDL/FPGA/Verilog

开发平台:

Visual C++

  1. //
  2. // 
  3. //  This circuit generates WE pulses.  For example, if you have a chip that
  4. //  needs to access an asynchronous SRAM in a single cycle and you wanted
  5. //  generate the WE pulse synchronous with your system clock.
  6. //
  7. //  Every clk cycle, generate an active
  8. //  low WE pulse.  The delay from the clk rising edge to the falling edge of
  9. //  we is based on abits setting, which affects delay taps, etc.  Likewise,
  10. //  bbits controls the following rising edge of we.  The module contains
  11. //  two flip flops that generate two opposite poraity toggling levels.
  12. //  A delay chain is attached to each of these outputs.  The abits and bbits
  13. //  get the desired tap, and the final two delayed signals are XORed together
  14. //  to get the final we.  None of this is very tuned, you would look at your
  15. //  cycle time and pick a delay chain that makes sense for that.  But, this
  16. //  shows the effect.
  17. //
  18. //  The we pulse always occurs.  You will probably want to combine this with
  19. //  you write_enable signal.  This sort of circuit is, of course, highly dependent
  20. //  on post-layout timing, etc.  but that's why its programable.  You probably
  21. //  want more taps, too..
  22. //
  23. //
  24. module wpulse (
  25.    reset,
  26.    clk,
  27.    abits,
  28.    bbits,
  29.    we
  30. );
  31. input clk;
  32. input reset;
  33. input [3:0] abits; // bits to select which delay tap to use for first edge
  34. input [3:0] bbits; // bits to select which delay tap to use for pulse width
  35. output we;
  36. reg  p1, p2;
  37. wire adel1out;
  38. wire adel2out;
  39. wire adel3out;
  40. wire adel4out;
  41. wire bdel1out;
  42. wire bdel2out;
  43. wire bdel3out;
  44. wire bdel4out;
  45. wire adelout;
  46. wire bdelout;
  47. // 2 flip-flops that are opposite polarity.  Each flop toggles
  48. // every cycles.
  49. //
  50. always @(posedge clk)
  51.    p1 <= (reset) | (~reset & ~p1); // reset to 1
  52. always @(posedge clk)
  53.    p2 <= (~reset & ~p2);  // reset to 0
  54. // Delay chain off of the p1 flop.   
  55. delay4 adel1 (.a(p1), .z(adel1out));
  56. delay4 adel2 (.a(adel1out), .z(adel2out));
  57. delay4 adel3 (.a(adel2out), .z(adel3out));
  58. delay4 adel4 (.a(adel3out), .z(adel4out));
  59. // Delay chain off of the p2 flop.
  60. delay4 bdel1 (.a(p2), .z(bdel1out));
  61. delay4 bdel2 (.a(bdel1out), .z(bdel2out));
  62. delay4 bdel3 (.a(bdel2out), .z(bdel3out));
  63. delay4 bdel4 (.a(bdel3out), .z(bdel4out));
  64. // Select the tap of the p1 and p2 delay chains we want based on abits
  65. assign adelout = abits[3] & adel1out | 
  66. abits[2] & adel2out | 
  67. abits[1] & adel3out |
  68. abits[0] & adel4out;
  69. assign bdelout = bbits[3] & bdel1out | 
  70. bbits[2] & bdel2out | 
  71. bbits[1] & bdel3out |
  72. bbits[0] & bdel4out;
  73. // Final we pulse is just the XOR of the two chains.  
  74. assign we = adelout ^ bdelout;
  75. endmodule
  76. // This is our delay cell.  Pick whatever cell makes sense from your library.
  77. module delay4 (a, z);
  78. input a;
  79. output z;
  80. reg z;
  81. always @(a)
  82.   z = #4 a;
  83. endmodule
  84. // synopsys translate_off
  85. module testwpulse;
  86. reg clk;
  87. reg reset;
  88. reg [3:0] abits; // bits to select which delay tap to use for first edge
  89. reg [3:0] bbits; // bits to select which delay tap to use for pulse width
  90. wire we;
  91. wpulse wpulse_inst (
  92.    .reset (reset),
  93.    .clk (clk),
  94.    .abits (abits),
  95.    .bbits (bbits),
  96.    .we (we)
  97. );
  98. initial begin
  99.    abits = 4'b1000; // Shortest pulse, earliest in cycle.
  100.    bbits = 4'b0100;
  101.    #200;
  102.    abits = 4'b0010; // Shortest pulse, latest in the cycle.
  103.    bbits = 4'b0001;
  104.    #200;
  105.    abits = 4'b0100; // Shortest pulse, middle of the cycle.
  106.    bbits = 4'b0010;
  107.    #200;
  108.    abits = 4'b1000; // Longest cycle
  109.    bbits = 4'b0001;
  110.    #200;
  111.    abits = 4'b1000; // Early in cycle, but not quite the longest.
  112.    bbits = 4'b0010;
  113.    #200;
  114.    $finish;
  115. end
  116. // Reset
  117. initial begin
  118.    reset = 0;
  119.    #5 reset = 1;
  120.    #100 reset = 0;
  121. end
  122.    
  123. // Generate the 50MHz clock
  124. initial begin
  125.    clk = 0;
  126.    forever begin
  127.       #10 clk = 1;
  128.       #10 clk = 0;
  129.    end
  130. end
  131. `define WAVES
  132. `ifdef WAVES
  133. initial begin
  134.    $dumpfile ("wpulse.vcd");
  135.    $dumpvars (0,testwpulse);   
  136. end
  137. `endif
  138. endmodule
  139. // synopsys translate_on