ZYNQ_project:lcd_pic_400x400

在lcd液晶屏上显示400x400像素的图片,

像素信息通过电脑的串口调试助手,发送给fpga,存储在例化的双端口ram中,

在要显示图像区域,读取ram中的像素信息。

模块框图:

时序图:

代码:

module  clk_div(input       wire                sys_clk     ,input       wire                sys_rst_n   ,input       wire    [15:0]      lcd_id      ,output      reg                 clk_lcd     ,output      wire                clk_rx      ,output      wire                rst_n       
);wire                clk_9Mhz    ; wire                clk_33Mhz   ;wire                clk_50Mhz   ;wire                clk_70Mhz   ;wire                locked      ;   assign  rst_n   = (sys_rst_n && locked) ;assign  clk_rx  = clk_50Mhz             ;always @(*) begincase (lcd_id)16'd4324: clk_lcd <= clk_9Mhz  ;16'd7084: clk_lcd <= clk_33Mhz ;16'd7016: clk_lcd <= clk_50Mhz ;16'd4384: clk_lcd <= clk_33Mhz ;16'd1018: clk_lcd <= clk_70Mhz ;default : clk_lcd <= 1'b0      ;endcaseendpll pll_inst(.clk_in         ( sys_clk   ) ,.resetn         ( sys_rst_n ) ,.clk_9Mhz       ( clk_9Mhz  ) ,.clk_33Mhz      ( clk_33Mhz ) ,.clk_50Mhz      ( clk_50Mhz ) ,.clk_70Mhz      ( clk_70Mhz ) ,.locked         ( locked    ) 
);endmodule

 

