下面是OSERDESE2工作在普通模式和三态模式的两种时序工作图。第一张图数据为8位并行转串行,CLK和CLKDIV的周期之比为4:1。第二张图数据为4位并行转串行,并且包含T1-T4三态门控制,CLK和CLKDIV的周期之比为2:1。
T1-T4均为高电平有效,对应TQ将要输出的数据。且在当前CLKDIV周期采样,下个周期输出。在TQ高电平期间,可以执行输入操作。
2.4.4 OSERDESE2 原语调用实例
在原语调用实例中,需要特别注意以下几个参数:
.DATA_RATE_OQ("DDR"):采用双边沿采样;.DATA_WIDTH(10):将要转换的数据宽度;.SERDES_MODE("MASTER"):设置级联下的主从模式;.SHIFTOUT1/2(SHIFTOUT1/2)、.SHIFTIN1/2(SHIFTIN1/2):级联下的数据线连接方式,注意不要连错。
OSERDESE2 #(
.DATA_RATE_OQ("DDR"), // DDR, SDR
.DATA_RATE_TQ("DDR"), // DDR, BUF, SDR
.DATA_WIDTH(10), // Parallel data width (2-8,10,14)
.INIT_OQ(1'b0), // Initial value of OQ output (1'b0,1'b1)
.INIT_TQ(1'b0), // Initial value of TQ output (1'b0,1'b1)
.SERDES_MODE("MASTER"), // MASTER, SLAVE
.SRVAL_OQ(1'b0), // OQ output value when SR is used (1'b0,1'b1)
.SRVAL_TQ(1'b0), // TQ output value when SR is used (1'b0,1'b1)
.TBYTE_CTL("FALSE"), // Enable tristate byte operation (FALSE, TRUE)
.TBYTE_SRC("FALSE"), // Tristate byte source (FALSE, TRUE)
.TRISTATE_WIDTH(4) // 3-state converter width (1,4)
) OSERDESE2_inst (
.OFB(OFB), // 1-bit output: Feedback path for data
.OQ(OQ), // 1-bit output: Data path output
// SHIFTOUT1 / SHIFTOUT2: 1-bit (each) output: Data output expansion (1-bit each)
.SHIFTOUT1(SHIFTOUT1),
.SHIFTOUT2(SHIFTOUT2),
.TBYTEOUT(TBYTEOUT), // 1-bit output: Byte group tristate
.TFB(TFB), // 1-bit output: 3-state control
.TQ(TQ), // 1-bit output: 3-state control
.CLK(CLK), // 1-bit input: High speed clock
.CLKDIV(CLKDIV), // 1-bit input: Divided clock
// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
.D1(D1),
.D2(D2),
.D3(D3),
.D4(D4),
.D5(D5),
.D6(D6),
.D7(D7),
.D8(D8),
.OCE(OCE), // 1-bit input: Output data clock enable
.RST(RST), // 1-bit input: Reset
// SHIFTIN1 / SHIFTIN2: 1-bit (each) input: Data input expansion (1-bit each)
.SHIFTIN1(SHIFTIN1),
.SHIFTIN2(SHIFTIN2),
// T1 - T4: 1-bit (each) input: Parallel 3-state inputs
.T1(T1),
.T2(T2),
.T3(T3),
.T4(T4),
.TBYTEIN(TBYTEIN), // 1-bit input: Byte group tristate
.TCE(TCE) // 1-bit input: 3-state clock enable
);
2.5 单端转差分原语OBUFDS
OBUFDS的调用较为简单,直接按照如下的格式调用即可。
OBUFDS OBUFDS_inst (
.O(O), // 1-bit output: Diff_p output (connect directly to top-level port)
.OB(OB), // 1-bit output: Diff_n output (connect directly to top-level port)
.I(I) // 1-bit input: Buffer input
);
三、HDMI接口硬件设计
以正点原子的达芬奇开发板为例,HDMI A和HDMI B的结构完全相同:
达芬奇Pro上的HDMI B接口只做输出使用,不作输入使用,故电路结构有所不同:
当仅需要将HDMI作为输出使用时,正点原子历程的做法是不检测HOT PLUG信号,在任何时刻都将信号输出到端口,但是这样的做法明显不够严谨,这样做会白白增加FPGA的功耗,可以根据需要对正点原子的代码进行改进。但作为彩条显示实验,重点在于视频信号的TMDS编码,以及并串转换原语。
本次实验的目标是驱动FPGA上的HDMI接口,在显示器上显示720p(1280*720)的彩条图案,像素时钟约为75MHz(根据标准应该是74.25MHz,设置为75MHz可以简化约束操作)。
四、程序设计
#mermaid-svg-eJ8j8zFYDXm14ZNH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eJ8j8zFYDXm14ZNH .error-icon{fill:#552222;}#mermaid-svg-eJ8j8zFYDXm14ZNH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eJ8j8zFYDXm14ZNH .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-eJ8j8zFYDXm14ZNH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eJ8j8zFYDXm14ZNH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eJ8j8zFYDXm14ZNH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eJ8j8zFYDXm14ZNH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eJ8j8zFYDXm14ZNH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eJ8j8zFYDXm14ZNH .marker.cross{stroke:#333333;}#mermaid-svg-eJ8j8zFYDXm14ZNH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eJ8j8zFYDXm14ZNH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eJ8j8zFYDXm14ZNH .cluster-label text{fill:#333;}#mermaid-svg-eJ8j8zFYDXm14ZNH .cluster-label span{color:#333;}#mermaid-svg-eJ8j8zFYDXm14ZNH .label text,#mermaid-svg-eJ8j8zFYDXm14ZNH span{fill:#333;color:#333;}#mermaid-svg-eJ8j8zFYDXm14ZNH .node rect,#mermaid-svg-eJ8j8zFYDXm14ZNH .node circle,#mermaid-svg-eJ8j8zFYDXm14ZNH .node ellipse,#mermaid-svg-eJ8j8zFYDXm14ZNH .node polygon,#mermaid-svg-eJ8j8zFYDXm14ZNH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eJ8j8zFYDXm14ZNH .node .label{text-align:center;}#mermaid-svg-eJ8j8zFYDXm14ZNH .node.clickable{cursor:pointer;}#mermaid-svg-eJ8j8zFYDXm14ZNH .arrowheadPath{fill:#333333;}#mermaid-svg-eJ8j8zFYDXm14ZNH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eJ8j8zFYDXm14ZNH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eJ8j8zFYDXm14ZNH .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-eJ8j8zFYDXm14ZNH .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-eJ8j8zFYDXm14ZNH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eJ8j8zFYDXm14ZNH .cluster text{fill:#333;}#mermaid-svg-eJ8j8zFYDXm14ZNH .cluster span{color:#333;}#mermaid-svg-eJ8j8zFYDXm14ZNH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eJ8j8zFYDXm14ZNH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
HDMI彩条
video_display
播放彩条, 产生彩条数据
video_Driver
驱动屏幕
encode
TMDS编码, 三个通道依次编码
serializer
并转串
obufds
串行转差分, 四个端口依次转差分输出
PLL
倍频产生像素时钟和并转串时钟
asyn_rst_syn:异步复位,同步释放:人为的复位信号来临时,不需要考虑同步和异步的问题,因为复位按键按下的持续时间至少是毫秒级别,远远大于一个时钟周期;但是复位信号释放时,如果没有同步释放模块,就会因为芯片内部不同模块电路复位信号端口距离复位引脚的远近不同而导致各个模块接收到复位信号的时间可能不同。为了解决这个问题,将原始的rst_n信号打两拍输出,并且根据后接模块的需要将复位信号改为高电平有效:
module asyn_rst_syn (
input clk, //目的时钟域
input reset_n, //异步复位,低有效
output syn_reset //高有效
);
// reg define
reg reset_1;
reg reset_2;
assign syn_reset = reset_2;
// 对异步复位信号进行同步释放,并转换成高有效
always @ (posedge clk or negedge reset_n)
begin
if (!reset_n)
begin
reset_1 <= 1'b1;
reset_2 <= 1'b1;
end
else
begin
reset_1 <= 1'b0;
reset_2 <= reset_1;
end
**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**


**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**
**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**