您的位置:首页 > 其它

基于basys2驱动LCDQC12864B的verilog设计图片显示

2017-01-22 17:51 555 查看
  话不多说先上图

module lcd_qc12864b(
input mclk,
input rst_n,
output reg lcd_rs,//H读写数据,L指令
output lcd_rw, //高电平读操作,低电平写操作
output lcd_e,//使能信号高电平有效
output reg [7:0]lcd_data,//八位数据总线
output psb,//串并控制端口,H为并行,L为串行,直接接5v
output lcd_rst//液晶的复位端口,低电平有效
);

reg lcd_clk;//需要500khz频率的时钟
reg [7:0] state;//状态机寄存器
reg [23:0] cnt;//分频驱动12864计数器
reg flag = 1'b1;//显示完成标志
reg [9:0] char_cnt;//
wire [7:0] data_disp;//一个字节是八位,一个英文字符是一个字节,中文是俩个字节
reg [5:0] cnt1;//行计数

parameter T500KHZ=24'd49999;

//分频500khz时钟
always @(posedge mclk or negedge rst_n)
begin
if(!rst_n)begin
lcd_clk <= 1'b0;
cnt <= 24'd0;
end
else if(cnt == T500KHZ)begin
cnt <= 24'd0;
lcd_clk <= ~lcd_clk;
end
else
cnt <= cnt + 1'd1;
end

//状态机8个状态设置
parameter IDLE = 8'b00_000_000,//初始状态
SETFUNCTION = 8'b00_000_001,//功能设置
SWITCHMODE = 8'b00_000_010,//设置显示开和光标闪烁关闭
CLEAR = 8'b00_000_100,//清屏操作
SETDDRAM_Y = 8'b00_010_000,//设置y轴坐标
SETDDRAM_X = 8'b00_100_000,//设置x轴坐标
WRITERAM = 8'b01_000_000,//写设置写入寄存器
STOP = 8'b10_000_000;//LCD操作停止,释放其控制

//三段式书写状态机
always @(posedge lcd_clk or negedge rst_n)
begin
if(!rst_n)
lcd_rs <= 1'b0;
else begin
if(state == WRITERAM)
lcd_rs <= 1'b1;//写数据模式
else
lcd_rs <= 1'b0;//写命令模式
end
end

//lcd_rst始终为高电平,psb始终为低电平即可
assign lcd_rst = 1'b1;
assign psb = 1'b1;
assign lcd_rw = 1'b0;//只是写操作,不需要读操作
assign lcd_e = (flag==1)?lcd_clk:1'b0;//使能信号与液晶时钟同步

always @(posedge lcd_clk or negedge rst_n)
begin
if(!rst_n)begin
cnt1<= 1'b0;
state <= IDLE;
lcd_data <= 8'hzz;
char_cnt <= 6'd0;
end
else begin
case(state)
IDLE:begin
state <=  SETFUNCTION;//功能设置,8-bit+基本指令集0x30
lcd_data <= 8'h36;
end

SETFUNCTION:begin
state <= SWITCHMODE;//设置显示开和光标闪烁关闭
lcd_data <= 8'h36;
end

SWITCHMODE:begin
state <= CLEAR;
lcd_data <= 8'h3e;//显示设置,全显示开,光标和闪烁关
end
CLEAR:begin//清屏操作
state <= SETDDRAM_Y;//点设置
lcd_data <= 8'h01;//清屏
end
SETDDRAM_Y:begin
if(cnt1< 32)
lcd_data <= 8'h80 + cnt1;//80H~9fH
else
lcd_data <= 8'h80 + (cnt1- 32); //80H~9fH

state <= SETDDRAM_X;
end
SETDDRAM_X:begin
if(cnt1< 32)
lcd_data <=  8'h80;            //80H
else
lcd_data <=  8'h88;            //88H
state <= WRITERAM;
end
WRITERAM:begin
lcd_data <= data_disp;
char_cnt <= char_cnt + 1'b1;
if(char_cnt[3:0] == 4'hf)begin      //计算行
cnt1<= cnt1+ 1'b1;
if(cnt1== 63)
state <= STOP;
else
state <= SETDDRAM_Y;
end
else
state <= WRITERAM;
end
STOP:begin
flag <= 1'b0;
state <= STOP;//LCD操作停止,释放其控制
end
default: state <= IDLE;//回到初始状态
endcase
end
end

// ROM
rom U1_rom (
.clka(mclk),
.addra(char_cnt),
.douta(data_disp)
);

endmodule


lcd_qc12864b

配置ROM

  有分布式ROM/ROM和块ROM/RAM,这里配置的是块ROM/RAM。这两种方式具体我也不是了解很深,以后再深入学习。

该实验最让我头疼的是调用ROM,第一次接触IP核有许多地方都完全不懂。用LCD(带中文字库)显示文字的时候,可以直接输入文字的十六进制数值,设置显示地址坐标即可,12864显示原理点阵控制点的亮灭来实现,但是如果要显示图片的话一个个输入难免太过麻烦,这个时候调用ROM就方便许多。找一张或做一张像素为128x64的单色图片,使用取模软件,按c51的方式取模。取模出来的数据为十六进制,行8个,64个。



配置块RAM/ROM时,要加载的是.coe文件,所以需要将取模的十六进制数据保存到.coe文件中。最开始我一直在找如何能直接将图片取模出来的数据转化成.coe文件,试了很多方法都失败了,最后发现完全可以自己按文件格式编辑一个即可,最终文件保存格式如下。



  将图片取模出来的每个数据前的ox去掉,这只是C语言中16进制的表示形式,文件第一行的MEMORY_INITIALIZATION_RADIX=16;表示数据全都为16进制数,这里的16可以换成8、2、10都行。

打开ISE建立工程后,新建文件,选择IP(CORE Generator & Architecture Wizard),填写文件名,next



  找到Memories & Storage Elements单击,选择RAMs & ROMs单击,选择Block Memory Generator 7.3,next,finish。





  上面直接next,下面这里选Single Port ROM,next





  这里要填写数据位宽和深度,位宽是你所需要输出的数据位宽,LCD有8个数据位,故这里定义位宽为8,深度即有多少个这样的数据,从取模出来的数据看,易得共有1024个数据位。我使用的basys2开发板使用的是Xilinx Spantan3E—100TQ144 FPGA包含73728位的块RAM/ROM。因此,使用的块RAM的最大容量为9216字节或4608个16位字。从这里来看,是完全够用的。

  Next,加载.coe数据文件,勾选Load Init File 加载.coe文件,我这里是在桌面上保存着,直接找到选择就好。



  然后一直点击next直至最后一个界面,最后点击Generate,生成rom.xco。生成的IP核在工程目录下的ipcore_dir文件中。





  将rom.v文件打开端口定义如下,直接在顶层文件对其实例化,如代码所示





  最后可直接仿真,新建tb文件查看仿真传输数据是否正确。由波形图可得在功能设定指令传输完毕后,进入读数据状态,所读入的数据与文件中数据相符,一行数据传输完毕进入下一行,继续读入数据,仿真图结果正确。下板子也正确。



  最开始学习FPGA,最容易出现的就是两个问题,一个是把verilog当C语言来写,另一个就是把FPGA当单片机来用。前者我已经有了改善,后者我还需要继续努力。



转载请注明出处:NingHeChuan(宁河川)

个人微信订阅号:NingHeChuan

如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号

知乎ID:NingHeChuan

微博ID:NingHeChuan

原文地址:http://www.cnblogs.com/ninghechuan/p/6340691.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: