[X]关闭

在MA703的HDMI OUT例程中,有个疑

文档创建者:玛瑙_重获新生i
浏览次数:10749
最后更新:2020-06-04
 
本帖最后由 玛瑙_重获新生i 于 2020-2-7 14:32 编辑


1.例程中,此句是有问题的吧?
QQ图片20200207111448.png 用按位与&,turn_mode是1bit的,其是不是会一直与最低位key_counter[0]相与&,那么key_counter为0或偶数时,该if就永不能为真了,对吗?
2.key_counter是17bit的,如果用14'b0赋值,那么其高位,是保持原值不变,还是也会被赋值为0?

3.但好像改不改14'b0,以及&,程序编译执行,实际验证都没问题,这又是为何呢?
4.这个按键销抖又是怎么做到的呢?如果按键将被抬起时(turn_mode 为1),那么17'h11704(17'd71428,如按20ns周期,去抖时间也只有1.4ms多,是不是会不够?按分辨率720p,周期是13.5ns,更小)后,key_counter 就计满数了,去抖时间约1.4ms左右,会不会不够呢?会出现按键还没松开,结果LED却改变了吗?



谢谢


发表评论已发布 14

uisrc

发表于 2020-2-7 11:26:16 | 显示全部楼层


1对于&  是按位与
对于&& 是逻辑与
这个地方 & 和&& 作用一样,因为是1位,也只有都是1位的按位与和逻辑与结果一样
越努力越幸运!加油!

玛瑙_重获新生i

发表于 2020-2-7 11:54:20 | 显示全部楼层

msxbo 发表于 2020-2-7 11:26
1对于&  是按位与
对于&& 是逻辑与
这个地方 & 和&& 作用一样,因为是1位,也只有都是1位的按位与和逻 ...

