关于fpga:状态机设计举例

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。汽车尾灯控制电路设计重点介绍结构状态图的两种办法:一是试探法,二是基于算法状态机构造状态图的办法。 例 (试探法)汽车尾灯收回的信号次要是给前面行驶汽车的司机看的,通常汽车驾驶室有刹车开关(HAZ)、左转弯开关(LEFT)和右转弯开关(RIGHT),司机通过操作这3个开关给出车辆的行驶状态。假如在汽车尾部左、右两侧各有3个指示灯,别离用LA、LB、LC、RA、RB、RC示意,如图所示。这些灯的亮、灭法则如下: 汽车失常行驶时,尾部两侧的6个灯全副燃烧。刹车时,汽车尾灯工作在告警状态,所有6个灯按肯定频率闪动(或始终放弃常亮状态)。左转弯时,左侧3个灯轮流程序点亮(或按肯定频率闪动),其法则如图(a)所示,右侧灯全灭。右转弯时,右侧3个灯轮流程序点亮(或按肯定频率闪动),其法则如图(b)所示,左侧灯全灭。假如电路的输出时钟信号为CP,CP的频率对于汽车尾灯所要求的闪动频率。试根据上述要求设计出一个时钟同步的状态机来管制汽车的尾灯。 (1)画出原始状态图 抉择Moore机设计该电路,则尾灯的亮、灭间接由状态译码就能够失去。由设计要求可知:汽车左转弯时,左边的灯不亮而右边的灯顺次循环点亮,即0个、1个、2个或3个灯亮,别离用L0、L1、L2、L3示意,状态机在4个状态中循环。同理,汽车右转弯时,状态机也会在4个状态中循环,即右边灯不亮而左边的灯有0个、1个、2个或3个灯亮,别离用R0、R1、R2、R3示意。因为L0和R0都示意6个灯不亮,所以合起来用IDLE示意。将6个灯都亮的状态用LR3示意。可得原始的状态图就画进去了,如图所示。 剖析一下下图,就会发现一个没有思考到的理论问题,即如果多个输出同时无效,状态机如何工作呢?下图解决了多个输出同时无效的问题,并将LEFT和RIGHT同时无效的状况解决成告警状态。通过改良且具备这一个性的状态图如下所示。 (2)列出电路的输入 因为电路的输入信号较多,不便于写在状态图中,所以独自列出输入逻辑真值表,如表所示。 (3)抉择一种编码方案,对上述状态图进行状态调配,而后用Verilog HDL形容状态图和输入逻辑。 状态图实现后,必须进行齐备性和互斥性的查看。 ①齐备性的查看办法是:对于每一个状态,将所有脱离这一状态的条件表达式进行逻辑或运算,如果后果为1就是齐备的。否则不齐备,也就是说状态图进入某状态后,却不能跳出该状态。 ②互斥性的查看办法是:对于每一个状态,将所有脱离这一状态的条件表达式找进去,而后任意两个表达式进行逻辑与运算,如果后果为0就是互斥的。也就是要保障在任何时候不会同时激活两个脱离状态的转换,即从一个状态跳到两个状态。 利用算法状态机设计十字路口交通灯控制电路算法状态机ASM(Algorithmic State Machine)图是形容数字零碎控制算法的流程图。利用ASM图设计数字零碎,能够很容易将语言形容的设计问题变成时序流程图的形容,依据时序流程图就能够失去电路的状态图和输入函数,从而得出相应的硬件电路。 1.ASM图的状态框、判断框和输入框。ASM图中有三种根本的符号,即状态框、判断框和输入框。数字系统控制序列中的状态用状态框示意,如图(a)所示。图(b)为状态框实例。图中的箭头示意零碎状态的流向。 判断框示意状态变量对控制器工作的影响,如图所示: 条件输入框如下图所示,条件框的入口必然与判断框的输入相连。 2.ASM图中各种逻辑框之间的工夫关系从外表上来看ASM图与程序流程图很类似,但实际上有很大的差别。程序流程图只示意事件产生的先后顺序,没有工夫概念,而ASM图则不同,它示意事件的准确工夫距离程序。在ASM图中每一个状态框示意一个时钟周期内的零碎状态,状态框和与之相连的判断框,条件输入框所规定的操作,都是在一个独特的时钟周期实现的,同时零碎的控制器从当初状态(现态)转移到下一个状态(次态)。因而,能够很容易将图(a)所示的ASM图转换成状态图,如图(b)所示,其中E和F为状态转换条件。与ASM图不同,状态图无奈示意寄存器操作。 图(c)给出了ASM图的各种操作及状态转换的工夫图。 3.十字路口交通灯控制电路设计举例例(基于算法状态机构造状态图的办法)图4.4.10示意位于主干道和支干道的十字路口交通灯零碎,支干道两边装置有传感器S(Sensor),试设计一个主干道和支干道十字路口的交通灯控制电路,其技术要求如下: 个别状况下,放弃主干道畅通,主干道绿灯亮、支干道红灯亮,并且主干道绿灯亮的工夫不得少于60秒。主干道车辆通行工夫曾经达到60秒,且支干道有车时,则主干道红灯亮、支干道绿灯亮,但支干道绿灯亮的工夫不得超过30秒。每次主干道或支干道绿灯变红灯时,黄灯先亮5秒钟。 设计步骤: 明确零碎的性能,进行逻辑形象确定零碎计划并画出ASM图 交通灯管制单元的管制过程分为四个阶段,对应的输入有四种状态,别离用S0, S1, S2和S3示意: S0状态:主干道绿灯亮支干道红灯亮,此时若支干道有车期待通过,而且主干道绿灯已亮足规定的工夫距离TL(60s),控制器收回状态转换信号ST,控制器从状态S0转换到S1。 S1状态:主干道黄灯亮,支干道红灯亮,进入此状态,黄灯亮足规定的工夫距离TY(5s)时,控制器收回状态转换信号ST,控制器从状态S1转换到S2。 S2状态:支干道绿灯亮,主干道红灯亮,若此时支干道持续有车,则持续放弃此状态,但支干道绿灯亮的工夫不得超过TS(30s)工夫距离,否则管制单元收回状态转换信号ST,控制器转换到S3状态。 S3状态:支干道黄灯亮,主干道红灯亮,此时状态与S1状态继续的工夫距离雷同,均为TY(5s) ,工夫到时,控制器收回ST信号,控制器从状态S3回到S0状态。 对上述S0、S1、S2和S3四种状态依照格雷码进行状态编码,别离为00,01,11和10,由此失去交通灯管制单元的ASM图如图所示。依此类推得出所示的状态图。 (3)交通灯控制器各功能模块电路的框架设计 通过剖析交通灯控制电路的要求可知,零碎次要由传感器S(Sensor)、时钟脉冲产生器(CLK )、定时器(TL, TS, TY)、控制器及译码器形成,传感器S在有车辆通过时收回一个高电平信号。 ①设计控制器 依据交通灯管制单元的ASM图,得出其状态图如图4.4.13所示。ASM图中的状态框与状态图中的状态绝对应,判断框中的条件是状态转换的输出条件,条件输入框与管制单元状态转换的输入绝对应。状态图是形容状态之间的转换。 ②设计定时器 定时器由与零碎秒脉冲同步的计数器形成,时钟脉冲回升沿到来时,在管制信号ST作用下,计数器从零开始计数,并向控制器提供模M5、M30和M60信号,即TY、TS和TL定时工夫信号。 ③设计译码器 当交通灯控制电路处于不同工作状态时,交通信号灯按肯定的法则与之对应。 (4)用Verilog HDL形容交通灯控制电路 依据以上设计思路,能够写出交通灯控制电路的Verilog HDL代码如下: //--------------- controller.v ---------------// Traffic Signal Controller//State definition HighWay Country`define S0 2'b00 //GREEN RED,采纳宏定义形式给出状态编码`define S1 2'b01 //YELLOW RED,不倡议采纳此办法`define S2 2'b11 //RED GREEN`define S3 2'b10 //RED YELLOWmodule controller (CLK, S, nRESET, HG, HY, HR, FG, FY, FR, TimerH, TimerL);//I/O portsinput CLK, S, nRESET; //if S=1, indicates that there is car on the country roadoutput HG, HY, HR, FG, FY, FR; //declared output signals are registersreg HG, HY, HR, FG, FY, FR;output [3:0] TimerH;output [3:0] TimerL;reg [3:0] TimerH, TimerL;//Internal state variableswire Tl, Ts, Ty; //timer output signalsreg St; //state translate signalreg [1:0] CurrentState, NextState; //FSM state register/*===== Description of the timer block =====*/always @(posedge CLK or negedge nRESET )begin: counter if (~nRESET) {TimerH, TimerL} <= 8'h00; else if (St) {TimerH, TimerL} <= 8'h00; else if ((TimerH == 5) & (TimerL == 9)) begin {TimerH, TimerL} <= {TimerH, TimerL}; end else if (TimerL == 9) begin TimerH <= TimerH + 1; TimerL <= 0; end else begin TimerH <= TimerH; TimerL <= TimerL + 1; endend // BCD counterassign Ty = (TimerH==0)&(TimerL==4);assign Ts = (TimerH==2)&(TimerL==9);assign Tl = (TimerH==5)&(TimerL==9);/*===== Description of the signal controller block =====*///FSM register:State change only at positive edge of clockalways @(posedge CLK or negedge nRESET ) begin: statereg if (~nRESET) //Signal controller starts in S0 state CurrentState <= `S0; else CurrentState <= NextState; end //statereg// FSM combinational block: state machine using case statementsalways @(S or CurrentState or Tl or Ts or Ty ) begin: fsm case(CurrentState) `S0: begin //S0是用define定义的,在援用时要加右撇号(反撇号) NextState = (Tl && S) ? `S1 :`S0; St = (Tl && S) ? 1:0; end `S1: begin NextState = (Ty) ? `S2 :`S1; St = (Ty) ? 1:0; end `S2: begin NextState = (Ts || ~S) ? `S3 :`S2; St = (Ts || ~S) ? 1:0; end `S3: begin NextState = (Ty) ? `S0 :`S3; St = (Ty) ? 1:0; end endcase end //fsm/*===== Description of the decoder block =====*///Compute values of main signal and country signalalways @(CurrentState) begin case (CurrentState) `S0: begin {HG, HY, HR} = 3'b100; //Highway signal is green {FG, FY, FR} = 3'b001; //Country signal is red end `S1: begin {HG, HY, HR} = 3'b010; //Highway signal is yellow {FG, FY, FR} = 3'b001; //Country signal is red end `S2: begin {HG, HY, HR} = 3'b001; //Highway signal is red {FG, FY, FR} = 3'b100; //Country signal is green end `S3: begin {HG, HY, HR} = 3'b001; //Highway signal is red {FG, FY, FR} = 3'b010; //Country signal is yellow end endcase endendmodule状态机设计准则状态机要平安,是指FSM不会进入死循环,特地是不会进入非预知的状态,而且因为某些扰动进入非设计状态,也能很快的复原到失常的状态循环中来。这外面有两层含意: ...