// 根据传进来的有效图像坐标信息,产生有效的像素数据�?
module lcd_display (input       wire                sys_clk     , // lcd的时钟,用来读取ram�?数�??input       wire                sys_rst_n   , input       wire                clk_wr_ram  , // 50Mhz,与rx模块相同时钟�?input       wire    [10:0]      axi_x       ,input       wire    [10:0]      axi_y       ,input       wire    [7:0]       pi_data     ,input       wire                pi_flag     ,input       wire    [10:0]      H_SYNC      ,input       wire    [10:0]      H_BACK      ,input       wire    [10:0]      H_DISP      ,input       wire    [10:0]      V_SYNC      ,input       wire    [10:0]      V_BACK      ,input       wire    [10:0]      V_DISP      ,output      reg     [23:0]      pix_data                    
);localparam  BLACK       = 24'h000000 , // 黑色WHITE       = 24'hFFFFFF , // 白色RosyBrown   = 24'hBC8F8F , // �?瑰�??RED         = 24'hFF0000 , // 红色APRICOT     = 24'hE69966 , // 杏黄�?VIOLET      = 24'h8B00FF , // �?罗兰�?LINEN       = 24'hFAF0E6 , // 亚麻�?KHAKI       = 24'h996B1F , // 卡其�?PEACH       = 24'hFFE5B4 , // 桃色GOLDEN      = 24'hFFD700 , // 金色SkyBule     = 24'h87CEEB ; // 天空�?localparam  PIC_SIZE    = 11'd400    , // 正方形图片像素大�?100*100H_BYOND     = 11'd200    , V_BYOND     = 11'd40     ; localparam  DEEP        = 18'd160_000 ; // ram深度// reg signal definereg     [ 7:0]      data1       ;reg     [ 7:0]      data2       ;reg     [ 7:0]      data3       ;reg     [ 1:0]      cnt_data    ;reg                 data_flag   ;reg     [17:0]      wr_addr     ;reg     [23:0]      wr_data     ; reg                 wr_en       ;reg     [17:0]      rd_addr     ;// wire signal definewire                wr_en_r     ;wire    [17:0]      wr_addr_r   ;wire    [23:0]      wr_data_r   ;wire    [17:0]      rd_addr_r   ;wire                all_en      ;wire                rd_en       ;wire    [23:0]      rd_data     ;
/******************************************************************************************
********************************************main code**************************************
*******************************************************************************************/// // reg signal define// reg     [ 7:0]      data1       ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) data1 <= 8'd0 ;else if(pi_flag && (cnt_data == 0))data1 <= pi_data ;else data1 <= data1 ;end// reg     [ 7:0]      data2       ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) data2 <= 8'd0 ;else if(pi_flag && (cnt_data == 1))data2 <= pi_data ;else data2 <= data2 ;end// reg     [ 7:0]      data3       ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) data3 <= 8'd0 ;else if(pi_flag && (cnt_data == 2))data3 <= pi_data ;else data3 <= data3 ;end// reg     [ 1:0]      cnt_data    ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) cnt_data <= 2'd0 ;else if(pi_flag && cnt_data == 2)cnt_data <= 2'd0 ;else if(pi_flag)cnt_data <= cnt_data + 1'b1 ;else cnt_data <= cnt_data ;end// reg                 data_flag   ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) data_flag <= 1'b0 ;else if(pi_flag && cnt_data == 2)data_flag <= 1'b1 ;else data_flag <= 1'b0 ;end// reg     [17:0]      wr_addr     ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) wr_addr <= 18'd0 ;else if(wr_en &&( wr_addr == DEEP - 1))wr_addr <= 18'd0 ;else if(wr_en)wr_addr <= wr_addr + 1'b1 ;else wr_addr <= wr_addr ;end// reg     [23:0]      wr_data     ; always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) wr_data <= 24'd0 ;else if(data_flag)wr_data <= {data1,data2,data3} ;else wr_data <= wr_data ;end// reg                 wr_en       ;always @(posedge clk_wr_ram or negedge sys_rst_n) beginif(~sys_rst_n) wr_en <= 1'b0 ;else wr_en <= data_flag ;end// reg     [17:0]      rd_addr     ; // 读地�?的时钟与lcd的时钟相同�??always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) rd_addr <= 18'd0 ;else if(rd_en && rd_addr == DEEP - 1)rd_addr <= 18'd0 ;else if(rd_en)rd_addr <= rd_addr + 1'b1 ;else rd_addr <= rd_addr ;end// wire signal define// wire                wr_en_r     ;assign              wr_en_r     = wr_en   ;// wire    [13:0]      wr_addr_r   ;assign              wr_addr_r   = wr_addr ;// wire    [23:0]      wr_data_r   ;assign              wr_data_r   = wr_data ;// wire    [13:0]      rd_addr_r   ;assign              rd_addr_r   = rd_addr ;// wire                all_en      ;assign  all_en = 1'b1 ;// wire                rd_en       ;assign  rd_en = ((axi_y >= V_SYNC + V_BACK + V_BYOND) && (axi_y <= V_SYNC + V_BACK + V_BYOND + PIC_SIZE - 1)&& (axi_x >= H_SYNC + H_BACK + H_BYOND) && (axi_x <= H_SYNC + H_BACK + H_BYOND + PIC_SIZE - 1)) ? 1'b1 : 1'b0 ;// wire    [23:0]      rd_data     ;// output pix_dataalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) pix_data <= BLACK ;else if((axi_y >= V_SYNC + V_BACK) && (axi_y <= V_SYNC + V_BACK + V_DISP - 1)) begin// 在场同�?�有效区间�??if(rd_en) beginpix_data <= rd_data ;end else beginif((axi_x >= H_SYNC + H_BACK) && (axi_x <= H_SYNC + H_BACK + H_DISP/10 - 1))  pix_data <= WHITE ; else if((axi_x >= H_SYNC + H_BACK + H_DISP/10) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*2 - 1))pix_data <= BLACK ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*2) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*3 - 1))pix_data <= RosyBrown ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*3) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*4 - 1))pix_data <= APRICOT ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*4) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*5 - 1))pix_data <= RED ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*5) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*6 - 1))pix_data <= VIOLET ;else if((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*6) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*7 - 1))pix_data <= KHAKI ;elseif((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*7) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*8 - 1))pix_data <= PEACH ;elseif((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*8) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*9 - 1))pix_data <= GOLDEN ;elseif((axi_x >= H_SYNC + H_BACK + (H_DISP/10)*9) && (axi_x <= H_SYNC + H_BACK + (H_DISP/10)*10 - 1))pix_data <= SkyBule ;elsepix_data <= BLACK ;end endelse  pix_data <= BLACK ;end//  例化ram
ram_24x400x400 ram_24x400x400_inst (.clka                           ( clk_wr_ram    ) , // input wire clka.ena                            ( all_en        ) , // input wire ena.wea                            ( wr_en_r       ) , // input wire [0 : 0] wea.addra                          ( wr_addr_r     ) , // input wire [13 : 0] addra.dina                           ( wr_data_r     ) , // input wire [23 : 0] dina.clkb                           ( sys_clk       ) , // input wire clkb.enb                            ( rd_en         ) , // input wire enb.addrb                          ( rd_addr       ) , // input wire [13 : 0] addrb.doutb                          ( rd_data       )   // output wire [23 : 0] doutb
);// ila_0 your_instance_name (
// 	.clk(clk_wr_ram), // input wire clk// 	.probe0(pi_flag), // input wire [0:0]  probe0  
// 	.probe1(pi_data), // input wire [7:0]  probe1 
// 	.probe2(data1), // input wire [6:0]  probe2 
// 	.probe3(data2), // input wire [6:0]  probe3 
// 	.probe4(data3), // input wire [6:0]  probe4 
// 	.probe5(wr_en_r), // input wire [0:0]  probe5 
// 	.probe6(wr_addr_r), // input wire [22:0]  probe6 
// 	.probe7(wr_addr_r) // input wire [13:0]  probe7
// );// ila_0 ila_0_inst (
// 	.clk(clk_wr_ram), // input wire clk// 	// .probe0(rd_en), // input wire [0:0]  probe0  
// 	// .probe1(rd_addr), // input wire [13:0]  probe1 
// 	// .probe2(rd_data), // input wire [23:0]  probe2 
// 	// .probe3(wr_en_r), // input wire [0:0]  probe3 
// 	// .probe4(axi_x), // input wire [10:0]  probe4 
// 	// .probe5(axi_y), // input wire [10:0]  probe5
// 	.probe0( ), // input wire [0:0]  probe0  
// 	.probe1( ), // input wire [13:0]  probe1 
// 	.probe2( ), // input wire [23:0]  probe2 
// 	.probe3( ), // input wire [0:0]  probe3 
// 	.probe4( ), // input wire [10:0]  probe4 
// 	.probe5( ), // input wire [10:0]  probe5// 	.probe6(pi_flag), // input wire [0:0]  probe6 
// 	.probe7(pi_data), // input wire [7:0]  probe7 
// 	.probe8 (data1), // input wire [7:0]  probe8 
// 	.probe9 (data2), // input wire [7:0]  probe9 
// 	.probe10(data3), // input wire [7:0]  probe10 
// 	.probe11(wr_data), // input wire [23:0]  probe11 
// 	.probe12(cnt_data) // input wire [1:0]  probe12// );endmodule

 

