source: trunk/MultiChannelUSB/histogram.v@ 88

Last change on this file since 88 was 88, checked in by demin, 15 years ago

fix memory read timing

File size: 3.0 KB
RevLine 
[27]1module histogram
[72]2 #(
3 parameter W = 32 // bin resolution
4 )
[27]5 (
6 input wire clk, reset,
7 input wire data_ready,
8 input wire [11:0] data, address,
[72]9 output wire [W-1:0] q
[27]10 );
11
12 // signal declaration
13 reg [3:0] state_reg, state_next;
14 reg wren_reg, wren_next;
15 reg [11:0] addr_reg, addr_next;
[72]16 reg [W-1:0] data_reg, data_next;
[27]17
[72]18 wire [W-1:0] q_a_wire, q_b_wire;
[27]19
[47]20 altsyncram #(
21 .address_reg_b("CLOCK0"),
22 .clock_enable_input_a("BYPASS"),
23 .clock_enable_input_b("BYPASS"),
24 .clock_enable_output_a("BYPASS"),
25 .clock_enable_output_b("BYPASS"),
26 .indata_reg_b("CLOCK0"),
27 .intended_device_family("Cyclone III"),
28 .lpm_type("altsyncram"),
29 .numwords_a(4096),
30 .numwords_b(4096),
31 .operation_mode("BIDIR_DUAL_PORT"),
32 .outdata_aclr_a("NONE"),
33 .outdata_aclr_b("NONE"),
[84]34 .outdata_reg_a("CLOCK0"),
35 .outdata_reg_b("CLOCK0"),
[47]36 .power_up_uninitialized("FALSE"),
37 .read_during_write_mode_mixed_ports("OLD_DATA"),
38 .widthad_a(12),
39 .widthad_b(12),
[72]40 .width_a(W),
41 .width_b(W),
[47]42 .width_byteena_a(1),
43 .width_byteena_b(1),
[51]44 .wrcontrol_wraddress_reg_b("CLOCK0")) hst_ram_unit(
45 .wren_a(wren_reg),
[52]46 .clock0(clk),
[51]47 .wren_b(1'b0),
[84]48 .address_a(addr_reg),
[51]49 .address_b(address),
[84]50 .data_a(data_reg),
[51]51 .data_b(),
52 .q_a(q_a_wire),
53 .q_b(q_b_wire),
54 .aclr0(1'b0),
55 .aclr1(1'b0),
56 .addressstall_a(1'b0),
57 .addressstall_b(1'b0),
58 .byteena_a(1'b1),
59 .byteena_b(1'b1),
60 .clock1(1'b1),
61 .clocken0(1'b1),
62 .clocken1(1'b1),
63 .clocken2(1'b1),
64 .clocken3(1'b1),
65 .eccstatus(),
66 .rden_a(1'b1),
67 .rden_b(1'b1));
[27]68
69 // body
70 always @(posedge clk)
71 begin
72 if (reset)
73 begin
[51]74 wren_reg <= 1'b1;
75 addr_reg <= 12'd0;
[70]76 data_reg <= 32'd0;
[27]77 state_reg <= 4'b1;
78 end
79 else
80 begin
81 wren_reg <= wren_next;
82 addr_reg <= addr_next;
83 data_reg <= data_next;
[51]84 state_reg <= state_next;
[27]85 end
86 end
87
88 always @*
89 begin
90 wren_next = wren_reg;
91 addr_next = addr_reg;
92 data_next = data_reg;
[51]93 state_next = state_reg;
[27]94 case (state_reg)
[51]95 0:
[27]96 begin
[51]97 // nothing to do
98 wren_next = 1'b0;
99 addr_next = 12'd0;
[70]100 data_next = 32'd0;
[51]101 state_next = 4'd0;
[27]102 end
[51]103
104 1:
[27]105 begin
106 // write zeros
107 if (&addr_reg)
108 begin
[51]109 wren_next = 1'b0;
110 state_next = 4'd2;
[27]111 end
112 else
113 begin
114 addr_next = addr_reg + 12'd1;
115 end
[51]116 end
117
118 2:
[27]119 begin
[84]120 wren_next = 1'b0;
[51]121 if (data_ready)
[27]122 begin
[84]123 addr_next = data;
124 state_next = 4'd3;
[27]125 end
126 end
127
[51]128 3:
[27]129 begin
[84]130 state_next = 4'd4;
[27]131 end
132
[84]133 4:
134 begin
[88]135 state_next = 5'd4;
136 end
137
138 5:
139 begin
[84]140 if (&q_a_wire)
141 begin
142 state_next = 4'd0;
143 end
144 else
145 begin
146 wren_next = 1'b1;
147 data_next = q_a_wire + 32'd1;
148 state_next = 4'd2;
149 end
150 end
151
[27]152 default:
153 begin
[51]154 wren_next = 1'b0;
155 addr_next = 12'd0;
[70]156 data_next = 32'd0;
[27]157 state_next = 4'd0;
158 end
159 endcase
160 end
161
162 // output logic
[45]163 assign q = q_b_wire;
[27]164endmodule
Note: See TracBrowser for help on using the repository browser.