February 12, 2023 · 3 min · jiezi

关于fpga:状态机设计中的关键技术

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。状态编码在应用Verilog HDL形容状态机时,通常用参数定义语句parameter指定状态编码。状态编码方案个别有三种:天然二进制编码、格雷(Gray)编码和独热码(one-hot编码)。对应于图所示的状态图的各种编码方案如表所示。 无限状态机的编码方案 状态机编码对状态机速度和面积关系重大 罕用编码 二进制码(binary)格雷码(Gray)独热码(one-hot)二进制码与格雷码是压缩状态编码,应用起码的状态位进行编码。 二进制编码的长处是应用的状态向量起码,但从一个状态转换到相邻状态时,可能有多个比特位发生变化,瞬变次数多,易产生毛刺。 格雷码特点是以后状态扭转时,状态向量中仅一位发生变化,因而当零碎的状态变动是基于异步的输出信号时,格雷编码可能防止进入谬误的状态。 格雷码既能够打消状态转换时多状态信号传输提早产生的毛刺,又可降低功耗。 独热码(one-hot编码)N个状态应用N个触发器(FF) 缩小了状态寄存器之间的组合逻辑级数,因而进步了运行速度 ;触发器(FF)数量减少,组合逻辑电路缩小;任何状态都能够间接增加/删除等批改而不会影响状态机的其余部分;因为译码简略,可进步速度,且易于批改。独热码(one-hot编码)的特点是:状态数等于触发器(FF)的数目,冗余的触发器带来的益处是译码电路的简单化,因而它的速度十分快,此外因为FPGA器件外部触发器的数量是固定的且比拟丰盛,所以one-hot编码非常适合于FPGA设计。 独热码的毛病 变动的状态位越多,组合输入稳固前所需的工夫就越长,产生的毛刺就越多 ;多个寄存器可能受异步输出的影响,使得亚稳态产生的概率有所增加 ;状态机简单状态跳转的分支很多时,要正当的调配状态编码,保障每个状态跳转都仅有1位发生变化,这是很艰难的事件。 不论应用哪种编码,状态机中的各个状态都应该应用符号常量,而不应该间接应用编码数值,赋予各状态有意义的名字对于设计的验证和代码的可读性都是无益的。 编码方法面积速度状态数量Binary (程序二进制)较好较差Log2(state N)One-hot较差较好States NumberGray较好较差Log2(state N)如何打消输入端产生的毛刺后面介绍的一般状态机由组合逻辑电路决定电路的输入.当组合逻辑较大时,若状态触发器的值发生变化或者输出信号发生变化,因为各信号在组合逻辑外部通过的门路不一样,就容易在输入端产生毛刺。 上面介绍两种罕用打消毛刺的办法: 1.具备流水线输入的Mealy状态机为了打消毛刺,能够在一般Mealy的输入逻辑后加一组输入寄存器,将寄存器的输入值作为输入向量,这种Mealy状态机的等效方框如图所示。 2.在状态位里编码输入的Moore状态机这种办法的指导思想是将状态寄存器和输入向量对立进行编码,行将状态位自身作为输入信号,其等效状态框图如下所示。 上面以图所示的状态图阐明在状态位里编码输入的办法。图中,状态机共有三个状态:IDLE,START和WAIT,输出信号为:input_1,input_2,input_3,input_4。这些输出信号的不同逻辑组合就形成了状态之间跳转的条件。 该状态机须要管制两个输入信号:output_1和output_2。能够采纳4bits的状态编码,其中高两位示意以后的状态,开端两位管制output_1和output_2的输入。IDLE状态编码为4’b0000,START状态编码为4’b0101,WAIT状态编码为 4’b1011。 参考程序如下所示: module FSM1 (nRST, CP, input_1, input_2, input_3, input_4, output_1, output_2) ; input input_1, input_2, input_3, input_4; //定义输出变量 input nRST, CP; output output_1, output_2 ; //定义输入变量 wire output_1, output_2; reg [ 3 : 0 ] Current_state, Next_state; //状态参量的定义,依据后面所述的全译码状态编码parameter [ 3 : 0 ] IDLE = 4'b0000, START = 4'b0101, WAIT = 4'b1011;//The first always block, sequential state transitionalways @(posedge CP or negedge nRST) if (!nRST) //当零碎复位时,状态寄存器置为IDLE状态 Current_state <= IDLE; //设置初态(IDLE) else //状态寄存器进行状态存储,将下一状态存储到状态寄存器成为以后状态 Current_state <= Next_state; // The second always block, combinational condition judgmentalways @(Current_state or input_1 or input_2 or input_3 or input_4) case(Current_state) //依据以后状态和状态转换条件进行译码 IDLE: if(input_1 && input_2) Next_state = START; else Next_state = IDLE; START: if(input_3) Next_state = WAIT; else Next_state = START; WAIT: if(input_4) Next_state = IDLE; else Next_state = WAIT; default: Next_state = IDLE; endcase//状态机的输入逻辑assign output_1 = Current_state[1]; assign output_2 = Current_state[0];endmodule如何应用One-hot编码方案设计状态机对状态机的各个状态赋予一组特定的二进制数称为状态编码。比拟罕用的有天然二进制码、格雷码和One-hot编码。天然二进制码和格雷码的编码方案应用的触发器较少,其编码效率较高,但负责依据以后状态和状态转换条件进行译码的组合电路会比较复杂,其逻辑规模也较大,使得次态逻辑在传输过程中须要通过多级逻辑,从而影响电路的工作速度。 ...