// 接口模块,产生接口时序。又名驱动模块。
// 产生像素信息,有效信号。其余信号直接赋值1
module lcd_driver (input       wire                sys_clk     ,input       wire                sys_rst_n   ,input       wire    [23:0]      pix_data    ,input       wire    [15:0]      lcd_id      ,output      wire    [10:0]      H_SYNCtoDIS ,output      wire    [10:0]      H_BACKtoDIS ,output      wire    [10:0]      H_DISPtoDIS ,output      wire    [10:0]      V_SYNCtoDIS ,output      wire    [10:0]      V_BACKtoDIS ,output      wire    [10:0]      V_DISPtoDIS ,output      reg                 lcd_de      ,output      wire    [23:0]      lcd_rgb_out ,output      wire                lcd_bl      ,output      wire                lcd_rstn    ,output      wire                lcd_hsync   ,output      wire                lcd_vsync   ,output      wire                lcd_clk     ,output      wire    [10:0]      axi_x       , output      wire    [10:0]      axi_y       
);// localparam
// 4.3' 480*272 localparam  H_SYNC_4342   =  11'd41     ,   H_BACK_4342   =  11'd2      ,    H_DISP_4342   =  11'd480    ,  H_FRONT_4342  =  11'd2      ,    H_TOTAL_4342  =  11'd525    ,  V_SYNC_4342   =  11'd10     ,   V_BACK_4342   =  11'd2      ,    V_DISP_4342   =  11'd272    ,  V_FRONT_4342  =  11'd2      ,    V_TOTAL_4342  =  11'd286    ,  // 7' 800*480   H_SYNC_7084   =  11'd128    ,  H_BACK_7084   =  11'd88     ,   H_DISP_7084   =  11'd800    ,  H_FRONT_7084  =  11'd40     ,   H_TOTAL_7084  =  11'd1056   , V_SYNC_7084   =  11'd2      ,    V_BACK_7084   =  11'd33     ,   V_DISP_7084   =  11'd480    ,  V_FRONT_7084  =  11'd10     ,   V_TOTAL_7084  =  11'd525    ,  // 7' 1024*600   H_SYNC_7016   =  11'd20     ,   H_BACK_7016   =  11'd140    ,  H_DISP_7016   =  11'd1024   , H_FRONT_7016  =  11'd160    ,  H_TOTAL_7016  =  11'd1344   , V_SYNC_7016   =  11'd3      ,    V_BACK_7016   =  11'd20     ,   V_DISP_7016   =  11'd600    ,  V_FRONT_7016  =  11'd12     ,   V_TOTAL_7016  =  11'd635    ,  // 10.1' 1280*800   H_SYNC_1018   =  11'd10     ,   H_BACK_1018   =  11'd80     ,   H_DISP_1018   =  11'd1280   , H_FRONT_1018  =  11'd70     ,   H_TOTAL_1018  =  11'd1440   , V_SYNC_1018   =  11'd3      ,    V_BACK_1018   =  11'd10     ,   V_DISP_1018   =  11'd800    ,  V_FRONT_1018  =  11'd10     ,   V_TOTAL_1018  =  11'd823    ,  // 4.3' 800*480   H_SYNC_4384   =  11'd128    ,  H_BACK_4384   =  11'd88     ,   H_DISP_4384   =  11'd800    ,  H_FRONT_4384  =  11'd40     ,   H_TOTAL_4384  =  11'd1056   , V_SYNC_4384   =  11'd2      ,    V_BACK_4384   =  11'd33     ,   V_DISP_4384   =  11'd480    ,  V_FRONT_4384  =  11'd10     ,   V_TOTAL_4384  =  11'd525    ;  // 不同分辨率时序参数不同reg     [10:0]      H_SYNC  ;reg     [10:0]      H_BACK  ;reg     [10:0]      H_DISP  ;reg     [10:0]      H_FRONT ;reg     [10:0]      H_TOTAL ;reg     [10:0]      V_SYNC  ;reg     [10:0]      V_BACK  ;reg     [10:0]      V_DISP  ;reg     [10:0]      V_FRONT ;reg     [10:0]      V_TOTAL ;// reg signal define reg     [10:0]      cnt_row ; // 行计数器,记录一行中的第几列。行计数器归零,说明一行扫描完。reg     [10:0]      cnt_col ; // 列计数器,记录一列中的第几行。列计数器归零,说明一帧图像扫描完。// wire signal definewire                valid_H ; // 行时序有效信号wire                valid_V ; // 列时序有效信号wire                valid_HV; // 图像有效信号,由于lcd_display模块中产生像素数据信息是时序逻辑,所以lcd_de信号要对图像有效信号打1拍。/**************************************************************************************************************************************main code*********************************************************************************************************************************/// 时序参数赋值always @(*) begincase(lcd_id)16'd4324:   beginH_SYNC  = H_SYNC_4342  ;H_BACK  = H_BACK_4342  ;H_DISP  = H_DISP_4342  ;H_FRONT = H_FRONT_4342 ;H_TOTAL = H_TOTAL_4342 ;V_SYNC  = V_SYNC_4342  ;V_BACK  = V_BACK_4342  ;V_DISP  = V_DISP_4342  ;V_FRONT = V_FRONT_4342 ;V_TOTAL = V_TOTAL_4342 ;end16'd7084:   beginH_SYNC  = H_SYNC_7084  ;H_BACK  = H_BACK_7084  ;H_DISP  = H_DISP_7084  ;H_FRONT = H_FRONT_7084 ;H_TOTAL = H_TOTAL_7084 ;V_SYNC  = V_SYNC_7084  ;V_BACK  = V_BACK_7084  ;V_DISP  = V_DISP_7084  ;V_FRONT = V_FRONT_7084 ;V_TOTAL = V_TOTAL_7084 ;end16'd7016:   beginH_SYNC  = H_SYNC_7016  ;H_BACK  = H_BACK_7016  ;H_DISP  = H_DISP_7016  ;H_FRONT = H_FRONT_7016 ;H_TOTAL = H_TOTAL_7016 ;V_SYNC  = V_SYNC_7016  ;V_BACK  = V_BACK_7016  ;V_DISP  = V_DISP_7016  ;V_FRONT = V_FRONT_7016 ;V_TOTAL = V_TOTAL_7016 ;end16'd4384:   beginH_SYNC  = H_SYNC_4384  ;H_BACK  = H_BACK_4384  ;H_DISP  = H_DISP_4384  ;H_FRONT = H_FRONT_4384 ;H_TOTAL = H_TOTAL_4384 ;V_SYNC  = V_SYNC_4384  ;V_BACK  = V_BACK_4384  ;V_DISP  = V_DISP_4384  ;V_FRONT = V_FRONT_4384 ;V_TOTAL = V_TOTAL_4384 ;end16'd1018:   beginH_SYNC  = H_SYNC_1018  ;H_BACK  = H_BACK_1018  ;H_DISP  = H_DISP_1018  ;H_FRONT = H_FRONT_1018 ;H_TOTAL = H_TOTAL_1018 ;V_SYNC  = V_SYNC_1018  ;V_BACK  = V_BACK_1018  ;V_DISP  = V_DISP_1018  ;V_FRONT = V_FRONT_1018 ;V_TOTAL = V_TOTAL_1018 ;enddefault :   beginH_SYNC  = H_SYNC_1018  ;H_BACK  = H_BACK_1018  ;H_DISP  = H_DISP_1018  ;H_FRONT = H_FRONT_1018 ;H_TOTAL = H_TOTAL_1018 ;V_SYNC  = V_SYNC_1018  ;V_BACK  = V_BACK_1018  ;V_DISP  = V_DISP_1018  ;V_FRONT = V_FRONT_1018 ;V_TOTAL = V_TOTAL_1018 ;endendcaseend// // reg signal define // reg     [10:0]      cnt_row ; // 行计数器,记录一行中的第几列。行计数器归零,说明一行扫描完。always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_row <= 11'd0 ;else if(cnt_row == (H_TOTAL - 1))cnt_row <= 11'd0 ;else cnt_row <= cnt_row + 1'b1 ;end// reg     [10:0]      cnt_col ; // 列计数器,记录一列中的第几行。列计数器归零,说明一帧图像扫描完。always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_col <= 11'd0 ;else if((cnt_col == (V_TOTAL - 1)) && (cnt_row == (H_TOTAL - 1)))cnt_col <= 11'd0 ;else if(cnt_row == (H_TOTAL - 1))cnt_col <= cnt_col + 1'b1 ;else cnt_col <= cnt_col ;end// // wire signal define// wire                valid_H ; // 行时序有效信号assign  valid_H = ((cnt_row >= H_SYNC + H_BACK) && (cnt_row <= H_SYNC + H_BACK + H_DISP - 1)) ? 1'b1 : 1'b0 ;// wire                valid_V ; // 列时序有效信号assign  valid_V = ((cnt_col >= V_SYNC + V_BACK) && (cnt_col <= V_SYNC + V_BACK + V_DISP - 1)) ? 1'b1 : 1'b0 ;// wire                valid_HV; // 图像有效信号,由于lcd_display模块中产生像素数据信息是时序逻辑,所以lcd_de信号要对图像有效信号打1拍。assign  valid_HV = (valid_H && valid_V) ;// output      wire    [10:0]      axi_x       , assign  axi_x = (valid_HV) ? cnt_row : 11'd0 ;// output      wire    [10:0]      axi_y       ,assign  axi_y = (valid_HV) ? cnt_col : 11'd0 ;// output      wire    [23:0]      lcd_rgb_out ,assign  lcd_rgb_out = pix_data  ;// output      reg                 lcd_de      ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) lcd_de <= 1'b0 ;else lcd_de <= valid_HV ;end// 本实验没用到的信号,赋值1;assign  lcd_bl    = 1'b1 ;assign  lcd_rstn  = 1'b1 ;assign  lcd_hsync = 1'b1 ;assign  lcd_vsync = 1'b1 ;assign  lcd_clk   = (sys_rst_n == 1'b1) ? sys_clk : 1'b0 ;// 传给像素数据生成模块的时序参数assign  H_SYNCtoDIS = H_SYNC ;assign  H_BACKtoDIS = H_BACK ;assign  H_DISPtoDIS = H_DISP ;assign  V_SYNCtoDIS = V_SYNC ;assign  V_BACKtoDIS = V_BACK ;assign  V_DISPtoDIS = V_DISP ;endmodule

 