1.我理解是结果(turn_mode==1'b1的结果,真或假,只有1位)与结果相与,所以是1bit的,对吧?
2.key_counter是17bit的,如果用14'b0赋值,那么其高位,是保持原值不变,还是也会被赋值为0?这个没在百度上查到,请指导,谢谢。
3.按键抬起时的去抖,有点不理解,如果按键抬起时,有1ms左右的抖动,LED是不是也会改变状态?从代码上看,好像是这样的,对吗?

(key_counter计数到17'h11704(17'd71428,如按20ns周期,去抖时间也只有1.4ms多,按分辨率720p,周期是13.5ns,去抖时间更小)后,LED就加1,改变状态。

uisrc

发表于 2020-2-7 12:08:29 | 显示全部楼层

1、对
2、你学习的比较认真,这里确实个问题,最好仿真下,2019版本的资料这个例子这个地方不严谨,2020版本教程已经解决这个问题。
3、是,可以增加按键的延迟去抖动时间。
总结,这个程序这个地方不严谨,不是我写的。2020版本基础篇都是是我写的,已经解决全部不严谨的地方。所以写程序不是满足功能就可以了,还要严谨规范,对于之前版本的不规范的地方,如果我负责的地方都已经很好解决。
敬请期待2020版本资料,购买板子的可以免费升级到2020版本。
越努力越幸运!加油!

玛瑙_重获新生i

发表于 2020-2-7 19:48:58 | 显示全部楼层

msxbo 发表于 2020-2-7 12:08
1、对
2、你学习的比较认真,这里确实个问题,最好仿真下,2019版本的资料这个例子这个地方不严谨,2020版 ...

写了个仿真,想检测一下,但总是报错,网上查也没有结果。请指导。谢谢。
module hdmi_1080P_TB();

    reg     clk_50M;
    reg     KEY;
   
    wire   HDMI_CLK_P;
    wire   HDMI_CLK_N;
    wire   HDMI_D2_P;
    wire   HDMI_D2_N;
    wire   HDMI_D1_P;
    wire   HDMI_D1_N;
    wire   HDMI_D0_P;
    wire   HDMI_D0_N;
    wire [3:0]   LED;
   
   
HDMI_display_Demon  uut1 (
        .clk_50M(clk_50M),
        .KEY(KEY),
        
        .HDMI_CLK_P(HDMI_CLK_P),
        .HDMI_CLK_N(HDMI_CLK_N),
        .HDMI_D2_P(HDMI_D2_P),
        .HDMI_D2_N(HDMI_D2_N),
        .HDMI_D1_P(HDMI_D1_P),
        .HDMI_D1_N(HDMI_D1_N),
        .HDMI_D0_P(HDMI_D0_P),
        .HDMI_D0_N(HDMI_D0_N),
        .LED(LED)
    );
   
    initial   begin
        clk_50M = 0;
        forever
            #10  clk_50M = ~clk_50M;
    end
   
        initial   begin
        KEY = 1;   #1000;
        KEY = 0;   #1_000_000;
        KEY = 1;   #1000;
        forever   begin
            KEY = 0;   #1000;
            KEY = 1;   #2000;
            KEY = 0;   #5000;
            KEY = 1;   #3_000_000;
            KEY = 0;   #2_000_000;
            KEY = 1;   #50_000_000;
            
            KEY = 0;   #1_000_000;
            KEY = 1;   #1000;
            KEY = 0;   #1000;
            KEY = 1;   #2000;
            KEY = 0;   #5000;
            KEY = 1;   #3_000_000;
            KEY = 0;   #2_000_000;
            KEY = 1;   #50_000_000;
            KEY = 0;
        end
    end
   

endmodule


报错如下:

[USF-XSim-62] 'compile' step failed with error(s). Please check the Tcl console output or 'F:/Xilinx_project/vivado_lianxi/01_CH08/01_02/hdmi_display_demon_1080P _mcs/hdmi_display_demon.sim/sim_1/behav/xsim/xvhdl.log' file for more information.

[Vivado 12-4473] Detected error while running simulation. Please correct the issue and retry this operation.
ERROR: [Common 17-39] 'launch_simulation' failed due to earlier errors.

玛瑙_重获新生i

发表于 2020-2-7 19:55:53 | 显示全部楼层

另:我还想问问,hdmi_data_gen程序中,出现了很多次:
if (0)   
该if (0) ,也不是用在宏语句中,会执行吗?该if语句有啥用处?

比如:

reg[11:0]        x_cnt;
always @(posedge pix_clk)                //水平计数
begin
        if(1'b0)
        x_cnt        <=        1;
        else if(x_cnt==H_Total)
        x_cnt        <=        1;

uisrc

发表于 2020-2-7 21:02:45 | 显示全部楼层

1、HDMI信号不支持仿真,可以把HDMI调用接口注释,引出RGB接口仿真
2、if(1'b0) 就是完成上电复位,仿真跑起来后可以验证下
越努力越幸运!加油!

玛瑙_重获新生i

发表于 2020-2-8 00:23:58 | 显示全部楼层

msxbo 发表于 2020-2-7 21:02
1、HDMI信号不支持仿真,可以把HDMI调用接口注释,引出RGB接口仿真
2、if(1'b0) 就是完成上电复位,仿真跑 ...

您好。
1.我将顶层文件中,HDMI_FPGA_ML_0 模块注释了,也将hdmi_data_gen中的RGB改为了顶层文件中的输出,但RUN Behavioral Simulation 仍报上面的那两个错误。请指导该如何HDMI接口注释,引出RGB。
2.我想生成MCS和BIN,发现只能用SPI x1生成。在约束文件中,加了4.7中优化管脚约束的几行后,才ok了。这正确吧,百度查了,但对于约束中增加的几行的具体含义还不是很清楚。请问有vivado 2017.4及约束、仿真等相关必须了解的工具知识等的中文书籍推荐吗?谢谢。

约束中的六行代码是:
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property BITSTREAM.GENERAL.COMPRESS true [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE Yes [current_design]


为了仿真,修改的顶层文件是:
module HDMI_display_Demon(
    input       clk_50M,
    input       KEY,

    output [7:0]        VGA_R,
    output [7:0]    VGA_G,
    output [7:0]    VGA_B,
    output            VGA_HS,
    output            VGA_VS,
    output            VGA_DE,

  /*  output      HDMI_CLK_P,
    output      HDMI_CLK_N,
    output      HDMI_D2_P,
    output      HDMI_D2_N,
    output      HDMI_D1_P,
    output      HDMI_D1_N,
    output      HDMI_D0_P,
    output      HDMI_D0_N,*/
    output  [3:0]   LED
);

wire pixclk;
//wire[7:0]   R,G,B;
//wire HS,VS,DE;
hdmi_data_gen u_hdmi_data_gen
(
    .pix_clk            (pixclk),
    .turn_mode          (KEY),

    .VGA_R              (VGA_R),
    .VGA_G              (VGA_G),
    .VGA_B              (VGA_B),
    .VGA_HS             (VGA_HS),
    .VGA_VS             (VGA_VS),
    .VGA_DE             (VGA_DE),

   /* .VGA_R              (R),
    .VGA_G              (G),
    .VGA_B              (B),
    .VGA_HS             (HS),
    .VGA_VS             (VS),
    .VGA_DE             (DE),*/
    .mode                (LED)
);

wire serclk;
wire lock;
wire[23:0]  RGB;
//assign RGB={R,G,B};
/*
HDMI_FPGA_ML_0 u_HDMI
(
    .PXLCLK_I           (pixclk),
    .PXLCLK_5X_I        (serclk),
    .LOCKED_I           (lock),
    .RST_N              (1'b1),
    .VGA_HS             (HS),
    .VGA_VS             (VS),
    .VGA_DE             (DE),
    .VGA_RGB            (RGB),
    .HDMI_CLK_P         (HDMI_CLK_P),
    .HDMI_CLK_N         (HDMI_CLK_N),
    .HDMI_D2_P          (HDMI_D2_P),
    .HDMI_D2_N          (HDMI_D2_N),
    .HDMI_D1_P          (HDMI_D1_P),
    .HDMI_D1_N          (HDMI_D1_N),
    .HDMI_D0_P          (HDMI_D0_P),
    .HDMI_D0_N          (HDMI_D0_N)
); */

hdmi_clk   u_clk
(
    .clk_in1            (clk_50M),
    .resetn             (1'b1),
    .clk_out1           (pixclk),
    .clk_out2           (serclk),
    .locked             (lock)
);
endmodule



玛瑙_重获新生i

发表于 2020-2-8 00:40:13 | 显示全部楼层

本帖最后由 玛瑙_重获新生i 于 2020-2-8 15:30 编辑

代码修改得应该还是有问题,综合没有成功。约束文件中,VGA_R等都是8bit,每个bit都需要连接到一个pin脚。没改了。

玛瑙_重获新生i

发表于 2020-2-8 10:52:28 | 显示全部楼层

本帖最后由 玛瑙_重获新生i 于 2020-2-8 15:24 编辑
msxbo 发表于 2020-2-7 21:02
1、HDMI信号不支持仿真,可以把HDMI调用接口注释,引出RGB接口仿真
2、if(1'b0) 就是完成上电复位,仿真跑 ...

1.我将.XDC约束文件中的HDMI差分引脚都都注销了,可以综合了。但是 RUN Behavioral simulation仍然报上面的两错误。再将RGB的接口的约束,填入XDC文件中,可以综合,但Behavioral中,仍报那两错误。不晓得怎么搞了。呵呵……    运行CH06按键去抖项目的行为仿真,又没问题。仿真时的该两报错,应该不像网上说的,是vivado软件问题。在IP Source栏,将HDMI差分信号的IP core禁用了,仿真时仍报错。
set_property IOSTANDARD LVCMOS15 [get_ports clk_50M]
set_property IOSTANDARD LVCMOS33 [get_ports KEY]
#set_property IOSTANDARD TMDS_33 [get_ports HDMI_CLK_P]
#set_property IOSTANDARD TMDS_33 [get_ports HDMI_D0_P]
#set_property IOSTANDARD TMDS_33 [get_ports HDMI_D1_P]
#set_property IOSTANDARD TMDS_33 [get_ports HDMI_D2_P]

set_property IOSTANDARD TMDS_33 [get_ports VGA_R]
set_property IOSTANDARD TMDS_33 [get_ports VGA_G]
set_property IOSTANDARD TMDS_33 [get_ports VGA_B]
set_property IOSTANDARD TMDS_33 [get_ports VGA_HS]
set_property IOSTANDARD TMDS_33 [get_ports VGA_VS]
set_property IOSTANDARD TMDS_33 [get_ports VGA_DS]

set_property PACKAGE_PIN V4  [get_ports clk_50M]
set_property PACKAGE_PIN N13 [get_ports KEY]
#set_property PACKAGE_PIN C18 [get_ports HDMI_CLK_P]
#set_property PACKAGE_PIN B15 [get_ports HDMI_D0_P]
#set_property PACKAGE_PIN B21 [get_ports HDMI_D1_P]
#set_property PACKAGE_PIN C22 [get_ports HDMI_D2_P]

set_property PACKAGE_PIN C18 [get_ports VGA_R]
set_property PACKAGE_PIN B15 [get_ports VGA_G]
set_property PACKAGE_PIN B21 [get_ports VGA_B]
set_property PACKAGE_PIN C22 [get_ports VGA_HS]
set_property PACKAGE_PIN A21 [get_ports VGA_VS]
set_property PACKAGE_PIN B22 [get_ports VGA_DS]

set_property IOSTANDARD LVCMOS33 [get_ports {LED[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {LED[0]}]
set_property PACKAGE_PIN E21 [get_ports {LED[0]}]
set_property PACKAGE_PIN D21 [get_ports {LED[1]}]
set_property PACKAGE_PIN E22 [get_ports {LED[2]}]
set_property PACKAGE_PIN D22 [get_ports {LED[3]}]

set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property BITSTREAM.GENERAL.COMPRESS true [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.CONFIG.SPI_FALL_EDGE Yes [current_design]


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

本版积分规则