当前位置:首页 > 代码 > 正文

fpga直方图源代码(fpga直方图均衡)

admin 发布:2022-12-19 21:31 104


今天给各位分享fpga直方图源代码的知识,其中也会对fpga直方图均衡进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

求求RS(255,239)的FPGA源码,含编码和解码

PL2303 是Prolific 公司的RS232-USB 接口转换器,可提供一个RS232 全双工异步串行通信装置与USB 功能接口便利联接的解决方案,可调节的3~5 V 输出电压,满足3V、3.3V和5V不同应用需求;支持完整的RS232接口。 你用FPGA直接与串口通信,长时间肯定是要丢包的,只是你测试使用短,又是常温下,现象不明显;你看下RS232的电气特性就知道了: EIA-RS-232C 对电器特性、逻辑电平和各种信号线功能都作了规定。  在TxD和RxD上: 逻辑1(MARK)=-3V~-15V 逻辑0(SPACE)=+3~+15V  在RTS、CTS、DSR、DTR和DCD等控制线上: 信号有效(接通,ON状态,正电压)=+3V~+15V 信号无效(断开,OFF状态,负电压)=-3V~-15V 而FPGA的接口通常使用的都是 LVTTL或CMOS的, 电气特性上就决定了不能直接通信。

求一个基于fpga的i2c总线控制器的源代码

// eeprom 24c02,08,16 radom byte read and write master

// author: jiajia.pi

// version: v1.2

// last modify date: 2014/08/19 change busy signal to ready

// clk_div range: 2~65535

// wr/rd bit is bit16 of wrdata, '0'=write, '1'=read

module i2c_master(

clk, // global clock

reset_n, // global reset

scl, // i2c tri-state clock

sda, // i2c tri-state data

addr, // i2c word address

wrdata, // i2c 24bit write data, include device address, word address, 8bit write datas

rddata, // i2c 8bit read data

ready, // i2c ready output, assert high

ack // i2c acknowledge output

);

parameter [15:0] clk_div = 27_000_000/50_000-1; // i2c clock divsion

input clk;

input reset_n;

input wr;

input rd;

input [23:0]wrdata;

output [7:0]rddata;

output busy;

output ack;

inout scl;

inout sda;

reg [23:0]dat;

reg sco;

reg sdo;

reg [7:0]rddata;

reg busy;

reg ack1,ack2,ack3;

wire sda = sdo?1'bz:0;

wire scl = (sco|i2c_clk)?1'bz:0;

wire ready = !(wr||rd||busy);

wire rdnwr = dat[16];

wire ack = ack1|ack2|ack3;

reg[15:0] cnt;

always@(posedge clk or negedge reset_n)

if(!reset_n)

cnt = 0;

else if(cntclk_div busy)

cnt = cnt + 1;

else

cnt = 0;

wire i2c_clk_high_pos = (cnt==(clk_div2));

wire i2c_clk_low_pos = (cnt==(3*clk_div2));

wire i2c_dout_pos = (cnt==(clk_div));

wire i2c_din_pos = (cnt==(clk_div1));

reg i2c_clk;

always@(posedge clk or negedge reset_n)

if(!reset_n)

i2c_clk = 0;

else if(i2c_clk_high_pos)

i2c_clk = 1;

else if(i2c_clk_low_pos)

i2c_clk = 0;

reg [5:0] sck_cnt;

always@(posedge clk or negedge reset_n)

if(!reset_n)

sck_cnt = 63;

else if(rd|wr !busy)

sck_cnt = 0;

else if(!rdnwr sck_cnt==19 i2c_dout_pos)

sck_cnt = 22;

else if(rdnwr sck_cnt==30 i2c_dout_pos)

sck_cnt = 33;

else if(sck_cnt44 i2c_dout_pos)

sck_cnt = sck_cnt + 1;

always@(posedge clk or negedge reset_n)

if(!reset_n)

dat = 0;

else if(rd|wr !busy)

dat = wrdata;

always@(posedge clk or negedge reset_n)

if(!reset_n)

sdo = 1;

else if(i2c_dout_pos)

case(sck_cnt)

0: sdo = 1;

// write start

1: sdo = 0;

// device address

2: sdo = dat[23];

3: sdo = dat[22];

4: sdo = dat[21];

5: sdo = dat[20];

6: sdo = dat[19];

7: sdo = dat[18];

8: sdo = dat[17];

9: sdo = 0; //device write

10: sdo = 1; // ack1

// word address

11: sdo = dat[15];

12: sdo = dat[14];

13: sdo = dat[13];

14: sdo = dat[12];

15: sdo = dat[11];

16: sdo = dat[10];

17: sdo = dat[9];

18: sdo = dat[8];

19: sdo = 1; // ack2

// read start

20: sdo = 1;

21: sdo = 0;

// write data

22: if(rdnwr) sdo = dat[23]; else sdo = dat[7];