February 11, 2023 · 2 min · jiezi

关于fpga:基于Verilog-HDL的状态机描述方法

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。状态图的建设过程设计一个序列检测器电路。性能是检测出串行输出数据Sin中的4位二进制序列0101(自左至右输出),当检测到该序列时,输入Out=1;没有检测到该序列时,输入Out=0。(留神思考序列重叠的可能性,如010101,相当于呈现两个0101序列)。 解:首先,确定采纳米利型状态机设计该电路。因为该电路在间断收到信号0101时,输入为1,其余状况下输入为0,所以采纳米利型状态机。 其次,确定状态机的状态图。依据设计要求,该电路至多应有四个状态,别离用S1、S2、S3、S4示意。若假如电路的初始状态用S0示意,则可用五个状态来形容该电路。依据剖析,能够画出图(a)所示的原始状态图。 察看该图能够看出,S2、S4为等价状态,可用S2代替S4,于是失去简化状态图。 而后,依据下面的状态图给出该状态机的输入逻辑。该状态机只有一个输入变量Out,其输入逻辑非常简单,间接标注在状态图中了。若输入变量较多,则能够列出输入逻辑真值表。 最初,就能够应用硬件描述语言对状态图进行形容了。 状态图形容办法利用Verilog HDL语言形容状态图次要蕴含四局部内容: 利用参数定义语句parameter形容状态机中各个状态的名称,并指定状态编码。例如,对序列检测器的状态调配能够应用最简略的天然二进制码,其形容如下: parameter S0=2'b00, S1=2'b01, S2 = 2'b10, S3 = 2'b11;或者, parameter [1:0] S0=2'b00, S1=2'b01, S2 = 2'b10, S3 = 2'b11;用时序的always 块形容状态触发器实现的状态存储。应用敏感表和case语句(也能够采纳if-else等价语句)形容的状态转换逻辑。形容状态机的输入逻辑。形容状态图的办法多种多样,上面介绍几种: 单个always块形容状态机的办法(尽量避免)用一个always块对该例的状态机进行形容,其代码如下: module Detector1 ( Sin, CP, nCR, Out) ; input Sin, CP, nCR; //申明输出变量 output Out ; //申明输入变量 reg Out; reg [1:0] state; // 申明两个状态触发器变量state[1]和state[0],记忆电路现态//The state labels and their assignmentsparameter [1:0] S0=2'b00, S1=2'b01, S2 = 2'b10, S3 = 2'b11;always @(posedge CP or negedge nCR) beginif (~nCR)state <= S0; //在nCR跳变为0时,异步清零else case(state) S0: begin Out =1’b0; state <= (Sin==1)? S0 : S1; end S1: begin Out = 1’b0; state <= (Sin==1)? S2 : S1; end S2: begin Out = 1’b0; state <= (Sin==1)? S0 : S3; end S3: if (Sin==1) begin Out =1’b1; state <= S2; end else begin Out =1’b0; state <= S1; end endcaseendendmodule严格地说,对序列检测器电路用单个always块的形容办法所形容的逻辑存在着一个隐含的谬误,即输入信号Out的形容。 ...

February 10, 2023 · 2 min · jiezi

