Closed VeryNiceGuy closed 8 years ago
Тестбенч пока не комичу, выглядит он в данный момент так:
module linescanner_image_capture_unit_tb;
reg /*pixel_clock,*/ main_clock_source, n_reset, lval, end_adc, enable;
reg[7:0] data;
wire[7:0] pixel_data;
wire main_clock, rst_cvc, rst_cds, sample, load_pulse, pixel_captured, pixel_clock;
linescanner_image_capture_unit d(
.enable,
.data,
.rst_cvc,
.rst_cds,
.sample,
.end_adc,
.lval,
.pixel_clock,
.main_clock_source,
.main_clock,
.n_reset,
.load_pulse,
.pixel_data,
.pixel_captured);
initial begin
enable <= 1'b1;
main_clock_source <= 1'b0;
//pixel_clock <= 0'b0;
lval <= 1'b0;
data <= 8'b00000000;
end_adc <= 1'b0;
n_reset <= 1'b1;
#10 n_reset <= 1'b0;
#10 n_reset <= 1'b1;
end
always #10 main_clock_source <= ~main_clock_source;
//always #10 pixel_clock <= ~pixel_clock;
assign pixel_clock = main_clock;
always @ (rst_cds)
if(!rst_cds)
#160 end_adc = 1'b1;
always @ (load_pulse)
if(load_pulse)
#1000 lval = 1'b1;
endmodule
Несколько раз смотрел док, не могу решить использовать блокирующие или неблокирующие присваивания, описание как-бы намекает на блокирующие но я хотел без них. Ну и машина моя не совсем подходит под задачу, так как параллельно нужно считать clk, слать load_pulse и т.д.
Кстати у меня вивада 2016.2 начала вылетать напроч, но модуль я запиливаю в 2016.1, так что не критично пока :)
Код модуля (с блокирующими присваиваниями):
`timescale 1ns / 1ns
module linescanner_image_capture_unit(
input wire enable,
input wire[7:0] data,
output reg rst_cvc,
output reg rst_cds,
output reg sample,
input wire end_adc,
input wire lval,
input wire pixel_clock,
input main_clock_source,
output main_clock,
input wire n_reset,
output reg load_pulse,
output wire[7:0] pixel_data,
output wire pixel_captured);
assign main_clock = main_clock_source;
assign pixel_captured = lval;
assign pixel_data = data;
reg[7:0] clock_counter, clock_count_end_adc_re, sm_state;
reg send_load_pulse;
always @ (posedge pixel_clock) begin
if(!n_reset) begin
clock_counter = 0;
sm_state = 0;
rst_cvc = 1'b1;
rst_cds = 1'b1;
sample = 1'b0;
end
else if(enable) begin
case (sm_state)
0: begin
rst_cvc = 1'b0;
sm_state = 1;
end
1: if(clock_counter < 49) // 50 - 1
clock_counter = clock_counter + 1;
else begin
rst_cds = 1'b0;
clock_counter = 0;
sm_state = 2;
end
2: if(clock_counter < 8) // skip 8clk
clock_counter = clock_counter + 1;
else if(end_adc) begin
sample = 1'b1;
clock_counter = 0;
sm_state = 3;
end
3: if(clock_counter < 49) // 50 - 1
clock_counter = clock_counter + 1;
else begin
sample = 1'b0;
clock_counter = 0;
sm_state = 4;
end
4: if(clock_counter < 7) // skip 7clk
clock_counter = clock_counter + 1;
else begin
rst_cvc = 1'b1;
rst_cds = 1'b1;
clock_counter = 0;
sm_state = 5;
end
5: if(clock_counter < 49) // 50 - 1
clock_counter = clock_counter + 1;
else begin
clock_counter = 0;
sm_state = 0;
end
endcase
end
end
always @ (posedge pixel_clock) begin
if(!n_reset) begin
send_load_pulse = 1'b1;
clock_count_end_adc_re = 0;
load_pulse = 1'b0;
end
else if(load_pulse)
load_pulse = 1'b0;
else if(send_load_pulse && end_adc)
if(clock_count_end_adc_re < 4)
clock_count_end_adc_re = clock_count_end_adc_re + 1;
else begin
load_pulse = 1'b1;
send_load_pulse = 1'b0;
clock_count_end_adc_re = 0;
end
end
always @ (negedge end_adc)
send_load_pulse = 1'b1;
endmodule
Код тестбенча (также, с блокирующими присваиваниями):
`timescale 1ns / 1ns
module linescanner_image_capture_unit_tb;
reg main_clock_source, n_reset, lval, end_adc, enable;
reg[7:0] data;
wire[7:0] pixel_data;
wire main_clock, rst_cvc, rst_cds, sample, load_pulse, pixel_captured, pixel_clock;
linescanner_image_capture_unit d(
.enable,
.data,
.rst_cvc,
.rst_cds,
.sample,
.end_adc,
.lval,
.pixel_clock,
.main_clock_source,
.main_clock,
.n_reset,
.load_pulse,
.pixel_data,
.pixel_captured);
initial begin
enable = 1'b1;
main_clock_source = 1'b0;
lval = 1'b0;
data = 8'b00000000;
end_adc = 1'b0;
n_reset = 1'b1;
#10 n_reset = 1'b0;
#10 n_reset = 1'b1;
end
assign pixel_clock = main_clock;
always #10 main_clock_source = ~main_clock_source;
always @ (negedge rst_cds)
#160 end_adc = 1'b1;
always @ (negedge sample)
#140 end_adc = 1'b0;
always @ (posedge load_pulse) begin
#1000 lval = 1'b1;
data = 8'b11111111;
end
always @ (posedge lval) begin
#5010 lval = 1'b0;
data = 8'b00000000;
end
endmodule
Симуляция:
Я бы хотел унести if(enable) в состояние 4 и оттуда прыгать в 0 при первом запуске, а потом просто проходить через весь цикл удерживая rst_cvc, rst_cds high 1us, возможно понадобится добавить одну однобитовую переменную. Ну и еще я думаю вернуть неблокирующие присваивания.
Реализовал модуль, собственный AXI Stream Master интерфейс для дальнейшего проброса данных с линейных сканеров (с упаковкой их из 8 бит в 32). Тесты прилагаются, изменения уже в master.
Подзадача #2