23: if(rdnwr) sdo = dat[22]; else sdo = dat[6];

24: if(rdnwr) sdo = dat[21]; else sdo = dat[5];

25: if(rdnwr) sdo = dat[20]; else sdo = dat[4];

26: if(rdnwr) sdo = dat[19]; else sdo = dat[3];

27: if(rdnwr) sdo = dat[18]; else sdo = dat[2];

28: if(rdnwr) sdo = dat[17]; else sdo = dat[1];

29: if(rdnwr) sdo = 1; else sdo = dat[0];

30: sdo = 1; // write ack3

// write stop

31: sdo = 0;

32: sdo = 1;

// read data

33: sdo = 1; // bit 7

34: sdo = 1; // bit 6

35: sdo = 1; // bit 5

36: sdo = 1; // bit 4

37: sdo = 1; // bit 3

38: sdo = 1; // bit 2

39: sdo = 1; // bit 1

40: sdo = 1; // bit 0

41: sdo = 1; // read no ack

// read stop

42: sdo = !rdnwr;

43: sdo = 1;

endcase

always@(posedge clk or negedge reset_n)

if(!reset_n)

rddata = 0;

else if(i2c_din_pos)

case(sck_cnt)

34: rddata[7]= sda;

35: rddata[6]= sda;

36: rddata[5]= sda;

37: rddata[4]= sda;

38: rddata[3]= sda;

39: rddata[2]= sda;

40: rddata[1]= sda;

41: rddata[0]= sda;

endcase

always@(posedge clk or negedge reset_n)

if(!reset_n)

ack1 = 1;

else if(i2c_din_pos sck_cnt==11)

ack1 = sda;

always@(posedge clk or negedge reset_n)

if(!reset_n)

ack2 = 1;

else if(i2c_din_pos sck_cnt==20 rdnwr) // read ack2

ack2 = sda;

else if(i2c_din_pos sck_cnt==22 !rdnwr) // write ack2

ack2 = sda;

always@(posedge clk or negedge reset_n)

if(!reset_n)

ack3 = 1;

else if(i2c_din_pos sck_cnt==31 !rdnwr) // write ack3

ack3 = sda;

else if(i2c_din_pos sck_cnt==33 rdnwr) // read ack3

ack3 = sda;

always@(posedge clk or negedge reset_n)

if(!reset_n)

sco = 1;

else if(sck_cnt==2 i2c_clk_low_pos) // write start

sco = 0;

else if(sck_cnt==21 i2c_clk_low_pos rdnwr) // read start high

sco = 1;

else if(sck_cnt==22 i2c_clk_low_pos rdnwr) // read start low

sco = 0;

else if(sck_cnt==32 i2c_clk_low_pos !rdnwr) // write stop

sco = 1;

else if(sck_cnt==43 i2c_clk_low_pos) // read stop

sco = 1;

always@(posedge clk or negedge reset_n)

if(!reset_n)

busy = 0;

else if(rd|wr !busy)

busy = 1;

else if(sck_cnt==44)

busy = 0;

endmodule

我自己写的,希望能帮到你

用FPGA编写12864显示的程序,跪求。。。可以显示就行,内容可以是字母。。谢谢

/*LCD12864显示程序

此程序控制LCD12864液晶屏,IC为KS0108或兼容型号

图形文件获取方法:

在字模提取V21软件中 ,导入一幅128*64黑白图像.

* 参数设置:

* 参数设置-其它选项,选择纵向取模,勾上字节倒序,保留逗号,

* 取模方式为C51。

将生成的数组通过keilc等C编译软件,在编译软件中新建一工程,写入源程序如下:

unsigned char code tab[]=

{

//图像数据

}

编译此工程将得到hex文件.在QII中使用lpm_rom宏功能模块中调用此hex文件.

*

*******************************************************************************/

module newlcd(clock,rst_n,rs,rw,en,data,lcd_cs);

// I/O口声明

input clock; //系统时钟

input rst_n; //复位信号

output[1:0] lcd_cs; //

output rs; //1:数据模式;0:指令模式

output rw; //1:读操作;0:写操作

output en; //使能信号,写操作时在下降沿将数据送出;读操作时保持高电平

output[7:0] data; //LCD数据总线

// I/O寄存器

reg rs;

reg en;

reg[1:0] lcd_cs;

reg[7:0] data;

//内部寄存器

reg[3:0] state; //状态机

reg[3:0] next_state;

reg[20:0] div_cnt; //分频计数器

reg[9:0] cnt; //写操作计数器

reg cnt_rst; //写操作计数器复位信号

wire[7:0] showdata; //要显示的数据

reg[1:0] cs_r;

reg [2:0] page_addr;

reg [5:0] row_addr;

//内部网线

wire clk_div; //分频时钟

wire clk_divs;

wire page_done; //写一行数据完成标志位

wire frame_done; //写一屏数据完成标志位

wire left_done;

//状态机参数