关于fpga:状态机的概念与设计

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。状态机的概念与设计状态机的根本构造及类型无限状态机的规范模型如图所示,它次要由三局部组成: 下一状态的逻辑电路(组合电路);存储状态机以后状态的时序逻辑电路(时序电路);输入组合逻辑电路(组合电路)。 个别状况下,状态触发器的数量是无限的,其状态数也是无限的,故称为无限状态机(Finite State Machine,简称为FSM)。状态机中所有触发器的时钟输出端被连贯到一个公共时钟脉冲源上,其状态的转换是在同一时钟源的同一脉冲边际同步进行的,所以它也被称作时钟同步状态机。 一般来说,状态机的基本操作次要有以下两种: 状态机的外部状态转换。产生输入信号序列。依据电路的输入信号是否与电路的输出无关,能够将状态机分为两种类型:一类是米利型(Mealy)状态机,电路的输入信号不仅与电路以后的状态无关,还与电路的输出无关;另一类是穆尔型(Moore)状态机,电路输入仅仅取决于各触发器的状态,而不受电路过后的输出信号影响或没有输出变量。 状态机的状态图表示法Mealy型 上图是米利型状态图的一个例子。在状态图中,每个状态用一个圆圈示意,圆圈内有批示状态的符号。用带箭头的方向线批示状态转换的方向,当方向线的终点和起点都在同一个圆圈上时,则示意状态不变。 一般来说,状态机中的状态转移有两种形式:无条件转移和有条件转移。在图中,从状态A转移到状态B为无条件转移,其它状态之间的转移都是有条件要求的。 Moore型须要强调指出,米利型状态图中,输入值的示意办法容易引起读者的误会。当状态机处于所在的状态,并且在所示的输出的作用下,就会产生输入值,并非在状态机转移到下一状态时才呈现输入。因为穆尔型电路的输入只依赖于状态机的以后状态,其状态图的示意办法略有不同,通常将输入变量写在示意状态的圆圈外部,图是穆尔型状态图示意的例子。 状态机的设计步骤一般来说,状态机的设计步骤如下所示: 根据具体的设计准则,确定采纳状态机类型:穆尔型状态机还是米利型状态机。剖析设计要求,列出状态机的所有状态,并对每一个状态进行状态编码。依据状态转移关系和输入函数,画出状态图(状态表)。依据所画的状态图,采纳硬件描述语言对状态机进行形容。第3步是最艰难也是最有创造性的一步。状态图直观地反映了状态机各个状态之间的转换关系以及转换条件,但要求设计的状态个数不能太多。状态个数较多,采纳状态表的办法列出状态机的转移条件。输入信号较多,可采纳输入逻辑真值表进行示意。 参考文献: Verilog HDL与FPGA数字零碎设计,罗杰,机械工业出版社,2015年04月Verilog HDL与CPLD/FPGA我的项目开发教程(第2版), 聂章龙, 机械工业出版社, 2015年12月Verilog HDL数字设计与综合(第2版), Samir Palnitkar著,夏宇闻等译, 电子工业出版社, 2015年08月Verilog HDL入门(第3版), J. BHASKER 著 夏宇闻甘伟 译, 北京航空航天大学出版社, 2019年03月欢送关注公众号【AIShareLab】,一起交换更多相干常识,前沿算法,Paper解读,我的项目源码,面经总结。

February 9, 2023 · 1 min · jiezi

关于fpga:m序列码产生电路设计与仿真

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。m 序列又叫做伪随机序列、伪噪声(pseudo noise,PN)码或伪随机码,是一种能够预先确定并能够反复地产生和复制、又具备随机统计个性的二进制码序列。 伪随机序列个别用二进制示意,每个码元(即形成m序列的元素)只有“0”或“1”两种取值,别离与数字电路中的低电平或高电平绝对应。 m 序列是对最长线性反馈移位寄存器序列的简称,它是一种由带线性反馈的移位寄存器所产生的序列,并且具备最长周期。 图所示是一种3位m序列产生器,它将1,3两级触发器的输入通过同或门反馈到第一级的输出端。 其工作原理是:在清零后,3个触发器的输入均为0,于是同或门的输入为1,在时钟触发下,每次移位后各级寄存器状态都会发生变化。 剖析该电路失去如图所示的仿真波形图,其中任何一级触发器(通常为末级)的输入都是一个周期序列(或者称为m序列),但各个输入端的m序列的初始相位不同。m序列的周期不仅与移位寄存器的级数无关,而且与线性反馈逻辑和初始状态无关。 此外,在雷同级数的状况下,采纳不同的线性反馈逻辑所失去的周期长度是不同的。 该电路的状态转换图如图所示。 共有$2^3-1=7$个状态 通常,将相似于图所示构造的m序列产生器称为简略型码序列发生器(Simple Shift Register Generator,SSRG),它的个别构造如下图所示。 图中,各个触发器ai(i=1,2,…r)形成移位寄存器,代表异或运算,C0、C1、C2、……、Cr是反馈系数,也是特色多项式的系数。系数取值为1示意反馈支路连通,0示意反馈支路断开。 对于SSRG构造的m序列发生器,其特色多项式的个别表达式为 $$f(x)=C_{0} x^{0}+C_{1} x^{1}+C_{2} x^{2}+\cdots+C_{r} x^{r}$$ 特色多项式系数决定了一个m序列的特色多项式,同时也就决定了一个m序列。 下表给出了局部m序列的反馈系数,系数的值是用八进制数示意的。 依据多项式的系数能够产生m序列。 例如,想要产生一个码长为31的m序列,寄存器的级数r = 5,从表中查到反馈系数有三个,别离为45、67、75,能够从中抉择反馈系数45来形成m序列产生器,因为应用45时,反馈线起码,形成的电路最简略。 45为八进制数,写成二进制数为100101,这就是特色多项式的系数,即 C5 C4 C3 C2 C1 C0=100101 表明C5、C2、C0三条反馈支路是连通的,另外三条反馈支路C4、C3、C1是断开的,其电路如图所示。 Verilog HDL程序如下: module m5(CLK, CLRN, OUT); input CLK, CLRN; //输出端口 output OUT; //输入端口 reg[4:0] Q; //两头节点 wire C0;assign C0 = ~(Q[4] ^ Q[1]); //反馈assign OUT = Q[4]; //输入信号always@(posedge CLK or negedge CLRN)begin if(!CLRN ) Q[4:0] <= 5'b00000; //异步清零 else Q[4:0] <= {Q[3:0],C0}; //移位endendmodule仿真波形(m序列长度为31): ...

February 8, 2023 · 1 min · jiezi

关于fpga:分层次的电路设计方法

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。分档次的电路设计办法设计办法 应用自下而上的办法(bottom-up) : 实例援用根本门级元件xor、and定义底层的半加器模块halfadder;实例援用两个半加器模块halfadder和一个根本或门元件or组合成为1位全加器模块fulladder;实例援用4个1位的全加器模块fulladder形成4位全加器的顶层模块。全加器电路设计举例一位半加器的形容//************ 一位半加器的形容 ************module halfadder (S,C,A,B); //IEEE 1364—1995 Syntax input A,B; //输出端口申明 output S,C; //输入端口申明 xor (S,A,B); //实例援用逻辑门原语 and (C,A,B);endmodule 一位全加器的形容//************ 一位全加器的形容 ************module fulladder (Sum,Co,A,B,Ci); input A,B,Ci; output Sum,Co; wire S1,D1,D2; //外部节点信号申明 halfadder HA1 (.B(B),.S(S1),.C(D1),.A(A)); //实例援用底层模块halfadder halfadder HA2 (.A(S1),.B(Ci), .S(Sum),.C(D2)); //端口信号依照名称对应关联 or g1(Co,D2,D1);endmodule四位全加器的形容//************四位全加器的形容************module _4bit_adder (S,C3,A,B,C_1); input [3:0] A,B; input C_1; output [3:0] S; output C3; wire C0,C1,C2; //申明模块外部的连接线 fulladder U0_FA (S[0],C0,A[0],B[0],C_1); //实例援用模块fulladder fulladder U1_FA (S[1],C1,A[1],B[1],C0); //端口信号依照地位程序对应关联 fulladder U2_FA (S[2],C2,A[2],B[2],C1); fulladder U3_FA (S[3],C3,A[3],B[3],C2);endmodule 模块实例援用语句模块实例援用语句的格局如下: ...