`define    CLOCK        50_000_00//0
`define    BPS          115200
`define    BIT_NO_CHACK 9       // 1bit起始位+8bit数据位
`define    BIT_CHACK    10      // 1bit起始位+8bit数据位+1bit校验位
`define    ODD          1       // 1bit起始位+8bit数据位+1bit校验位
`define    EVEN         0       // 1bit起始位+8bit数据位+1bit校验位/*
奇校验:原始码流+校验位 总共有奇数个1偶校验:原始码流+校验位 总共有偶数个1
*/
/*
// 24'h000000   4324 9Mhz   480*272
// 24'h800000   7084 33Mhz  800*480
// 24'h008080   7016 50Mhz  1024*600
// 24'h000080   4384 33Mhz  800*480
// 24'h800080   1018 70Mhz  1280*800
*/
module  rd_id(input       wire                sys_clk     ,input       wire                sys_rst_n   ,input       wire    [23:0]      lcd_rgb     , output      reg     [15:0]      lcd_id      
);reg                 rd_flag ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) rd_flag <= 1'b1 ;elserd_flag <= 1'b0 ;endalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) lcd_id <= 24'd0 ;else if(rd_flag) begincase (lcd_rgb)24'h000000: lcd_id <= 16'd4324 ;24'h800000: lcd_id <= 16'd7084 ;24'h008080: lcd_id <= 16'd7016 ;24'h000080: lcd_id <= 16'd4384 ;24'h800080: lcd_id <= 16'd1018 ;default   : lcd_id <= 16'd1018 ;endcaseendendendmodule

 

