source: trunk/MultiChannelUSB/oscilloscope.v@ 87

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

improve timings in all components

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