February 1, 2023 · 1 min · jiezi

关于fpga:Verilog-HDL行为级建模

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。行为级建模就是形容数字逻辑电路的性能和算法。 在Verilog中,行为级形容次要应用由关键词initial或always定义的两种构造类型的语句。一个模块的外部能够蕴含多个initial或always语句。 initial语句是一条初始化语句,仅执行一次,常常用于测试模块中,对激励信号进行形容,在硬件电路的行为形容中,有时为了仿真的须要,也用initial语句给寄存器变量赋初值。 initial语句次要是一条面向仿真的过程语句,不能用于逻辑综合 。这里不介绍它的用法。 在always结构型语句外部有一系列过程性赋值语句,用来形容电路的性能(行为)。 行为级建模根底上面介绍行为级建模中常常应用的语句: always语句构造及过程赋值语句条件语句(if-else)多路分支语句(case-endcase)for循环语句(例如 for等)1. always语句的个别用法always @(事件管制表达式)begin:块名 块内局部变量的定义; 过程赋值语句(包含高级语句);end“@”称为事件管制运算符,用于挂起某个动作,直到事件产生。“事件管制表达式”也称为敏感事件表,它是前面begin和end之间的语句执行的条件。当事件产生或某一特定的条件变为“真”时,前面的过程赋值语句就会被执行。 begin…end 之间只有一条语句时,关键词能够省略; begin…end 之间的多条语句被称为程序语句块。能够给语句块取一个名字,称为有名块。 2. 条件语句( if语句)条件语句就是依据判断条件是否成立,确定下一步的运算。 Verilog语言中有3种模式的if语句: (1) if (condition_expr) true_statement; (2) if (condition_expr) true_statement; else false_ statement;(3) if (condition_expr1) true_statement1; else if (condition_expr2) true_statement2; else if (condition_expr3) true_statement3; …… else default_statement;if前面的条件表达式个别为逻辑表达式或关系表达式。执行if语句时,首先计算表达式的值,若后果为0、x或z,按“假”解决;若后果为1,按“真”解决,并执行相应的语句。 例:应用if-else语句对4选1数据选择器的行为进行形容 module mux4to1_bh(D, S, Y); input [3:0] D; //输出端口 input [1:0] S; //输出端口 output reg Y; //输入端口及变量数据类型 always @(D, S) //电路性能形容,或@(D or S) if (S == 2’b00) Y = D[0]; else if (S== 2’b01) Y = D[1]; else if (S== 2’b10) Y = D[2]; else Y = D[3];endmodule 留神,过程赋值语句只能给寄存器型变量赋值,因而,输入变量Y的数据类型定义为reg。 ...

January 31, 2023 · 2 min · jiezi

关于fpga:Verilog-HDL数据流建模与运算符

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。对于根本单元逻辑电路,应用Verilog语言提供的门级元件模型形容电路十分不便。 但随着电路复杂性的减少,应用的逻辑门较多时,应用HDL门级形容的工作效率就很低。 数据流建模可能在较高的形象级别形容电路的逻辑性能,并且通过逻辑综合软件,可能主动地将数据流形容转换成为门级电路。 数据流建模次要应用逻辑表达式,所以要理解各种运算符和表达式。 数据流建模数据流建模应用的间断赋值语句,由关键词assign开始,前面跟着由操作数和运算符等组成的逻辑表达式。 个别用法如下: wire [位宽阐明] 变量名1,变量名2,……,变量名n;assign 变量名=表达式;留神,assign 语句只能对wire型变量进行赋值,所以等号右边变量名的数据类型必须是wire型。 例:用数据流形容形式建设模型 $Y=D_{0} \cdot \bar{S}+D_{1} \cdot S$ module mux2to1_dataflow(D0, D1, S, Y ); input D0, D1, S; output Y; wire Y ; //上面是逻辑性能形容 assign Y = (~S & D0) | (S & D1); //表达式右边Y必须是wire型endmodule 例:用条件运算符形容2选1的数据选择器。module mux2x1_df (D0,D1,S,L); input D0,D1,S; output L; assign L = S ? D1 : D0;endmodule条件运算符:如果S=1,则输入L=D1;否则L=D0。 例:用数据流建模办法对2线-4线译码器的行为进行形容。 module decoder_df (A1,A0,E,Y); input A1,A0,E; output [3:0] Y; assign Y[0] = ~(~A1 & ~A0 & ~E); assign Y[1] = ~(~A1 & A0 & ~E); assign Y[2] = ~( A1 & ~A0 & ~E); assign Y[3] = ~( A1 & A0 & ~E);endmodule运算符及其优先级运算符 (9类) ...

January 30, 2023 · 1 min · jiezi

关于fpga:Verilog-HDL门级建模

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。基本概念构造级建模: 就是依据逻辑电路的构造(逻辑图),实例援用Verilog HDL中内置的根本门级元件或者用户定义的元件或其余模块,来形容结构图中的元件以及元件之间的连贯关系。 门级建模: Verilog HDL中内置了12个根本门级元件(Primitive,有的翻译为“原语”)模型,援用这些根本门级元件对逻辑图进行形容,也称为门级建模。 根本门级元件(Primitive : 原语)多输出门:and、nand、or、nor、xor、xnor 只有单个输入, 1个或多个输出多输入门:not、buf 容许有多个输入, 但只有一个输出三态门:bufif0、bufif1、notif0、notif1 有一个输入, 一个数据输出和一个管制输出上拉电阻pullup、下拉电阻pulldown多输出门多输出门的个别援用格局为: Gate_ name <instance> (OutputA, Input1, Input2,…, InputN);Gate_ name共6个: and、nand、or、nor、xor、xnor 特点: 只有1个输入,有多个输出。原语名称图形符号逻辑表达式and(与门)L = A & Bnand(与非门)L = ~(A & B)or(或门)L = A \Bnor(或非门)L =~( A \B)xor(异或门)L = A ^ Bxnor(同或门)L = A ~^ B根本门的调用办法举例: and A1(out,in1,in2,in3);xnor NX1(out,in1,in2,in3,in4); 对根本门级元件,调用名A1、NX1能够省略。 若同一个根本门在以后模块中被调用屡次,可在一条调用语句中加以阐明,两头以逗号相隔。 and、nand真值表and 输出1输出1输出1输出1 01xz输出200000输出2101xx输出2x0xxx输出2z0xxxnand 输出1输出1输出1输出1 01xz输出201111输出2110xx输出2x1xxx输出2z1xxx多输入门容许有多个输入,但只有一个输出。 buf B1(out1,out2,…,in); buf真值表 not N1(out1,out2,…,in); ...

January 29, 2023 · 1 min · jiezi