// // uart�Ľ���ģ�飬Ҫ�����ʿɵ�,�ػ�ʵ��
// // ��ɻػ�ʵ������У��λ
// // Ȼ�����led��������Ŀ���ģ��
// `include         "para.v"
// module rx (
//     input       wire                sys_clk     ,
//     input       wire                sys_rst_n   ,
//     input       wire                rx          ,//     output      reg     [7:0]       po_data     , // port_output
//     output      reg                 po_flag     
// );
//     // parameter
//     parameter   MAX_BPS_CNT = `CLOCK/`BPS   ,//434 ,
//                 MAX_BIT_CNT = `BIT_CHACK    ;//10   ; 
//     localparam  RX_MOD      = 1'b1          ,
//                 CHECK_MOD   = `EVEN         ;
//     // reg signal define
//     reg                 rx_r1    ;
//     reg                 rx_r2    ;
//     reg     [31:0]      cnt_bps  ;
//     reg                 work     ;
//     reg     [3:0]       cnt_bit  ;
//     reg     [7:0]       data_reg ;
//     reg                 check    ;
//     reg                 check_reg;
//     // wire signal define
//     wire                nege    ;
//     /*******************************************************************/
//     // // reg signal define
//     // reg                 rx_r1   ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             rx_r1 <= 1'b1 ;
//         else
//             rx_r1 <= rx ;
//     end
//     // reg                 rx_r2   ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             rx_r2 <= 1'b1 ;
//         else
//             rx_r2 <= rx_r1 ;
//     end
//     // reg                 work    ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             work <= 1'b0 ;
//         else if(nege)
//             work <= 1'b1 ;
//         else if((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1))) // ��������������end_cnt_XXX�����棬����߼���
//             work <= 1'b0 ;
//         else 
//             work <= work ;
//     end
//     // reg     [31:0]      cnt_bps ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             cnt_bps <= 32'd0 ;
//         else if(work && (cnt_bps == (MAX_BPS_CNT - 1)))
//             cnt_bps <= 32'd0 ;
//         else if(work)
//             cnt_bps <= cnt_bps + 1'b1 ;
//         else 
//             cnt_bps <= 32'd0 ;
//     end
//     // reg     [3:0]       cnt_bit ; Ӧ�û��0
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             cnt_bit <= 4'd0 ;
//         else if (work && (cnt_bps == (MAX_BPS_CNT - 1) && cnt_bit == (MAX_BIT_CNT - 1)))
//             cnt_bit <= 4'd0 ;
//         else if (work && (cnt_bps == (MAX_BPS_CNT - 1)))
//             cnt_bit <= cnt_bit + 1'b1 ;
//         else if(work)
//             cnt_bit <= cnt_bit ;
//         else 
//             cnt_bit <= 8'd0 ;
//     end
//     // reg     [7:0]       data_reg;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             data_reg <= 8'd0 ;
//         else if(work && cnt_bps == (MAX_BPS_CNT/2)) begin // �������ɼ����ݵ�ʱ��
//             case (cnt_bit)
//                 0 : data_reg <= 8'd0 ;
//                 1 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 2 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 3 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 4 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 5 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 6 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 7 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 8 : data_reg[cnt_bit - 1] <= rx_r2 ;
//                 default: data_reg <= data_reg ;
//             endcase
//         end else
//             data_reg <= data_reg ;
//     end
//     // // wire signal define
//     // wire                nege    ;
//     assign  nege = ~rx_r1 && rx_r2 ;
//     // reg                 check    ;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             check <= 1'b0 ;
//         else if(CHECK_MOD && (cnt_bit == ((MAX_BIT_CNT - 2))) && (cnt_bps == (MAX_BPS_CNT - 1)))
//             check <= ~^data_reg ;
//         else if(~CHECK_MOD && (cnt_bit == ((MAX_BIT_CNT - 2))) && (cnt_bps == (MAX_BPS_CNT - 1)))
//             check <= ^data_reg ;    
//         else 
//             check <= check ;
//     end  
//     // reg                 check_reg;
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             check_reg <= 1'b0 ;
//         else if((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT /2)))
//             check_reg <= rx_r2 ;
//         else 
//             check_reg <= check_reg ;
//     end  
//     // output      reg     [7:0]       po_data     , // port_output
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             po_data <= 8'd0 ;
//         else if((check == check_reg) && (cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1)))
//             po_data <= data_reg ;
//         else if(RX_MOD)
//             po_data <= po_data ;
//         else 
//             po_data <= 8'd0 ;
//     end
//     // output      reg                 po_flag   
//     always @(posedge sys_clk or negedge sys_rst_n) begin
//         if(~sys_rst_n) 
//             po_flag <= 1'd0 ;
//         else if((check == check_reg) && ((cnt_bit == ((MAX_BIT_CNT - 1))) && (cnt_bps == (MAX_BPS_CNT - 1)))) 
//             po_flag <= 1'b1 ;
//         else 
//             po_flag <= 1'd0 ;
//     end  // endmodule
module rx
#(parameter UART_BPS = 'd115200       ,CLK_FREQ = 'd50_000_000 
)(input       wire            sys_clk   ,input       wire            sys_rst_n ,input       wire            rx        ,output      reg     [7:0]   po_data   ,output      reg             po_flag 
);localparam BAUD_CNT_MAX = CLK_FREQ / UART_BPS ;// reg define signalreg                 rx_reg1     ;reg                 rx_reg2     ;reg                 rx_reg3     ;reg                 start       ;reg                 work_en     ;reg     [12:00]     baud_cnt    ;reg                 bit_flag    ;reg     [ 3: 0]     bit_cnt     ;reg     [ 7: 0]     rx_data     ;reg                 rx_flag     ;// rx_reg1     ;rx_reg2     ;rx_reg3     ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginrx_reg1 <= 1'b1 ;rx_reg2 <= 1'b1 ;rx_reg3 <= 1'b1 ;end else beginrx_reg1 <= rx      ;rx_reg2 <= rx_reg1 ;rx_reg3 <= rx_reg2 ;endend// start       ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginstart <= 1'b0 ;end else beginif(rx_reg3 == 1'b1 && rx_reg2 == 1'b0 && bit_cnt == 4'd0) begin // 或者bit_cnt换成 work_en == 0 start <= 1'b1 ;end else beginstart <= 1'b0 ;endendend// work_en     ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginwork_en <= 1'b0 ;end else beginif(start == 1'b1) beginwork_en <= 1'b1 ;end else beginif((bit_cnt == 4'd8) && (bit_flag == 1'b1)) beginwork_en <= 1'b0 ;end else beginwork_en <= work_en ;endendendend// [12:00]     baud_cnt    ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginbaud_cnt <= 13'd0 ;end else beginif(work_en == 1'b1 && baud_cnt == BAUD_CNT_MAX - 1'b1) beginbaud_cnt <= 13'd0 ;end else beginif(work_en == 1'b1) beginbaud_cnt <= baud_cnt + 1'b1 ;end else beginbaud_cnt <= 13'd0 ;endendendend// always @(posedge sys_clk or negedge sys_rst_n) begin//     if(~sys_rst_n) begin//         baud_cnt <= 13'd0 ;//     end else begin//         if(work_en == 1'b1 && baud_cnt == BAUD_CNT_MAX - 1'b1 || work_en == 1'b0) begin//             baud_cnt <= 13'd0 ;//         end else begin//             baud_cnt <= baud_cnt + 1'b1 ; //         end//     end// end// bit_flag    ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginbit_flag <= 1'b0 ;end else beginif(baud_cnt == BAUD_CNT_MAX - 1'b1) begin // 也可以写成baud_cnt == BAUD_CNT_MAX / 2 - 1'b1bit_flag <= 1'b1 ;                    // 这样后面赋值时,就可以直接用bit_flag .end else beginbit_flag <= 1'b0 ;endendend// [ 2: 0]     bit_cnt     ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginbit_cnt <= 4'd0 ;end else beginif(bit_flag == 1'b1 && work_en == 1'b1 && bit_cnt == 4'd8) beginbit_cnt <= 4'd0 ;end else beginif(bit_flag == 1'b1 && work_en == 1'b1) beginbit_cnt <= bit_cnt + 1'b1 ;end else beginif(work_en == 1'b1) beginbit_cnt <= bit_cnt ;end else beginbit_cnt <= 3'd0 ;endendendendend// [7:0]   rx_data   ,always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginrx_data <= 8'd0 ;end else beginif(bit_cnt >= 4'd1 && bit_cnt <= 4'd8 && baud_cnt == BAUD_CNT_MAX / 2'd2) beginrx_data <= {rx_reg3, rx_data[7:1]} ;end else beginrx_data <= rx_data ;endendend// rx_flag always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginrx_flag <= 1'b0 ;end else beginif(bit_cnt == 4'd8 && bit_flag == 1'b1) beginrx_flag <= 1'b1 ;end else beginrx_flag <= 1'b0 ;endendend// output signal// po_flag always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginpo_flag <= 1'b0 ;end else beginif(rx_flag == 1'b1) beginpo_flag <= 1'b1 ;end else beginpo_flag <= 1'b0 ;endendend// po_dataalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginpo_data <= 8'd0 ;end else beginif(rx_flag == 1'b1) beginpo_data <= rx_data ;end else beginpo_data <= 8'd0 ;endendend
endmodule

 

