Untitled

 avatar
unknown
verilog
3 years ago
4.0 kB
6
Indexable
module mem_addr_gen1(
    input clk,
    input rst,
    input en,
    input dir,
    input vmir,
    input hmir,
    input [9:0] h_cnt,
    input [9:0] v_cnt,
    output  wire [16:0] pixel_addr
    );
    
    wire limited_dir;
    assign limited_dir = (vmir == 1|| hmir == 1)?limited_dir:dir;
    reg [7:0] position;
    reg [16:0] tmp_adr;
    always @(*) begin
        if(en == 1)begin
            if(dir == 0)begin
                if(vmir == 0 && hmir == 0)begin
                    tmp_adr = ((h_cnt>>1)+320*(v_cnt>>1)+ position*320 )% 76800;
                end
                else if(vmir == 1 && hmir == 0)begin
                    tmp_adr = ((h_cnt>>1)+320*(239 - v_cnt>>1)+ position*320 )% 76800;
                end
                else if(vmir == 0 && hmir == 1)begin
                    tmp_adr = (319 - (h_cnt>>1)+320*(239 - v_cnt>>1)+ position*320 )% 76800;
                end
                else begin
                    tmp_adr = (319 - (h_cnt>>1)+320*(239 - v_cnt>>1)+ position*320 )% 76800;
                end
            end
            else begin
                if(vmir == 0 && hmir == 0)begin
                    tmp_adr = (v_cnt>>1 >= position) ? ((h_cnt>>1)+320*(v_cnt>>1) - position*320)% 76800 : ((h_cnt>>1)+320*(v_cnt>>1) + ( 240 - (position - v_cnt>>1))*320)% 76800;
                end
                else if(vmir == 1 && hmir == 0)begin
                    tmp_adr = (v_cnt>>1 >= position) ? ((h_cnt>>1)+320*(239- v_cnt>>1) - position*320)% 76800 : ((h_cnt>>1)+320*(239 - v_cnt>>1) + ( 240 - (position - v_cnt>>1))*320)% 76800;    
                end
                else if(vmir == 0 && hmir == 1)begin
                    tmp_adr = (v_cnt>>1 >= position) ? (319 - (h_cnt>>1)+320*(v_cnt>>1) - position*320)% 76800 : (319 - (h_cnt>>1)+320*(v_cnt>>1) + ( 240 - (position - v_cnt>>1))*320)% 76800;    
                end
                else begin
                    tmp_adr = (v_cnt>>1 >= position) ? (319 - (h_cnt>>1)+320*(239 - v_cnt>>1) - position*320)% 76800 : (319 - (h_cnt>>1)+320*(239 - v_cnt>>1) + ( 240 - (position - v_cnt>>1))*320)% 76800;
                end
            end
        end
        else begin
            tmp_adr = tmp_adr; 
        end
    end
    
    assign pixel_addr = tmp_adr;  //640*480 --> 320*240 

    always @ (posedge clk) begin
        if(rst)
            position <= 0;
        else if(position < 239)
            position <= position + 1;
            
        else if(limited_dir == 0 && position < 239)
            position <= position + 1;
        else if(limited_dir == 1 && position > 0)
            position <= position - 1;
        else
            position <= 0;
    end
    
endmodule
module lab7_1(
    input clk,
    input rst,
    input en,
    input dir,
    input vmir,
    input hmir,
    output [3:0] vgaRed,
    output [3:0] vgaGreen,
    output [3:0] vgaBlue,
    output hsync,
    output vsync
);
    // add your design here
    wire [11:0] data;
    wire clk_25MHz;
    wire clk_22;
    wire [16:0] pixel_addr;
    wire [11:0] pixel;
    wire valid;
    wire [9:0] h_cnt; //640
    wire [9:0] v_cnt;  //480

    assign {vgaRed, vgaGreen, vgaBlue} = pixel;

     clock_divider clk_wiz_0_inst(
      .clk(clk),
      .clk1(clk_25MHz),
      .clk22(clk_22)
    );

    mem_addr_gen1 mem_addr_gen_inst(
    .clk(clk_22),
    .rst(rst),
    .en(en),
    .dir(dir),
    .vmir(vmir),
    .hmir(hmir),
    .h_cnt(h_cnt),
    .v_cnt(v_cnt),
    .pixel_addr(pixel_addr)
    );
     
 
    blk_mem_gen_0 blk_mem_gen_0_inst(
      .clka(clk_25MHz),
      .wea(0),
      .addra(pixel_addr),
      .dina(data[11:0]),
      .douta(pixel)
    ); 

    vga_controller   vga_inst(
      .pclk(clk_25MHz),
      .reset(rst),
      .hsync(hsync),
      .vsync(vsync),
      .valid(valid),
      .h_cnt(h_cnt),
      .v_cnt(v_cnt)
    );
endmodule
Editor is loading...