我是靠谱客的博主 优雅石头,最近开发中收集的这篇文章主要介绍[Verilog]Verilog经典电路设计(一)Verilog经典电路设计(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Verilog经典电路设计(一)

 1.1 8位移位寄存器

module shifter (din , clk, clr, dout) ; 
  input din, clk, clr; 
  output [7:0] dout; 
  reg [7:0] dout_data;

  always @(posedge clk) begin 
    if (!clr) dout_data <= 8'b0;         //同步清 ,高电平有效 
    else begin 
      dout_data    <= dout_data << l;    //输出 号左移一位  
      dout_data[O] <= din ;              //输入信号补充到输出信号的最低位
    end 
  end 

  assign dout = dout_data;

endmodule

 1.2 4位串并转换

module serial_pal(clk, reset, en, in, out); 
  input clk,reset,en, in; 
  output reg [3:0] out; 

  always @(posedge clk or negedge reset) begin 
    if(!reset)   out <= 4'h0; 
    else if(en)  out <= {out, in}; //使用连接运算符    
  end 

endmodule

 1.3 状态机设计的例子

       有限状态机(FSM)是许多数字系统中用来控制系统和数据流路径行为的时序电路。FSM的实例包括控制单元时序。 本实验介绍了两种类型的FSM(Mealy和Moore)的概念,以及开发此类状态机的建模方式。 请参阅Vivado教程,了解如何使用Vivado工具创建项目和验证数字电路。

  •  Mealy FSM(米利型有限状态机)

       有限状态机(FSM)或称简单状态机用于设计计算机程序和时序逻辑电路。它被设想为抽象机器,可以处于有限数量的用户定义状态之一。机器一次只能处于一种状态; 它在任何给定时间所处的状态称为当前状态。 当由触发事件或条件启动时,它可以从一种状态改变为另一种状态; 这称为过渡。特定FSM由其状态列表和每个转换的触发条件定义。
       在现代社会中的许多设备中可以观察到状态机的踪影,这些设备根据发生的事件序列执行预定的动作序列。 简单的例子是自动售货机,当存放硬币的金额达到商品价格时分配产品;电梯在把乘客送达楼上后才会下降;交通灯按一定的时间改变信号来控制车流;以及需要输入一串正确的数字才能打开的组合锁。
       状态机使用两种基本类型建模–Mealy和Moore。 在Mealy机器中,输出取决于当前状态和当前输入。在Moore机器中,输出仅取决于当前状态
       Mealy型状态机的一般模型由组合过程电路和状态寄存器组成,组合过程电路生成输出和下一个状态,状态寄存器保存当前状态,如下图所示。状态寄存器通常建模为D触发器。状态寄存器必须对时钟边缘敏感。其他块可以使用always过程块或always过程块和dataflow建模语句的混合来建模;always过程块必须对所有输入敏感,并且必须为每个分支定义所有输出,以便将其建模为组合块。两段式Mealy机器可以表示为:

 

       三段式Mealy机器可以表示为:

       状态分配可以使用独热码(one – hot code),二进制编码,格雷码以及其他编码。通常,综合工具将确定状态分配的编码,但用户也可以通过更改综合属性来强制特定编码,如下所示。状态分配编码将对状态寄存器中使用的位数产生影响;独热编码使用最多的位数,但解码非常快,二进制编码使用最少的位数,但解码较长

module FSM (clk, clr, out, start, step2, step3);
  input clk, clr, start, step2, step3;
  output reg [2:0] out ;
  reg [2:0] out ;
  reg [l:0] state, next_state;

  parameter state0 = 2'b00, statel = 2'b0l,
            state2 = 2'bll, state3 = 2'bl0;  //状态编码,采用格雷(Gray)编码方式

  always @(posedge clk or negedge clr) begin //该进程定义起始状态
    if(!clr) state <= state0;
    else state     <= next_state;
  end

  always @(state or start or step2 or step3) begin  //该进程实现状态转换
    case (state)
      state0 : begin
        if (start) next_state  = statel;
        else next_state        = state0;
      end
      statel : begin
        next_state <= state2;
      end
      state2 : begin
        if(step2) next_state  = state3;
        else next_state       = state0;
      end
      state3 : begin
        if (step3) next_state = state0;
        else next_state       = state3;
      end
      default : next_state    = state0;          //default语句
    endcase
  end

  always @(state) begin                          //该进程定义FSM的输出(组合逻辑)
    case (state)
      state0  : out = 3'b00l;
      statel  : out = 3'b010;
      state2  : out = 3'bl00;
      state3  : out = 3'blll;
      default : out = 3'b00l;                    //default语句,避免锁存器的产生
    endcase
  end

endmodule

 1.4 4位全加器

module adder4 (cout, sum, ina, inb, cin) ;
  output [3:0] sum;
  output cout;
  input [3:0] ina, inb;
  input cin;

  assign {cout, sum} = ina + inb + cin;

endmodule

 1.5 并串转换器

module para2ser (pdin, sdout, en, width_sw, clk, rstn);
  input	[7:0]	pdin;
  output		sdout;
  input		    en;
  input		    width_sw;   //用来区分8bit/6bit输入并行数据
 
  input		    clk;
  input		    rstn; 
 
  reg [6:0]    tmp;		    //共7bit

  reg sdout_data;           //串行输出
 
  always @(posedge clk or negedge rstn) begin
    if ( !rstn )
      {tmp, sdout} <= 0;
    else begin 
	  if ( en )		        //start p2s, 1T pulse
		{tmp, sdout} <= pdin;
	  else	begin
		if ( width_sw )
		  {tmp, sdout} <= {'b0, tmp};
		else
		  {tmp[4:0], sdout} <= {'b0, tmp[4:0]};
	  end
    end   
  end
 
endmodule // p2s

最后

以上就是优雅石头为你收集整理的[Verilog]Verilog经典电路设计(一)Verilog经典电路设计(一)的全部内容,希望文章能够帮你解决[Verilog]Verilog经典电路设计(一)Verilog经典电路设计(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部