module top (input		wire				sys_clk		,input		wire				sys_rst_n	,input       wire                rx          ,inout       wire    [23:0]      lcd_rgb     ,output      wire                lcd_de      ,output      wire                lcd_bl      ,output      wire                lcd_rstn    ,output      wire                lcd_hsync   ,output      wire                lcd_vsync   ,output      wire                lcd_clk        
);// inoutwire    [23:0]      lcd_rgb_out ;wire    [23:0]      lcd_rgb_in  ;assign              lcd_rgb     = (lcd_de) ? lcd_rgb_out : 24'dz ;assign              lcd_rgb_in  = lcd_rgb                        ;// 例化间连线wire    [15:0]      lcd_id      ;wire                clk_lcd     ;wire                rst_n       ;wire    [10:0]      H_SYNCtoDIS ;wire    [10:0]      H_BACKtoDIS ;wire    [10:0]      H_DISPtoDIS ;wire    [10:0]      V_SYNCtoDIS ;wire    [10:0]      V_BACKtoDIS ;wire    [10:0]      V_DISPtoDIS ;wire    [10:0]      axi_x       ; wire    [10:0]      axi_y       ;wire    [23:0]      pix_data    ;    wire    [7:0]       po_data     ;wire                po_flag     ;wire                clk_rx      ;
rd_id rd_id_inst(.sys_clk                    ( sys_clk       ) ,.sys_rst_n                  ( sys_rst_n     ) ,.lcd_rgb                    ( lcd_rgb_in    ) , .lcd_id                     ( lcd_id        ) 
);clk_div clk_div_inst(.sys_clk                    ( sys_clk       ) ,.sys_rst_n                  ( sys_rst_n     ) ,.lcd_id                     ( lcd_id        ) ,.clk_rx                     ( clk_rx        ) ,.clk_lcd                    ( clk_lcd       ) ,.rst_n                      ( rst_n         )  
);lcd_driver lcd_driver_inst(.sys_clk                    ( clk_lcd       ) ,.sys_rst_n                  ( rst_n         ) ,.pix_data                   ( pix_data      ) ,.lcd_id                     ( lcd_id        ) ,.H_SYNCtoDIS                ( H_SYNCtoDIS   ) ,.H_BACKtoDIS                ( H_BACKtoDIS   ) ,.H_DISPtoDIS                ( H_DISPtoDIS   ) ,.V_SYNCtoDIS                ( V_SYNCtoDIS   ) ,.V_BACKtoDIS                ( V_BACKtoDIS   ) ,.V_DISPtoDIS                ( V_DISPtoDIS   ) ,.lcd_de                     ( lcd_de        ) ,.lcd_rgb_out                ( lcd_rgb_out   ) ,.lcd_bl                     ( lcd_bl        ) ,.lcd_rstn                   ( lcd_rstn      ) ,.lcd_hsync                  ( lcd_hsync     ) ,.lcd_vsync                  ( lcd_vsync     ) ,.lcd_clk                    ( lcd_clk       ) ,.axi_x                      ( axi_x         ) , .axi_y                      ( axi_y         )  
);lcd_display lcd_display_inst(.sys_clk                    ( clk_lcd       ) ,.sys_rst_n                  ( rst_n         ) ,.axi_x                      ( axi_x         ) , .axi_y                      ( axi_y         ) ,.pi_data                    ( po_data       ) ,.pi_flag                    ( po_flag       ) ,.clk_wr_ram                 ( clk_rx        ) ,.H_SYNC                     ( H_SYNCtoDIS   ) ,.H_BACK                     ( H_BACKtoDIS   ) ,.H_DISP                     ( H_DISPtoDIS   ) ,.V_SYNC                     ( V_SYNCtoDIS   ) ,.V_BACK                     ( V_BACKtoDIS   ) ,.V_DISP                     ( V_DISPtoDIS   ) ,.pix_data                   ( pix_data      )                    
);rx rx_inst(.sys_clk                    ( clk_rx        ) ,.sys_rst_n                  ( rst_n         ) ,.rx                         ( rx            ) ,.po_data                    ( po_data       ) ,.po_flag                    ( po_flag       )  
);endmodule

 

