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

查看原文