这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » anmko的进程贴:综合实验-基于DS1302的万年历LCD1602显示(最终版

共223条 16/23 |‹ 14 15 16 17 18 19 ›| 跳转至
菜鸟
2012-12-04 21:12:02     打赏
151楼

看看。。。。


高工
2012-12-05 21:46:37     打赏
152楼
23、VGA显示256色的图片
        本来是显示字符的:CHA(通道A)


        突然又觉得好歹也是VGA啊,你不能把这么个大液晶屏当12806使吧,,怎么着都得显示个图片出来吧~~~~说干就干

拿张PLMM的壁纸


        在网上下了个图片转MIF的软件,坑爹的,没有转256色格式的功能,只有256灰度的,好吧,黑白电视机的画面还是蛮怀念的,计算了一下,EP2C5有36(好像是36,反正不会多于36)个M4K,4*1024*36bit,真可怜,存储一个满屏的画面都不行,最后敲定128*100像素的照片,直接转成MIF,效果如下,,真坑爹,,,


金泫雅妹纸,,你怎么了,你百变大咖啊!你这让那个我情何以堪!!!哎~~~~~~~估计是现在的液晶显示器不只是灰度显示了,于是只好用其他的软件先把图片转换成.c,然后在把它编辑成.hex的,,于是真的就显示出来了。。。


实在是小,,,进一点


SOF,POF文件下载:
——回复可见内容——

verilog在楼下的楼下

助工
2012-12-05 22:40:07     打赏
153楼
顶!!!!!

高工
2012-12-06 09:54:03     打赏
154楼

verilog程序:
module vga
#(
//------------水平扫描常量--------------
 parameter LinePeriod = 12'd1040,
 parameter H_SyncPulse = 10'd120,
 parameter H_BackPorch = 10'd61,
 parameter H_ActivePix = 10'd806,
//------------垂直扫描常量-------------- 
 parameter FramePeriod = 12'd666,
 parameter V_SyncPulse = 10'd6,
 parameter V_BackPorch = 10'd21,
 parameter V_ActivePix = 10'd604
)

(
 input clk,
 input rst,
 output H_Sync,
 output V_Sync,
 output [2:0] VGA_R,
 output [2:0] VGA_G,
 output [1:0] VGA_B
);

//-----------------水平扫描计数-----------------
 reg[11:0] X_cnt;
 always @(posedge clk or negedge rst) begin
  if(!rst)
   X_cnt <= 12'b1;
  else if(X_cnt == LinePeriod) X_cnt <= 12'b1;
  else X_cnt <= X_cnt + 1'b1;
 end
 