上板验证:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/205200.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows下搭建Tomcat HTTP服务,发布公网远程访问

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器&#xff0c;不仅名字很有趣&#xff0…

C语言——数组转换

将的两行三列数组转换为三行两列的数组 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int a[2][3]{{1,2,3},{4,5,6}};int b[3][2],i,j;for ( i 0; i <1; i){for ( j 0; j <2; j){printf("%5d",a[i][j]);b[j][i]a[i][j];}printf(&…

LTD253次升级 | 官网“活动“增报名 • 名片展示个人简介 • 合伙人设置个性邀请码

1、活动类型支持报名&#xff1b; 2、产品详情页支持房产类型产品的地图显示&#xff1b; 3、官微名片独立版支持个人简介&#xff1b; 4、多语言系统支持挪威语&#xff1b; 5、极速官微首页提速、合伙人页面优化&#xff1b; 6、 已知问题优化与修复&#xff1b; 01网站编辑器…

Mysql8.1.0 安装问题-缺少visual studio 2019x64组件

缺少visual studio x64组件的问题 使用Mysql8以上的安装包mysql-8.1.0-winx64.msi进行安装&#xff0c; 提示缺少visual studio 2019 x64可再发行组件 在微软官网下载vc可再发行程序包 Microsoft Visual C 可再发行程序包最新支持的下载 在Visual Studio 2015、2017、2019 和…

Arch Linux 安装 dwm 窗口管理器

窗口管理器是管理桌面上各种窗口的组件&#xff0c;主要功能有&#xff1a;窗口堆叠方式&#xff0c;窗口移动规则等。大多数人接触到的是堆叠式窗口管理器&#xff0c;一个窗口可以叠放在其他窗口之上&#xff0c;调整窗口的主要方式是鼠标。而dwm&#xff08;Dynamic Window …

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

文章目录 一、异常处理1、异常概念引入2、抛出异常语法3、捕获异常语法4、异常捕获流程 二、异常处理代码示例1、错误代码示例 - 抛出异常 / 不捕获异常2、正确代码示例 - 抛出异常 / 捕获异常3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常 一、异常处理 1、异常概…

端口隔离度

端口隔离度 隔离度为&#xff08;本振或射频信号&#xff09;泄漏到其他端口的功率与输入功率之比&#xff0c;单位是dB。 比如 RF to LO Isolation 表示 射频输入信号的功率 与 泄漏到LO端口的功率 之比。 而 LO to RF Isolation 则表示 本振输入信号的功率 与 泄漏到RF端口的…

Cytoscape学习教程

写在前面 今天分享的内容是自己遇到问题后,咨询社群里面的同学,帮忙解决的总结。 关于Cytoscape,对于做组学或生物信息学的同学基本是陌生的,可能有的同学用这个软件作图是非常溜的,做出来的网络图也是十分的好看,“可玩性”很高,就像前面分享的aPEAR包一样aPEAR包绘制…

List操作的一些常见问题

文章目录 阿里巴巴开发手册强制规约&#xff1a;1. Arrays.asList转换基本类型数组2. Arrays.asList返回的List不支持增删操作3. 对原始数组的修改会影响到我们获得的那个List4. ArrayList.subList强转ArrayList导致异常5. ArrayList中的subList切片造成OOM6.Copy-On-Write 是什…

C语言——从键盘输人一个表示年份的整数,判断该年份是否为闰年,并显示判断结果。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int year 0;printf("请输入年份&#xff1a;");scanf("%d",&year);if((year%4 0) && (year%100!0) || (year%400 0)){printf("%d是闰年\n",year);}else{p…

QML Label 属性 pyside6

基本属性 text: 显示的文本内容 Label {text: "Hello, World!" }color: 文本颜色 Label {color: "blue" }font: 字体设置&#xff0c;包括 family、pointSize、weight 和 style Label {font.family: "Arial"font.pointSize: 20font.bold: tr…

set与map

set与map 一、序列式容器与关联式容器二、pair1、键值对2、作用3、构造函数4、make_pair&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;作用 5、代码6、运行结果 三、set1、概念2、代码3、运行结果4、说明 四、multiset1、与set的关系2、代码3、运行结果 五、map…

【新手解答1】深入探索 C 语言:变量名、形参 + 主调函数、被调函数 + 类和对象 + 源文件(.c 文件)、头文件(.h 文件)+ 库

C语言的相关问题解答 写在最前面目录 问题1变量名与变量的关系与区别变量和数据类型形参&#xff08;形式参数&#xff09;的概念 问题2解析&#xff1a;主调函数和被调函数延伸解析&#xff1a;主调函数对于多文件程序的理解总结 问题3类和对象变量和数据类型变量是否为抽象的…

ArcGIS中基于人口数据计算人口密度的方法

文章目录 一、密度分析原理二、点密度分析三、线密度分析四、核密度分析一、密度分析原理 密度分析是指根据输入的要素数据集计算整个区域的数据聚集状况,从而产生一个联系的密度表面。通过密度计算,将每个采样点的值散步到整个研究区域,并获得输出栅格中每个像元的密度值。…

嵌入式八股 | 校招秋招 | 笔试面试 | 精选题目

欢迎关注微信公众号【赛博二哈】获取八股PDF 并加入嵌入式求职交流群。提供简历模板、学习路线、岗位整理等 欢迎加入知识星球【嵌入式求职星球】获取完整嵌入式八股。 提供简历修改、项目推荐、求职规划答疑。另有各城市、公司岗位、笔面难题、offer选择、薪资爆料等 嵌入式…

分布式数据恢复-hbase+hive分布式存储误删除如何恢复数据?

hbasehive分布式存储数据恢复环境&#xff1a; 16台某品牌R730XD服务器节点&#xff0c;每台物理服务器节点上有数台虚拟机&#xff0c;虚拟机上配置的分布式&#xff0c;上层部署hbase数据库hive数据仓库。 hbasehive分布式存储故障&初检&#xff1a; 数据库文件被误删除…

十八、初识elasticsearsh (索引)

目录 一、Elasticsearch的介绍&#xff1a; 二、正向索引和倒排索引 1、正向索引 2、倒排索引 3、索引(index) :相同类型的文档的集合 4、映射(mapping):索引中文档的字段约束信息&#xff0c;类似表的结构约束 一、Elasticsearch的介绍&#xff1a; Elasticsearch是一个…

企业数字化转型的作用是什么?_光点科技

在当今快速变化的商业环境中&#xff0c;数字化转型已成为企业发展的重要策略。企业数字化转型指的是利用数字技术改造传统业务模式和管理方式&#xff0c;以提升效率、增强竞争力和创造新的增长机会。 提升运营效率&#xff1a;数字化转型通过引入自动化工具和智能系统&#x…

JVM——产生内存溢出原因

目录 1.产生内存溢出原因一 &#xff1a;代码中的内存泄漏1.案例1&#xff1a;equals()和hashCode()导致的内存泄漏问题&#xff1a;**正常情况**&#xff1a;**异常情况&#xff1a;**解决方案&#xff1a; 2.案例2&#xff1a;内部类引用外部类问题&#xff1a;解决方案&…

计算机网络——网络可靠性及网络出口配置

1. 前言&#xff1a; 学习目标&#xff1a; 1.了解链路聚合的作用 2. 了解ACL的工作原理 3. 了解NAT的工作原理和配置 2. 网络可靠性方案 网络可靠性是指网络在面对各种异常情况或故障时&#xff0c;能够维持正常运行和提供服务的能力。这包括防止网络中断、减小数据丢失的可能…