Wissance / ImageCaptureSystem

A Xilinx IP Core and App for line scanner image capture and store
11 stars 5 forks source link

Реализовать элементарное считывание #6

Closed VeryNiceGuy closed 8 years ago

VeryNiceGuy commented 8 years ago

Подзадача #2

VeryNiceGuy commented 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
VeryNiceGuy commented 8 years ago

Несколько раз смотрел док, не могу решить использовать блокирующие или неблокирующие присваивания, описание как-бы намекает на блокирующие но я хотел без них. Ну и машина моя не совсем подходит под задачу, так как параллельно нужно считать clk, слать load_pulse и т.д.

VeryNiceGuy commented 8 years ago

Кстати у меня вивада 2016.2 начала вылетать напроч, но модуль я запиливаю в 2016.1, так что не критично пока :)

VeryNiceGuy commented 8 years ago

Код модуля (с блокирующими присваиваниями):

`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
VeryNiceGuy commented 8 years ago

Код тестбенча (также, с блокирующими присваиваниями):

`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
VeryNiceGuy commented 8 years ago

Симуляция:

image

VeryNiceGuy commented 8 years ago

Я бы хотел унести if(enable) в состояние 4 и оттуда прыгать в 0 при первом запуске, а потом просто проходить через весь цикл удерживая rst_cvc, rst_cds high 1us, возможно понадобится добавить одну однобитовую переменную. Ну и еще я думаю вернуть неблокирующие присваивания.

EvilLord666 commented 8 years ago

Реализовал модуль, собственный AXI Stream Master интерфейс для дальнейшего проброса данных с линейных сканеров (с упаковкой их из 8 бит в 32). Тесты прилагаются, изменения уже в master.