关于fpga:Verilog-HDL基本语法规则

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。词法规定为对数字电路进行形容,Verilog语言规定了一套残缺的语法结构。 1.距离符Verilog 的距离符次要起分隔文本的作用,能够使文本错落有致,便于浏览与批改。距离符包含空格符(\b)、TAB 键(\t)、换行符(\n)及换页符。 2.正文符正文只是为了改善程序可读性,编译时不起作用。 多行正文符(用于写多行正文): / --- /;单行正文符 :以//开始到行尾完结为正文文字。3.标识符和关键词标识符: 给对象(如模块名、电路的输出与输入端口、变量等)取名所用的字符串。以英文字母或下划线开始如,clk、counter8、_net、bus_A 。 关键词: 用Verilog语言自身规定的非凡字符串定义语言的构造。例如,module、endmodule、input、output、wire、reg、and等都是关键词。关键词都是小写,关键词不能作为标识符应用 。 逻辑值汇合为了示意数字逻辑电路的逻辑状态,Verilog语言规定了4种根本的逻辑值。 0逻辑0、逻辑假1逻辑1、逻辑真x或X不确定的值(未知状态)z或Z高阻态常量及其示意三种类型的常量 整数型常量实数型常量字符串型常量整数型常量十进制数模式的示意办法:示意有符号常量。例如:30、-2 带基数模式的示意办法: 格局为:<+/-><位宽>’<基数符号><数值> 例如:3’b101、5’o37、8’he3,8’b1001_0011 实数型常量十进制记数法 如: 0.1、2.0、5.67 迷信记数法 如: 23_5.1e2、5E-4、23510.0、0.0005 字符串常量字符串是用双撇号括起来的字符序列,它必须蕴含在同一行中,不能分成多行书写。例如: ''this is a string'' ''hello world!''符号常量Verilog 容许用参数定义语句定义一个标识符来代表一个常量,称为符号常量。定义的格局为: parameter 参数名1=常量表达式1 ,参数名2=常量表达式2 , … 如 parameter BIT=1, BYTE=8, PI=3.14; parameter和localparam区别Verilog中用parameter或者localparam来定义常量,即用来定义一个标志符代表一个常量,从而进步程序的可读性。其阐明格局如下: parameter/localparam 参数名1=表达式,参数名2=表达式, …;区别: parameter可用作在顶层模块中例化底层模块时传递参数的接口;localparam的作用域仅仅限于以后module,不能作为参数传递的接口。3.1.4 数据类型(Data Types)变量的数据类型线网型寄存器型线网类型:是指输入始终依据输出的变动而更新其值的变量,它个别指的是硬件电路中的各种物理连贯. 例:网络型变量L的值由与门的驱动信号A和B所决定,即L=A&B。A、B的值发生变化,线网L的值会立刻跟着变动。 罕用的线网类型由关键词wire定义,格局如下: wire [n-1:0] 变量名1,变量名2,…,变量名n;线网类型变量及其阐明线网类型性能阐明wire, tri用于示意单元(元件)之间的连线,wire为个别连线; tri用于形容由多个信号源驱动的线网,并没有其余非凡 意义,两者的性能完全相同。wor, trior具备线或个性的线网,用于一个线网被多个信号驱动的 状况wand, triand具备线与个性的线网,用于一个线网被多个信号驱动的 状况trireg具备电荷放弃个性的线网类型,用于开关级建模tri1上拉电阻,用于开关级建模tri0下拉电阻,用于开关级建模supply1用于对电源建模,高电平1supply0用于对地建模,低电平0对于多重驱动在写可综合的Verilog代码时,倡议不要对同一个变量进行屡次赋值(简称多重驱动),以避免出现多个信号同时驱动一个输入变量的状况。 例如,A、B、C三个外部信号同时接到(驱动)一个输入端L。或者说,输入L同时被三个外部信号所驱动。此时L的逻辑值可无奈确定。 ...

January 28, 2023 · 1 min · jiezi

关于fpga:Verilog-HDL仿真常用命令

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。文章和代码已归档至【Github仓库:hardware-tutorial】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。零碎工作(System Tasks)1.显示工作(Display Task)&dollar;display是Verilog中最有用的工作之一,用于将指定信息(被援用的字符串、变量值或者表达式)以及结束符显示到规范输出设备上。其格局如下: 2.&dollar;monitor工作的参数格局与&dollar;display的雷同. 3.仿真的停止 (Stopping) 和 实现(Finishing)工作&dollar;stop;//在仿真期间,进行执行,未退出仿真环境。&dollar;finish;//仿真实现,退出仿真环境,并将控制权返回给操作系统。零碎工作&dollar;stop使得仿真进入交互模式,而后设计者能够进行调试。当设计者心愿查看信号的值时,就能够应用&dollar;stop使仿真器被挂起。而后能够发送交互命令给仿真器持续仿真。编译指令(Compiler Directives)以 `(反撇号)结尾的标识符就是编译指令,用来控制代码的整个过程。在Verilog代码编译的整个过程中,编译指令始终无效(编译过程可能逾越多个文件),直至遇到其余不同的编译指令为止。 `timescale time_unit/time_precision`include " ../../header.v "`define WORD_SIZE 32 //定义文本宏 `undef`ifdef `ifndef `else `elseif `endif时间尺度`timescale\`timescale命令用于在文件中指明工夫单位和工夫精度,通常在对文件进行仿真时体现。EDA工具能够反对在一个设计中可依据仿真须要在不同模块外面指定不同的工夫单位。如模块A仿真的工夫单位为皮秒(ps),模块B仿真的工夫单位为纳秒(ns)。 应用\`timescale命令语句格局如下: \`timescale <工夫单位> / <工夫精度>应用时留神: <工夫单位>和<工夫精度>必须是整数,且工夫精度不能大于工夫单位值。例如:\`timescale 1ns / 1ns工夫单位是定义仿真工夫和延迟时间的基准单位;工夫精度是定义模块仿真工夫的准确水平的,又被称为取整精度(在仿真前,被用来对提早的工夫值进行取整操作)。如果在同一个设计中,呈现多个\`timescale命令,工具会采纳最小的工夫精度值来决定仿真的工夫单位。 \`timescale 1ns / 1ps:此命令已定义模块中的工夫单位为1ns,即仿真模块中所有的延迟时间单位都是1ns的整数倍;定义了模块的工夫精度为1ps,即仿真模块中提早单位能够指定到小数点后3位,小数超过3位会进行取小数点后3位的操作。 宏定义\`define在设计中,为了进步程序可读性和简化程序形容,能够应用指定的标识符来代替一个长的字符串,或者应用一个简略的名字来代替没有含意的数字或者符号,此时需应用到宏定义命令\`define。 应用\`define命令格局如下: \`define signal(宏名) string(宏内容)在设计中进行了以上申明后,在预编译解决时,在此命令后程序中所有的signal都替换成string,此过程称为“宏开展”。//例1 :`define LENGTH 16 reg [ `LENGTH–1 : 0 ] writedata; //即定义reg[15:0] writedata;//例2 :`define expression a+b+c assign data = `expression + d ; //经宏开展之后 //assign data = a+b+c+d;//例3 :`define A a+b`define B c+`A assign data = `B ; // 即data = c + a + b;文件蕴含指令\`include和C语言中申明头文件很相似。其个别模式为: ...

January 27, 2023 · 1 min · jiezi

