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

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

/LCD12864显示程序

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

图形文件获取方法:

在字模提取V21软件中 ,导入一幅12864黑白图像

参数设置:

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

取模方式为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教你。

1、下载线有问题;

2、生成配置文件时设置有问题,比如少生成了某种文件或进行了压缩等;

3、硬件电路的模式选择有问题,是配置FPGA还是烧写flash还是下载CPLD,一般都有拨码开关进行选择;

4、配置文件大小是否超出了FPGA容量。

你的提问比较笼统,也只能大概的猜测回答了。

数据进出管脚烧坏了。fpga是程序,显示链检测不到,是数据进出管脚烧坏了,只能换芯片了,因此是数据进出管脚烧坏了。芯片是指内含集成电路的硅片,体积很小,常常是计算机或其他电子设备的一部分。

你买的fpga是基于sram的工艺,掉电程序确实会消失,只是在运行时程序存在sram中。JTAG一般用来调试,在通电的情况下把程序烧到sram中,断电又没了;AS是主动模式,fgpa在上电的时候主动从epcs芯片中读取数据放到sram中,这样也能工作了,每次上电那一瞬间fpag都会从epcs里读取数据然后正常工作,所以用起来像是烧到fpga里一样。PS就是被动模式,由一个外部的CPU给fpga输入程序,用的不太多。所以,你想“程序烧到内部”,应该是用AS模式把程序烧到EPCS里,每次上电的时候fpga都会从中读取数据然后正常运行的。看起来就像是烧到fpga里面一样。如果要“真的”烧到fpga里面,是有基于flash工艺的fpga,可以直接烧到fpga里面的flash里,也就不需要ecps芯片了,不过商业或者民用领域不太常用。

你买的这个板子也不是这种。

on-chip-memery就是fpga用内部的资源撘成一个ram或者rom。fpga里面都是ram,这个没问题。那rom其实也是一个ram,只是上电的时候fpga从epcs里面读取了固定的信息放到这个ram里,所以用起来就像rom一样。

获取fpga芯片型号信息:像ROM读写模块,滤波模块,按键显示控制模块,都是逻辑可以实现的,所以可以直接写FPGA程序实现相应的接口。这种常见的Altera Xilinx都可以。

如果型号以EPM开头,即MAX系列(其中MAX代表阵列矩阵),就是CPLD,ALTERA公司的FPGA产品系列代码为EP或EPF。

典型产品型号含义如下: EPF10K10:FLEX10K系列FPGA,典型逻辑规模是10K有效逻辑门。 EPF10K30E:FLEX10KE系列FPGA,逻辑规模是EPF10K10的3倍。

基本结构:

FPGA 器件属于专用集成电路中的一种半定制电路,是可编程的逻辑列阵,能够有效的解决原有的器件门电路数较少的问题。FPGA 的基本结构包括可编程输入输出单元,可配置逻辑块,数字时钟管理模块,嵌入式块RAM,布线资源,内嵌专用硬核,底层内嵌功能单元。

由于FPGA具有布线资源丰富,可重复编程和集成度高,投资较低的特点,在数字电路设计领域得到了广泛的应用。FPGA的设计流程包括算法设计、代码仿真以及设计、板机调试,设计者以及实际需求建立算法架构。

FPGA 查找表功能实现:

查找表(Look-Up-Table)简称为LUT,LUT本质上就是一个RAM。目前FPGA中多使用4输入的LUT,所以每一个LUT可以看成一个有4位地址线的16x1的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路以后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。

CPLD更适合完成各种算法和组合逻辑,FPGA更适合于完成时序逻辑。换句话说,FPGA更适合于触发器丰富的结构,而CPLD更适合于触发器有限而乘积项丰富的结构。

CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而FPGA的分段式布线结构决定了其延迟的不可预测性。

在编程上FPGA比CPLD具有更大的灵活性。CPLD通过修改具有固定内连电路的逻辑功能来编程,FPGA主要通过改变内部连线的布线来编程;FPGA可在逻辑门下编程,而CPLD是在逻辑块下编程。

FPGA的集成度比CPLD高,具有更复杂的布线结构和逻辑实现。

CPLD比FPGA使用起来更方便。CPLD的编程采用E2PROM或FASTFLASH技术,无需外部存储器芯片,使用简单。而FPGA的编程信息需存放在外部存储器上,使用方法复杂。

CPLD的速度比FPGA快,并且具有较大的时间可预测性。这是由于FPGA是门级编程,并且CLB之间采用分布式互联,而CPLD是逻辑块级编程,并且其逻辑块之间的互联是集总式的。

在编程方式上,CPLD主要是基于E2PROM或FLASH存储器编程,编程次数可达1万次,优点是系统断电时编程信息也不丢失。CPLD又可分为在编程器上编程和在系统编程两类。FPGA大部分是基于SRAM编程,编程信息在系统断电时丢失,每次上电时,需从器件外部将编程数据重新写入SRAM中。其优点是可以编程任意次,可在工作中快速编程,从而实现板级和系统级的动态配置。

CPLD保密性好,FPGA保密性差。

一般情况下,CPLD的功耗要比FPGA大,且集成度越高越明显。

fpgainit_bdone拉高后又变低是外部程序控制和电源波动。

1、外部程序控制:有些FPGA的开发板上会有一个RESET按钮或者其他控制信号。这些控制信号被拉低,FPGA会重新启动,并重新开始初始化过程,导致fpgainit_bdone信号再次变低。

2、电源波动:FPGA初始化过程对电源的要求非常高。如果电源质量不好或者电源波动较大,会导致fpgainit_bdone信号再次变低。

以上就是关于用FPGA编写12864显示的程序,跪求。。。可以显示就行,内容可以是字母。。谢谢全部的内容,包括:用FPGA编写12864显示的程序,跪求。。。可以显示就行,内容可以是字母。。谢谢、FPGA的实验程序写不进去有哪些可能性、fpga显示不支持芯片等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9805393.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存