求一片用verilog鱼呀写的基于fpga的lcd1602显示实时数据的程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一片用verilog鱼呀写的基于fpga的lcd1602显示实时数据的程序相关的知识,希望对你有一定的参考价值。

参考技术A module LCD_Driver(clk,rst,lcd_rs,lcd_en,lcd_rw,lcd_data,f0,f1,f2,d0,d1,d2,sel);
input clk,rst;//时钟、复位
input [3:0] f0 ;//频率、占空比、档位输入
input [3:0] f1 ;
input [3:0] f2 ;
input [3:0] d0 ;
input [3:0] d1 ;
input [3:0] d2 ;
input [3:0] sel ;
output lcd_rs,lcd_en,lcd_rw;//指令/数据控制、片选、读写控制、背光控制
output [7:0] lcd_data;//数据线

reg lcd_rs;//指令/数据控制
reg [7:0] lcd_data;//数据线
reg [7:0] current_state;//当前状态
reg [1:0] state_counter;//状态计数
reg en_temp;//使能标志
reg [15:0] clk_counter;//时钟计数
reg clk_en;//时钟使能
//reg [7:0] ps_datain_temp;

assign lcd_rw=1'b0;//一直为写状态
/********************状态编码******************************/
parameter set0=8'b0000_0000,
set1=8'b0000_0001,
set2=8'b0000_0011,
set3=8'b0000_0100,
set4=8'b0000_0101,
set5=8'b0000_0110,
data1=8'b0000_1000,
data2=8'b0000_1001,
data3=8'b0000_1010,
data4=8'b0000_1011,
data5=8'b0000_1100,
data6=8'b0000_1101,
data7=8'b0000_1110,
data8=8'b0000_1111,
data9=8'b0001_0000,
data10=8'b0001_0001,
data11=8'b0001_0010,
data12=8'b0001_0011,
data13=8'b0001_0100,
data14=8'b0001_0101,
data15=8'b0001_0110,
data16=8'b0001_0111,
data17=8'b0001_1000,
data18=8'b0001_1001,
data19=8'b0001_1010,
data20=8'b0001_1011,
data21=8'b0001_1100,
data22=8'b0001_1101,
data23=8'b0001_1110,
data24=8'b0001_1111,
data25=8'b0010_0001,
data26=8'b0010_0010,
data27=8'b0010_0011,
data28=8'b0010_0100,
data29=8'b0010_0101,
data30=8'b0010_0110,
data31=8'b0010_0111,
data32=8'b0010_1000,
stop=8'b1111_1111;
/**************状态转换时钟***********************/

