找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1919|回复: 1
打印 上一主题 下一主题
收起左侧

基于FPGA动态配置PLL输出-源码以及注意事项

[复制链接]
跳转到指定楼层
楼主
rom ip的配置
1、宽度1,深度144。


2、


3、这里.mif输出配置文件,配置文件可在配置altpll ip时获取。



altpll_recongig 配置
配置成一样即可。



alt_pll配置
其中rom所需的.mif文件从图中框选处获取,或者直接复制图中序号为1的vga_pll.mif文件也可以(不同的频率对应不同的mif文件)。
获取不同pll输出频率.mif的具体步骤

1、建立.mif文件
点击file->New->memory Initialization File 设置 number of words 为144,word size 为1,保存即可,这里需要的时钟数与.mif文件数对应即可。
2、获取不同时钟对应的.mif配置文件(数据)         
先配置好输出的时钟频率(Output Clocks界面进行配置)转到下图所示的界面,点击序号为2所在位置的browse ,找到刚刚保存的.mif,然后点击Generate a Cinfiguration File即可。重复上述步骤可获取不同的时钟.mif配置文件。

源码
module vgaclk_out(
        input clk,
        input rst,
        input[2:0] rom_swn,
        output  vga_clk,
        output reg write_from_rom=0,
        output reg reconfig=0,
        output busy,
        output pll_scandone

);

wire pll_scandataout,pll_areset,pll_configupdate,pll_scanclk,pll_scanclkena,write_rom_ena,pll_scandata;
wire clk_40M,clk_108M,clk_148_5M,clk_27_175M,clk_65M,clk_74_25M;
wire [7:0]rom_address_out;
wire pll_clkout,rom_out;
        pll_sw   u1(
                .clock(clk),
                .pll_areset_in(!rst),
                .pll_scandataout(pll_scandataout),
                .pll_scandone(pll_scandone),
                //.read_param(0),
                .reconfig(reconfig),//
                .reset(!rst),
                //.reset_rom_address(0),
                .rom_data_in(rom_out),
                .write_from_rom(write_from_rom),//
                //.write_param(0),
                //.counter_param(0),
                .pll_scandata(pll_scandata),
                //.counter_type(0),
                //.data_in(0),
                //.data_out(),
                .pll_areset(pll_areset),
                .pll_configupdate(pll_configupdate),
                .pll_scanclk(pll_scanclk),
                .pll_scanclkena(pll_scanclkena),
                .write_rom_ena(write_rom_ena),
                .rom_address_out(rom_address_out),
                .busy(busy)
                );
wire clk_out;
        vga_pll u2(
                .areset(pll_areset),
                .configupdate(pll_configupdate),
                .scanclk(pll_scanclk),
                .scanclkena(pll_scanclkena),
                .scandata(pll_scandata),
                .scandataout(pll_scandataout),
                .scandone(pll_scandone),
           .inclk0(clk),        
                .c0(vga_clk)
        );
//
   ROM108M u3(
           .address(rom_address_out),
           .clken(write_rom_ena),
           .clock(clk),
           .q(clk_108M)
           );
   ROM148_5M u4(
           .address(rom_address_out),
           .clken(write_rom_ena),
           .clock(clk),
           .q(clk_148_5M)
           );
        ROM74_25M u5(
           .address(rom_address_out),
           .clken(write_rom_ena),
           .clock(clk),
           .q(clk_74_25M)
        );
        ROM65M u6(
           .address(rom_address_out),
           .clken(write_rom_ena),
           .clock(clk),
           .q(clk_65M)
        );
        ROM40M u7(
           .address(rom_address_out),
           .clken(write_rom_ena),
           .clock(clk),
           .q(clk_40M)
        );
        ROM27_175M u8(
           .address(rom_address_out),
           .clken(write_rom_ena),
           .clock(clk),
           .q(clk_27_175M)
        );
        rom_sw u9(
                .clk(clk),
                .rst(rst),
                .rom_swn(rom_swn),
                .data1(clk_27_175M),
                .data2(clk_40M),
                .data3(clk_65M),
                .data4(clk_74_25M),
                .data5(clk_108M),
                .data6(clk_148_5M),
                .rom_out(rom_out)
          );

//用于控制write_from_rom信号和reconfig信号


reg[2:0] SW_IT=3'd0,SWN=3'd7;
//reg[13:0]cnt_sw=14'd0;//8190
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
SW_IT<=0;
SWN<=7;
end
else
case(SW_IT)
3'd0 :begin
if(SWN!=rom_swn)
begin
SW_IT<=3'd1;
write_from_rom<=1;
end
end
3'd1:begin
SW_IT<=3'd2;
write_from_rom<=0;
end
3'd2:begin
if(busy==0)
begin
SW_IT<=3'd3;
reconfig<=1;
end
end
3'd3:begin
SW_IT<=3'd4;
reconfig<=0;
end
3'd4:begin
SW_IT<=3'd0;
SWN<=rom_swn;
end
endcase
end
//assign vga_clk=(rom_swn==SWN)?clk_out:0;
endmodule




rom_sw部分源码(rom的选择,不同时钟的选择)
  module rom_sw(
input clk,
input rst,
input[2:0] rom_swn,
input data1,
input data2,
input data3,
input data4,
input data5,
input data6,
output reg rom_out=0

);
always@(negedge clk)
begin
case(rom_swn)
  3'b000:rom_out<=data1;
  3'b001:rom_out<=data2;
  3'b010:rom_out<=data3;
3'b011:rom_out<=data4;
  3'b100:rom_out<=data5;
  3'b101:rom_out<=data6;
3'b110:rom_out<=data6;
3'b111:rom_out<=data6;
default: rom_out<=data6;
endcase
end

endmodule

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:739441 发表于 2024-1-29 14:12 | 只看该作者
这个很重要哦   还好看到了,原理图模式需要用得到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表