关于fpga:FPGAVerilog-HDL程序的基本结构

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,联合Verilog HDL语言学习与仿真,次要对组合逻辑电路与时序逻辑电路进行剖析与设计,对状态机FSM进行分析与建模。本文已收录于MySQL系列专栏:FPGA 欢送订阅,继续更新。文章和代码已归档至【Github仓库】,须要的敌人们自取。或者关注公众号【AIShareLab】,回复 FPGA 也可获取。简略Verilog HDL程序实例Verilog应用大概100个预约义的关键词定义该语言的构造 Verilog HDL程序由模块形成。每个模块的内容都是嵌在两个关键词module和endmodule之间。每个模块实现特定的性能。每个模块先要进行端口的定义,并阐明输出(input) 、输入(output) 和双向(inout),而后对模块性能进行形容。除了endmodule外,每个语句后必须有英文的分号(;)。能够用/ --- /和//…..,对Verilog HDL程序的任何局部做正文。半加器程序实例 /* Gate-level description of a half adder */module HalfAdder_GL(A, B, Sum, Carry); input A ,B ; //输出端口申明 output Sum, Carry ; //输入端口申明 wire A ,B , Sum ,Carry ; xor X1 (Sum, A, B ); and A1 (Carry, A, B); endmodule/* Dataflow description of a half adder */module HalfAdder_DF(A, B, Sum, Carry); input A ,B ; output Sum ,Carry ; wire A ,B,Sum ,Carry ; assign Sum = A ^ B; assign Carry = A & B; endmodule/* Behavioral description of a half adder */module HalfAdder_BH(A, B, Sum, Carry); input A ,B ; output Sum ,Carry ; reg Sum ,Carry ; //申明端口数据类型为寄存器 always @(A or B) begin Sum = A ^ B; //用过程赋值语句形容逻辑性能 Carry = A & B; endendmodule2选1数据选择器的程序实例 ...

January 25, 2023 · 2 min · jiezi

关于fpga:DatenLord-前沿技术分享-No6

1、演讲题目Corumdum介绍 2、演讲工夫2022年10月16日 上午10:30 3、演讲人李钊,西安电子科技大学 ISN网络与替换团队 硕士研究生 4、引言Github 100G开源高性能网卡——Corundum介绍。本次分享将会从Corundum的架构特点、实现细节、数据门路操作以及仿真方面实现介绍,能够不便大家疾速入门并相熟Corundum网卡设计。 5、内容简介Corundum是一个开源的、基于FPGA的高性能网卡和网络内计算的平台。其特点包含高性能数据通路、10G/25G/100G以太网、PCI express gen 3、一个定制的、高性能的、严密集成的PCIe DMA引擎、许多(1000多个)发送、接管、实现和事件队列、扩散/汇集DMA、MSI、多个接口、每个接口多个端口、每个端口发送调度,包含高精度TDMA、流量散列、RSS、校验和卸载,以及本地IEEE 1588 PTP工夫戳。包含一个与Linux网络栈集成的Linux驱动程序。宽泛的仿真框架促成了开发和调试,该框架涵盖了整个零碎,从驱动器和PCI Express接口的仿真模型到另一侧的以太网接口。 6、直播预约欢迎您预约直播,或者登陆腾讯会议观看直播:会议号:772-6477-5345

October 13, 2022 · 1 min · jiezi

关于fpga:基于FPGA的贪吃蛇游戏设计使用VGA显示屏与蓝牙外设模块

阐明:本文章由自己于2022.1.18公布于CSDN平台,后续思考次要应用思否持续博客撰写与技术学习,即此篇系自己跨平台迁徙,并非剽窃,CSDN平台上原文已删除,特此说明。 一、引言本工程是校内课程----数字逻辑的大作业,实现水平集体预计在70%左右,仍存在些许bug(详见本文章开端局部),心愿可能对读者起到肯定的帮忙 同时,本工程外围代码局部次要参考的是另一篇文章,若有类似需要可先参考该文章,解说十分具体:基于FPGA的VGA显示对贪吃蛇游戏的设计 二、环境形容本工程应用的是Xilinx公司的NEXYS4 DDR开发板,输入输出的各管脚规范均参考该开发板官网文档; 应用的开发语言为verilog HDL; 开发平台为vivado 2016(注:因为学校要求应用该版本,因而没有应用更新版本的vivado,但因为并没有应用到ROM、RAM等进阶性能,因而差异应该不会太大); 在此基础上应用两个外设部件,别离为vga显示屏与蓝牙模块,其中:在本工程中应用640*480@60Hz的参数型号,若应用其它分辨率需自行批改vga模块代码的参数。 三、总工程设计总零碎逻辑如上图所示,次要是通过开发板上自带按钮与开关,以及蓝牙模块作为输出,vga显示屏与开发板上的灯作为输入,外围局部为三个状态机(总模式抉择零碎、难度抉择零碎、蛇朝向零碎)以及蛇挪动局部。 四、各子系统及局部源码4.1. vga模块根本应用vga时序图如下:注:若对于vga相干时序及代码调用办法较为相熟,则可跳过此局部。vga模块作为外设来说其时序规范事实上绝对较为简单,搞清楚上两张图中的时序规范就可能正确应用。对于初学者而言,倡议先实现 彩条的显示 以及 挪动方块的显示 两个性能,在搞明确这两个性能实现的过程当前,实现贪吃蛇的vga显示就没有问题了。如何实现以上两个局部请自行查阅网上相干材料,应该说比拟好找。 4.1.1. vga接口首先,动手一个新的外设模块集体认为能够先尝试了解该模块与内部模块如何连贯,即该模块的输入输出局部。vga模块总共有以下的输入输出: input clk, // 零碎时钟 input rst_n, // 零碎复位 output reg [3:0] O_red, // VGA红色重量 output reg [3:0] O_green, // VGA绿色重量 output reg [3:0] O_blue, // VGA蓝色重量 output O_hs, // VGA行同步信号 output O_vs // VGA场同步信号1)clk:clk是传进vga模块的时钟,而这个时钟频率须要依据相应的分辨率型号而固定,例如本工程应用的640*480@25Hz,必须应用25mHz的时钟频率。能够参考上一张图中时钟这一栏。而在verilog代码编写过程中,能够应用vivado自带的时钟分频性能失去相应的时钟(请自行查阅材料),也能够本人实现分频(仅限于指标时钟频率是零碎时钟频率的因数),本工程零碎时钟为100mHz,因而在顶层模块中自行实现了分频,再传进vga模块: //分频25Malways @(posedge clk or negedge rst_n)begin if(!rst_n) clk_50M <= 1'b0 ; else clk_50M <= ~clk_50M ; endalways @(posedge clk_50M or negedge rst_n)begin if(!rst_n) clk_25M <= 1'b0 ; else clk_25M <= ~clk_25M ; end2)rst_n:rst_n即为复位键,较为简单,间接跳过 ...

September 19, 2022 · 19 min · jiezi

关于fpga:Zynq7010einkcontroller

