
/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显示不支持芯片等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)