parameter idle =4'b0000,

setbase_1 =4'b0001,

setbase_2 =4'b0011,

setmode_1 =4'b0010,

setmode_2 =4'b0110,

SETpage_addr_1 =4'b0111,

SETpage_addr_2 =4'b0101,

SETrow_addr_1 =4'b1101,

SETrow_addr_2 =4'b1111,

write_right_1 =4'b1110,

write_right_2 =4'b1010,

write_nextpage_1 =4'b1011,

write_nextpage_2 =4'b1001,

wr_data_1 =4'b0100,

wr_data_2 =4'b1100;

// set_1 =4'b1000;

//******************************代码开始*********************************

assign rw = 1'b0; //对LCD始终为写操作

//时钟分频

always@(posedge clock or negedge rst_n)

begin

if(!rst_n)

div_cnt = 0;

else

div_cnt = div_cnt+1'b1;

end

assign clk_div = (div_cnt[15:0] == 20'h7fff);

//状态机转向

always@(posedge clock or negedge rst_n)

begin

if(! rst_n)

state = idle;

else if(clk_div)

state = next_state;

end

//************************状态机逻辑*********************************

always@(state or page_done or left_done or frame_done or cnt or showdata or page_addr or row_addr or cs_r)

begin

rs = 1'b0;

en = 1'b0;

lcd_cs = cs_r;

cnt_rst = 1'b0;

data = 8'h0;

case(state)

idle:

begin

next_state = setbase_1;

cnt_rst = 1'b1;

end

//**************************初始化LCD********************************

setbase_1: //基本指令操作

begin

lcd_cs = 2'b11;

next_state = setbase_2;

data = 8'hc0;

en = 1'b1;

end

setbase_2:

begin

lcd_cs = 2'b11;

next_state = setmode_1;

data = 8'hc0;

end

//******************************************************************

setmode_1:

begin

lcd_cs = 2'b11;

next_state = setmode_2;

data = 8'h3f;

en =1'b1;

end

setmode_2:

begin

next_state = SETpage_addr_1;

data = 8'h3f;

end

//******************************************************************

SETpage_addr_1: //设置页地址

begin

next_state = SETpage_addr_2;

data = ;

en = 1'b1;

end

SETpage_addr_2:

begin

next_state = SETrow_addr_1;

data = ;

end

SETrow_addr_1: //设置列地址

begin

next_state = SETrow_addr_2;

data = ;

en = 1'b1;

end

SETrow_addr_2:

begin

next_state = wr_data_1;

data = ;

end

//******************************************************************

/*

write_right_1: //写完左半屏64个,换为右半屏显示

begin

next_state =write_right_2;

row_addr = 0;

end

write_right_2:

begin

next_state = SETpage_addr_1;

end

//******************************************************************

write_nextpage_1: //写完全一行128个

begin

next_state =write_nextpage_2;

row_addr = 0;

end

write_nextpage_2:

begin

next_state = SETpage_addr_1;

end

*/

//******************************************************************

wr_data_1: //写数据到图形显示区

begin

next_state = wr_data_2;

rs = 1'b1;

en = 1'b1;

data = showdata;

end

wr_data_2:

begin

rs = 1'b1;

data = showdata;

if(left_done) //写完左半屏数据64个

begin

if(page_done) //写完一页数据128个

begin

if(frame_done) //写完一屏数据(8页)

next_state = idle;

else

// next_state = write_nextpage_1;

next_state = SETpage_addr_1;

end

else

// next_state = write_right_1;

next_state = SETpage_addr_1;

end

else

next_state = wr_data_1;

end

default: next_state = idle;

endcase

end

//********************************************************************

always@(posedge clock)

begin

if(clk_div)

begin

if(cnt_rst)

begin

cnt = 0;

end

else if(state == wr_data_2)

begin

cnt = cnt+1'b1;

end

end

end

//****************************************************

always@(posedge clock or negedge rst_n)

if(!rst_n)

begin

cs_r = 2'b01;

page_addr = 0;

end

else

if(clk_div (state == wr_data_2))

if(page_done)//

begin

cs_r = 2'b01;

page_addr = page_addr + 1'b1;//一页写完时写下一页

end

else

if(left_done)

begin

cs_r = 2'b10;

end

//*********************************************************************

//********************************************************************

assign left_done = (cnt[5:0] == 6'd63); //写完左半屏数据64个

assign page_done = (cnt[6:0] == 7'd127); //写完一页数据128个

assign frame_done = (cnt[9:4] == 7'h3f); //写完一屏数据

//***********************************************************************

//*******************************************************************

//调用ROM(图片数据)

rom rom(.address(cnt+'d8),.clock(clock),.q(showdata));

endmodule

开发板例程 自己看吧

我可以帮助你,你先设置我最佳答案后,我百度Hii教你。

fpga直方图源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于fpga直方图均衡、fpga直方图源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/25231.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载