这是一个基于Zynq7010的Eink控制器此工程在Hanley-Yao/Zynq7010_eink_controller EBAZ4205控制板搭载的也是ZYNQ7010前段时间在咸鱼20元+10元邮费就能够带回家了呢~ 很快我就发现我还是不会玩EBAZ4205于是我又买了一块来自MicroPhase的Z7-Lite 还是诚实用开发板比拟不便...(。_。) 开发软件VersinoVivado2020.2Vitis2020.2Sublime Text33.2.2, Build 3211Icarus Verilog12.0 (devel) (s20150603-1110-g18392a46)屏幕驱动外围次要借鉴 julbouln/ice40_eink_controller 我的项目指标将输出的图像输入到任意尺寸任意信号(8bit/16bit)的Eink墨水屏[❌]我的项目详情20210721:应用LCEDA画了一块Z7-Lite测试ED097TC2的小板子,并发送给捷配打样从一个大佬手里扣出了一块TPS65185的Eink电源模块PCB文件,源文件是AD格局因为我不太会用AD转换成LCEDA的格局,打样实现后元器件明天才到齐懒得焊接20210804:实现Verilog状态机读取EC11旋转编码器,成果还能够~焊接完TPS65185模块...没反馈...焊接完Z7-Lite测试ED097TC2的小板子,发现对板接口弄反了以及把旋转编码器的B相误接到开发板的网口IC复位腿上20210805:从新绘制并且打样Z7-Lite测试ED097TC2的小板子。打样中,预计20210808到货TPS65185模块从新打样到货。懒得焊接,元件可能不够20210809:焊接了新的Z7-Lite测试ED097TC2的小板子,测试发现又画错了好几个中央,飞线解决从新画了新的Z7-Lite测试ED097TC2的小板子,不知道下次又是哪里出错焊接实现新的TPS65185模块,I2C可能辨认然而还未能失常工作20210810:发现一个很重大的问题,如果Eink的管制信号通过Z7-Lite测试ED097TC2的小板子从IT8951桥接则屏幕会呈现含糊、重影等问题,通过查看连接器焊接,线路应该是没问题的 [详见log\20210810] 老老实实依照规范从新绘制管制信号线等长的Z7-Lite测试ED097TC2的小板(说实话有点疼爱板厂哈哈哈)!PCB20210814:明天是七夕节欸...又是独身的一年...20210822:实现TPS65185的测试程序... 后果:不晓得为啥程序上电会导致花屏幕,因为其余局部未实现,无奈确定是否与屏幕信号悬空无关...! 20210828:因为在目前的布局中,简直用不到PS端,所以打算I2C通信间接在PL端上实现以缩小搭建零碎的复杂度同时晋升通用性很苦逼的用Verilog撸I2C模块,网上抄一抄改一改能用就行。因为本身技术有余而且仿佛也无需用到残缺I2C协定写一个假的I2C或者是残缺协定的I2C模块还在思考中...20210829:调用 AngeloJacobo/FPGA_I2C_Implementation 模块实现FPGA硬件I2C通信,顺利驱动了TPS65185模块20210909:本来应用其余大佬绘制的邮票孔连贯的TPS65185 MODLE因为我比拟菜常常换底板拆装十分麻烦容易损坏。故本人从新绘制了采纳NGFF-M-KEY连接器的电源模块。而后09-08 23:40下单09-10 23:40还没投产,可谁让JLC是收费的呢!咕咕咕...咕咕咕...20210913:莆田因为疫情不让上学啦,我的板子也还没有到...调用Digilent/vivado-library实现了HDMI_RX,然而须要重启电脑能力辨认到HDMI设施,我使能了HDMI_HPD然而仿佛这并没有什么用...也就是目前而言仿佛不反对热插拔...哭唧唧20210915:画了反对HDMI_RX和NGFF接口的电源模块的新底板,因为线路局部在5mil所以只能用JLC打样打算工作20210721:先定个小指标,用PL端或者PS端惯例驱动TPS65185模块[✔] 20210804:从新绘制Z7-Lite测试ED097TC2的小板子[✔] 20210810:从新绘制管制信号线等长的Z7-Lite测试ED097TC2的小板子[✔] 20210822:实现管制信号局部[❌] 20210828:调用I2C模块实现了FPGA硬件管制TPS65185模块[✔] 20210909:FPGA实现1bit图像误差扩散算法[❌]

September 16, 2021 · 1 min · jiezi

关于fpga:FPGAQuartus-Prime-201-安装过程记录

Quartus Prime 20.1 装置过程记录 Quartus 是开发Altera家(现已被Intel收买)FPGA必备的软件,这里记录一下装置的过程。 装置软件本体首先,当然是筹备文件了,去官网下载即可,传送门,倡议抉择组合文件。而后,根据官网的装置指南中的提醒,运行解压后失去的文件夹中的“setup.bat”来启动装置过程。装置过程中抉择装置门路的时候倡议本人新建一个文件夹放着,例如Quartus Prime 20.1这样的,因为装置实现之后会在指定的目录下放好几个文件夹,如果不小心抉择了“FPGA-About”这样的文件夹来装置就会给本人造成困扰。其余的就是按默认的来,一路Next即可。最初,运行的时候会弹这么个窗口,如图抉择: 最初,弹出如下界面: Bingo! USB Blaster驱动装置 装置软件本体的时候装置了USB Blaster II的驱动,然而很多人可能还是会用USB Blaster来进行下载和调试(毕竟便宜嘛),所以呢,还须要额定装置驱动。 首先,USB Blaster插上电脑,设施管理器中情况如下: USB Blaster这一项上右键,抉择“更新驱动程序 --> 浏览我的计算机以查找驱动程序软件”,而后抉择Quartus装置目录下的“quartus/drivers/usb-blaster”,而后点击“下一步”。顺利装置的话将有如下提醒: 而后设施管理器中情况如下: Bingo! 配置内部编辑器 Quartus自带的编辑器性能较弱,用惯了VSCode等等优良编辑器的人大概率会不爽,所以来配置一下内部编辑器吧。 首先,主界面下顺次抉择“Tools --> Options --> Prefered Text Editor”,来到如下界面: 而后,“Text Editor”一项抉择“Custom”。Command-Line中双引号中的内容替换为本人编辑器的门路,而后写一些参数。笔者的配置如下: "门路,例如D:\xxx\xxx\Code.exe" -r -g %f:%l点OK退出,之后再关上新的代码文件就是应用内部编辑器了。(有个槽点——关上新文件的时候名称默认是相似“verilog1.v”这样的格局,如果应用自带的编辑器,保留时会主动保留为工程名,然而用VSCode会保留为关上时的名称,须要本人再手动批改一下,有点不不便) 配置ModelSim 后面装置Quartus的时候顺便装置了一个简化版的ModelSim,然而软件外面没用主动配置好门路等信息,所以须要咱们来配置一下。 从顶部菜单开始,顺次抉择“Tools --> Options --> EDA Tool Options”,而后为ModelSim-Altera这一项抉择门路,具体到“modelsim.exe”所在的文件夹即可。 嗯,配置好了。

August 19, 2020 · 1 min · jiezi