//-------------水平扫描信号HSYNC计产生-------------
 reg H_Sync_r;
 always @(posedge clk or negedge rst) begin
  if(!rst) H_Sync_r <= 1'b1;
  else if(X_cnt == 12'b1) H_Sync_r <= 1'b0;
  else if(X_cnt >= H_SyncPulse) H_Sync_r <= 1'b1;
 end
 assign H_Sync = H_Sync_r;
 
//-----------------垂直扫描计数-----------------
 reg[11:0] Y_cnt;
 always @(posedge clk or negedge rst) begin
  if(!rst) Y_cnt <= 12'b1;
  else if(Y_cnt == FramePeriod) Y_cnt <= 12'b1;
  else if(X_cnt == LinePeriod) Y_cnt <= Y_cnt + 1'b1;  //水平扫描完后垂直
 end
//-------------垂直扫描信号VSYNC计产生-------------
 reg V_Sync_r;
 always @(posedge clk or negedge rst) begin
  if(!rst) V_Sync_r <= 1'b1;
  else if(Y_cnt == 12'b1) V_Sync_r <= 1'b0;
  else if(Y_cnt >= V_SyncPulse) V_Sync_r <= 1'b1;
 end
 assign V_Sync = V_Sync_r;
 
//----------------有效显示区标志-------------------
 wire valid;
 assign valid = (X_cnt>=(H_SyncPulse+H_BackPorch))&&(X_cnt<(H_SyncPulse+H_BackPorch+H_ActivePix))&&
      (Y_cnt>=(V_SyncPulse+V_BackPorch))&&(Y_cnt<(V_SyncPulse+V_BackPorch+V_ActivePix));

 wire[9:0] x_dis;
 wire[9:0] y_dis;
 assign x_dis = X_cnt - (H_SyncPulse + H_BackPorch );
 assign y_dis = Y_cnt - (V_SyncPulse + V_BackPorch );
 
/**************VGA色彩信号产生***************
 RGB = 000   黑色 RGB = 100 红色
  = 001   蓝色  = 101 紫色
  = 010 绿色  = 110 黄色
  = 011 青色  = 111 白色
*******************************************/ 
 
 reg[15:0] rom_addr;  //ROM地址
 wire[7:0] rom_data;  //ROM数据
 rom PIC_rom
 (
  .address(rom_addr),
  .clock(clk),
  .q(rom_data)
 );
 
 reg [7:0] vga_RGB;
 always @(posedge clk or negedge rst) begin
  if(!rst) 
   begin
   vga_RGB <= 8'b0;
   rom_addr <= 16'b0;
   end
  else if(valid)
   begin
   if((x_dis >= 10'd336 && x_dis < 10'd464) && (y_dis >= 10'd250 && y_dis < 10'd350))
    begin
    vga_RGB <= rom_data;
    rom_addr <= rom_addr + 1'b1;
    if(rom_addr == 12799) rom_addr <= 16'b0;    
    end
   else vga_RGB <= 8'b000_001_11;
   end
  else vga_RGB <= 8'b0;
 end

 assign VGA_R = vga_RGB[7:5];
 assign VGA_G = vga_RGB[4:2];
 assign VGA_B = vga_RGB[1:0];

endmodule

 


工程师
2012-12-06 17:03:44     打赏
155楼

才做到AD现在,下个文件测试看有没错的


高工
2012-12-06 19:38:38     打赏
156楼
你用这个吧,这个是改进之后的http://forum.eepw.com.cn/thread/221172/11#110

高工
2012-12-13 16:23:03     打赏
157楼
24、IP核——PLL锁相环
(首先做这个实验你焊接的晶振应该是Y2)
        Cyclone II器件中最多有四个锁相环Cyclone II 的PLL功能强大,可以用作零延时缓存器、频率合成器、抖动衰减器、一个低斜扇出缓冲器,支持时钟转换、可编程切换、可编程占空比,减少时钟延时、时钟偏斜。
                                                     器件中的可用PLLs个数



                                                         Cyclone II器件中PLL的位置

        EP2C5和EP2C8只有8个全局时钟和两个PLL,如上图红色所标出的。

                                            PLL的参考时钟


       在Cyclone II器件中,多达四个管脚可以驱动PLL,PLL具有内部延时块可以补偿从输入到PLL的延时。每个PLL的输入可以由四个单端输入和两个差分输入时钟输入来供给。
下面是PLL核添加过程:














到这一步,PLL算是添加完了,c0输出50Mhz、c1输出100Mhz、c2输出150Mhz的时钟信号。接下来是调用了。

verilog程序:

module pll_led(clk,clk2, rst, led);

 input clk;
 input clk2;
 input rst;

 output [4:0] led;

 wire clkdiv0;
 wire clkdiv1;
 wire clkdiv2;
 pll_ctrl  PLL_DIV
 (
  .inclk0(clk),
  .c0(clkdiv0),
  .c1(clkdiv1),
  .c2(clkdiv2)
 );

 wire clkdiv3;
 wire clkdiv4;
 wire clkdiv5;
 pll_ctrl2  PLL_DIV2
 (
  .inclk0(clk2),
  .c0(clkdiv3),
  .c1(clkdiv4),
  .c2(clkdiv5)
 );
 
 reg [25:0] cnt0;
 reg led_r0;
 always @(posedge clk or negedge rst) begin
  if(!rst) cnt0 <= 26'b0;
  else if(cnt0 == 26'd25_000_000)
   begin
   led_r0 <= ~led_r0;
   cnt0 <= 26'b0;
   end
  else cnt0 <= cnt0 + 1'b1;
 end
 assign led[0] = led_r0;
 
 reg [25:0] cnt1;
 reg led_r1;
 always @(posedge clkdiv0 or negedge rst) begin
  if(!rst) cnt1 <= 26'b0;
  else if(cnt1 == 26'd25_000_000)
   begin
   led_r1 <= ~led_r1;
   cnt1 <= 26'b0;
   end
  else cnt1 <= cnt1 + 1'b1;
 end
 assign led[1] = led_r1;
 
 reg [25:0] cnt2;
 reg led_r2;
 always @(posedge clkdiv1 or negedge rst) begin
  if(!rst) cnt2 <= 26'b0;
  else if(cnt2 == 26'd25_000_000)
   begin
   led_r2 <= ~led_r2;
   cnt2 <= 26'b0;
   end
  else cnt2 <= cnt2 + 1'b1;
 end
 assign led[2] = led_r2;
 
 reg [25:0] cnt3;
 reg led_r3;
 always @(posedge clkdiv2 or negedge rst) begin
  if(!rst) cnt3 <= 26'b0;
  else if(cnt3 == 26'd25_000_000)
   begin
   led_r3 <= ~led_r3;
   cnt3 <= 26'b0;
   end
  else cnt3 <= cnt3 + 1'b1;
 end
 assign led[3] = led_r3;
 
 reg [25:0] cnt4;
 reg led_r4;
 always @(posedge clkdiv3 or negedge rst) begin
  if(!rst) cnt4 <= 26'b0;
  else if(cnt4 == 26'd25_000_000)
   begin
   led_r4 <= ~led_r4;
   cnt4 <= 26'b0;
   end
  else cnt4 <= cnt4 + 1'b1;
 end
 assign led[4] = led_r4;
endmodule


观察LED灯的闪烁频率。
说明:调用了两个PLL,我们的板子上的晶振输入FPGA的引脚是CLK2(Y2)和CLK7(Y1),是要中只有接入Y2晶振的PLL模块才有效。你可以分配引脚试试。

高工
2012-12-13 18:58:34     打赏
158楼
就是不知道内部pll是怎么实现的。还有好多内部功能没用到,现在都是只写verilog了

高工
2012-12-13 19:04:10     打赏
159楼
PLL有verilog的文本文件的啊,你可以看看那

高工
2012-12-14 08:45:46     打赏
160楼
25、IP核——ROM的使用
        51FPGA的教程中12864实验中使用到了rom,但没介绍怎么调用rom。我在VGA的图片的256色显示中也使用了rom,在这里给大伙介绍一下。


        使用IP核使用引导。


         有两块ROM,选择其一。如上图所示。



        注意红色标识处,在这里填好你的位宽和字数,一定要与你的.mif(.hex)文件的位宽和字数一致。单色显示的位宽应该是1,我256色的VGA,所以填的是8。图左下角是你能用的空间,M4K=1024*4bit,要确保你使用的空间不溢出,否则编译报错。如上图所示。



在这里添加已编译好的mif文件,51fpga介绍了hex的制作过程。如上图所示。


到这里就finish了,

在你的工程文件下会自动生成一个rom.v(名字你自己定义)的文件如下图所示



在top层中调用:

详细的见:VGA的256色显示的源代码http://forum.eepw.com.cn/thread/221172/16#155

共223条 16/23 |‹ 14 15 16 17 18 19 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]