always @(posedge clk)
begin
if(clk_counter==16'h6000)
begin
clk_counter<=16'h0;
clk_en<=~clk_en;
end
else
clk_counter<=clk_counter+1'b1;
end
/**************状态转换**************************///

always @(posedge clk_en or negedge rst)
begin
if(!rst)
begin
current_state<=set0;
end
else
begin
case (current_state)
/*********************************************************************************/
set0:begin lcd_rs<=1'b0;lcd_data<=8'h38;current_state<=set1; end//显示模式设置
set1:begin lcd_rs<=1'b0;lcd_data<=8'h0c;current_state<=set2; end//显示开及光标设置
set2:begin lcd_rs<=1'b0;lcd_data<=8'h06;current_state<=set3; end//显示光标移动设置
set3:begin lcd_rs<=1'b0;lcd_data<=8'h01;current_state<=set4; end//显示清屏
set4:begin lcd_rs<=1'b0;lcd_data<=8'h80;current_state<=data1; end//设置第一行地址
/***********************************************************************************/
data1:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data2; end//显示第1个字符
data2:begin lcd_rs<=1'b1;lcd_data<="F";current_state<=data3; end//显示第2个字符
data3:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data4; end//显示第3个字符
data4:begin lcd_rs<=1'b1;lcd_data<="=";current_state<=data5; end//显示第4个字符
data5:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data6; end//显示第5个字符
data6:begin lcd_rs<=1'b1;lcd_data<=f0+"0";current_state<=data7; end//显示第6个字符
data7:begin lcd_rs<=1'b1;lcd_data<=f1+"0";current_state<=data8; end//显示第7个字符
data8:begin lcd_rs<=1'b1;lcd_data<=f2+"0";current_state<=data9; end//显示第8个字符

data9:begin lcd_rs<=1'b1;lcd_data<="x";current_state<=data10; end//显示第1个字符
data10:begin lcd_rs<=1'b1;if(sel[3])lcd_data<="1";else lcd_data<="0";current_state<=data11; end//显示第2个字符
data11:begin lcd_rs<=1'b1;if(sel[2])lcd_data<="1";else lcd_data<="0";current_state<=data12; end//显示第3个字符
data12:begin lcd_rs<=1'b1;if(sel[1])lcd_data<="1";else lcd_data<="0";current_state<=data13; end//显示第4个字符
data13:begin lcd_rs<=1'b1;if(sel[0])lcd_data<="1";else lcd_data<="0";current_state<=data14; end//显示第5个字符
data14:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data15; end//显示第6个字符
data15:begin lcd_rs<=1'b1;lcd_data<="H";current_state<=data16; end//显示第7个字符
data16:begin lcd_rs<=1'b1;lcd_data<="Z";current_state<=set5; end//显示第8个字符

set5:begin lcd_rs<=1'b0;lcd_data<=8'hc0;current_state<=data17; end//设置第2行地址

data17:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data18; end//显示第1个字符
data18:begin lcd_rs<=1'b1;lcd_data<="D";current_state<=data19; end//显示第2个字符
data19:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data20; end//显示第3个字符
data20:begin lcd_rs<=1'b1;lcd_data<="=";current_state<=data21; end//显示第4个字符
data21:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data22; end//显示第5个字符
data22:begin lcd_rs<=1'b1;lcd_data<=d0+"0";current_state<=data23; end//显示第6个字符
data23:begin lcd_rs<=1'b1;lcd_data<=d1+"0";current_state<=data24; end//显示第7个字符
data24:begin lcd_rs<=1'b1;lcd_data<=d2+"0";current_state<=data25; end//显示第8个字符

data25:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data26; end//显示第二个字符
data26:begin lcd_rs<=1'b1;lcd_data<="%";current_state<=data27; end//显示第四个字符
data27:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data28; end//显示第五个字符
data28:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data29; end//显示第六个字符
data29:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data30; end//显示第七个字符
data30:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data31; end//显示第八个字符
data31:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=data32; end//显示第九个字符
data32:begin lcd_rs<=1'b1;lcd_data<=" ";current_state<=stop; end//显示第九个字符

/*********************************************************************************/
stop:begin //控制指令与数据写入的次数
lcd_rs<=1'b0;
lcd_data<=8'b0000_0000;
if(state_counter!=2'b10)
begin
en_temp<=1'b0;
current_state<=set4;
state_counter<=state_counter+1'b1;
end
else
begin
current_state<=set4;
en_temp<=1'b0;//最后数据写入完成后将lcd_en线拉高
end
end
default: current_state<=set0;
endcase
end
end
assign lcd_en=clk_en|en_temp;//lcd_en为‘1’有效

endmodule

写的PWM,如果实时显示就要状态机一直循环,并且给模块定义一个数据输入变量

基于vivado(语言Verilog)的FPGA学习——FPGA理论知识

基于vivado(语言Verilog)的FPGA学习(3)——FPGA理论知识

文章目录


1. FPGA介绍

1.1.FPGA内部结构

FPGA主要是采用SRAM工艺的查找表(LUT,Look-up Table)结构,LUT 本质上就是一个 RAM
内部结构有:

(1). 可编程逻辑块CLB

如果输入芯片型号,进行仿真综合时,可以看到FPGA内部资源,其中占地面积最多的就是CLB,CLB内部时有2个或4个slice构成。每个slice中又含有几个查找表LUT、多路选择器MUX、超前进位链CARRY4、存储单元FF(触发器,通常被配置成D触发器,被用于时序逻辑中)

SLICE根据LUT功能被分为:
SLICEM(memory):可读可写,可以实现移位寄存器和DRAM等存储功能
SLICEL:内部LUT只读,只能实现基本查找表逻辑

(2).可编程输入/输出单元(IOB)

为了适配多种电气标准,I/O单元根据接口电压VCCO被划分成若干组

(3).时钟管理模块(CMT)

DCM(数字管理时钟)的核心是DLL(Delay Locked Loop),可以产生不同相位的时钟、分频、倍频和相位动态调整。

PLL使用了电压控制延迟,用VCO来实现和DLL中类试的延迟功能。又称模拟锁相环。功能上都可以实现倍频、分频、占空比调整,但是PLL调节范围更大,比如说:XILINX使用DLL,只能够2、4倍频;ALTERA的PLL可以实现的倍频范围就更大毕竟一个是模拟的、一个是数字的。

两者之间的对比:对于PLL(Phase Locked Loop,相位锁定环),用的晶振存在不稳定性,而且会累加相位错误,而DLL在这点上做的好一些,抗噪声的能力强些;但PLL在时钟的综合方面做得更好些。总的来说PLL的应用多,DLL则在jitter power precision等方面优于PLL。

(4).嵌入式块RAM(BRAM)

DRAM和 BRAM 区别
1、BRAM的输出需要时钟,DRAM 在给出地址后即可输出数据。
2、BRAM有较大的存储空间,FPGA定制的RAM资源;而DRAM是逻辑单元拼出来的,浪费LUT 资源
3、DRAM 使用更灵活方便些
4、较大的存储应用,建议用BRAM;零星的小应用,可以用DRAM。

(5).丰富的布线资源

布线资源连通 FPGA 内部的所有单元,而连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。FPGA芯片内部有着丰富的布线资源,根据工艺、长度、宽度和分布位置的不同而划分为4类不同的类别。
1、全局布线资源,用于芯片内部全局时钟和全局复位/置位的布线;
2、长线资源,用以完成芯片 Bank 间的高速信号和第二全局时钟信号的布线;
3、短线资源,用于完成基本逻辑单元之间的逻辑互连和布线;
4、分布式的布线资源,用于专有时钟、复位等控制信号线。
但应用中设计者不需要选择用哪个布线资源,布局布线器可以根据输入逻辑网表的拓扑结构和约束条件进行自动连接。

(6).底层内嵌功能单元

内嵌功能模块主要指DLL(Delay Locked Loop)、PLL(Phase Locked Loop)、DSP(嵌入式乘法单元)和CPU等软核(Soft Core)。现在越来越丰富的内嵌功能单元,使得单片 FPGA 成为了系统级的设计工具,使其具备了软硬件联合设计的能力,逐步向SOC平台过渡。

(7).内嵌专用硬核

相对于底层嵌入的软核而言,指的是FPGA当中处理能力强大的硬核,等效于ASIC电路。

1.2.常用的可编程逻辑器件

可编程逻辑器件有:FPGA、PAL、GAL、EPLD、CPLD、FPLA、GDS

1.3.FPGA资源报告

1、 LUT:查找表(Look-Up-Table),是FPGA实现组合逻辑的硬件单元。资源利用率中的 LUT 是指设计中消耗的所有LUT,包括用做逻辑函数发生器的LUT和用做存储单元的LUTRAM。
2、 LUTRAM:分布式存储器(Look-Up-Table RAM),指设计消耗的 LUT 被用作了存储单元或移位寄存器
3、FF:触发器(Flip-Flop)边沿敏感的存储硬件单元,可以存储1bit 数据。
4、BRAM:(Block RAM)各种块存储功能的硬件单元。如Xilinx公司的结构中每个BRAM有 36Kbit 的容量。
5、DSP:乘法器。不管是调用IP核,还是直接写代码“*”,综合之后都是占用 DSP48E1 的资源。功能包括乘法、乘法累加(MACC)、乘法加法、三输入加法、桶形移位、宽总线多路复用、幅度比较器、按位逻辑功能、模式检测和宽计数器。

1.4.FPGA时序优化方式

1、插入寄存器,缩短组合逻辑延时;
2、并行化设计,缩短关键路径的延时;
3、逻辑展平,包括逻辑复制、消除代码中的优先级;
4、寄存器均衡设计,缩短关键逻辑的延时;
5、路径重组。

1.5.FPGA功耗报告

在 Vivado 下,有两种功耗估计模式。
一种是向量模式,需要提供SAIF(Switching Activity Interchange Format)或VCD文件,SAIF 文件通过仿真生成,因此需要在Simulation Settings中进行设置。Xilinx建议在向量模式下选择 SAIF 文件,因其估计速度要比 VCD 快。
一种是非向量模式,只需要提供简单的参数即可,但估计结果不够准确。
采用向量模式结果的confidence level为high,非向量模式为low。

1.6.FPGA开发流程

这一点在前两部分都提过:
1、电路功能设计,但在此之前,需要结合FPGA芯片资源进行资源分配与权衡
2、设计输入:一般以硬件描述语言和原理图输入位置,对于结合了ARM的FPGA开发板,也可以结合PL和PS一同设计。
3、功能仿真:此时没有延时
4、综合:用FPGA的基本逻辑单元去完成仿真
5、综合仿真:会考虑门延时
6、实现与布局布线:将逻辑网表配置到具体FPGA上
7、时序仿真与验证:最为精密的延时计算,模拟具体FPGA上的延时情况
8、板级仿真与验证:板级仿真与验证主要应用于高速电路设计中,对信号完整性和电子干扰等特性进行分析,使用第三方工具完成。
9、芯片编程与调试:生成比特流文件,然后下载至FPGA芯片中。

2. ZYNQ

2.1.ZYNQ介绍

ZYNQ中包含两大功能块:PS部分和 PL 部分。
1、PS部分指Processing System,一个基于双 ARM Cortex A9内核的处理系统,其中集成了内存存储器和外部存储器接口,以及如GPIO、UART 接口等大量的外设。
2、PL部分指Programmable Logic,基于Xilinx 7系列架构的可编程逻辑单元,通过PL部分可以为 ARM 定制很多外设,这也是ZYNQ 的一大优点。

2.2.内部结构

1、应用处理单元

2、PS与PL连接方式:AXI通用接口、加速一致性端口、高性能端口
3、EMIO接口:EMIO是扩展的MIO,是PS和PL之间的一个接口,当PS的引脚不够用的时候,可以通过 EMIO 来扩展,从而使用PL的引脚(SMC静态存储器控制器(Memory Interfaces)、Quad-SPI、USB 不可以连接)
也就是说当ARM的MIO接口(复用性输入输出端)不够用时,可以调用PL部分(FPGA)的IO接口,该接口称为EMIO接口。

2.3.ZYNQ开发流程


这里就体现出PS(ARM)和PL(FPGA)部分结合的特点,PS部分用软件开发工具SDK,PL部分用硬件开发工具VIVADO。

2.4.基于高层次综合的SOC FPGA设计流程

题目的意思就是利用FPGA的虚拟化,将功能实现转换成C语言,再利用FPGA将C语言自动转换成软硬件语言,分配给PL和PS:

3.MPSOC

升级版ZYQN:Zynq UltraScale+ MPSoC系列

以上是关于求一片用verilog鱼呀写的基于fpga的lcd1602显示实时数据的程序的主要内容,如果未能解决你的问题,请参考以下文章

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

急求一份VHDL,verilog的英文文献,最好带有中文翻译,在线等,谢谢

基于vivado(语言Verilog)的FPGA学习——FPGA理论知识

基于FPGA的频率检测与LCD显示

IDCT-FPGA基于FPGA的IDCT变换的verilog实现

FPGA教程案例45图像案例5——基于FPGA的图像均值滤波verilog实现,通过MATLAB进行辅助验证