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