Verilog经典电路设计(一)
1.1 8位移位寄存器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16module 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位串并转换
1
2
3
4
5
6
7
8
9
10module 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),二进制编码,格雷码以及其他编码。通常,综合工具将确定状态分配的编码,但用户也可以通过更改综合属性来强制特定编码,如下所示。状态分配编码将对状态寄存器中使用的位数产生影响;独热编码使用最多的位数,但解码非常快,二进制编码使用最少的位数,但解码较长。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46module 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位全加器
1
2
3
4
5
6
7
8
9module 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 并串转换器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29module 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经典电路设计(一)内容请搜索靠谱客的其他文章。
发表评论 取消回复