verilog实战实例


实战实例 玩转LED 玩转
Verilog程序 程序
always @ (posedge led_clk, negedge Q_KEY) if (!Q_KEY) // 复位后右移 led_r <= 8'h01; else // 根据 ,左右移位,注意 根据dir,左右移位,注意LED实际以为方向与 实际以为方向与led_r移位方向相反 实际以为方向与 移位方向相反 // 因为开发板上 因为开发板上LED[1]在左,LED[8]在右 在左, 在左 在右 if(!dir) led_r <= led_r << 1; // LED右移 右移 else led_r <= led_r >> 1; // LED左移 左移 // 为什么要取反? 因为开发板上的 为什么要取反? 因为开发板上的LED是送 亮,送1灭 是送0亮 是送 灭 assign LED = ~led_r; // 寄存器输出 endmodule
实战实例 按键消抖试验
Verilog程序 程序 //++++++++++++++++++++++++++++++++++++++ wire [4:1] key_changed2; // 当key_samp2由1变为 时 变为0时 由 变为 // key_changed2由0变为 ,只维持一个时钟周期 变为1, 由 变为 assign key_changed2 = key_samp2_locked & (~key_samp2); //--------------------------------------
流水灯
实战实例 按键消抖试验
Verilog程序 程序 module key_led( input CLOCK_50, input Q_KEY, input [4:1] KEY, output reg [4:1] LED ); wire [4:1] key_val; assign key_val = KEY;
?如何消抖
实战实例 按键消抖试验
Verilog程序 程序 //++++++++++++++++++++++++++++++++++++++ // 每次按键稳定后,输出键值 每次按键稳定后, // 按下为 ,松开为 按下为0,松开为1 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) o_key_val <= 4'hF; else o_key_val <= ~key_changed2; //-------------------------------------endmodule
跑马灯
实战实例 玩转LED 玩转
Verilog程序 程序
reg [8:1] led_r; reg dir; // 定义输出寄存器 // 循环方向控制
流水灯
always @ (posedge led_clk, negedge Q_KEY) if (!Q_KEY) // 复位后右移 dir <= 0; else // 到达左右端点否?到达则换向 到达左右端点否? if(led_r == 8'h7F && dir == 0) dir <= 1; else if(led_r == 8'h01 && dir == 1) dir <= 0;
实战实例 玩转LED 玩转
Verilog程序 程序
always @ (posedge led_clk, negedge Q_KEY) if (!Q_KEY) // 复位后右移 led_r <= 8'h01; else // 根据 ,左右移位,注意:LED实际移位方向与 根据dir,左右移位,注意: 实际移位方向与led_r移位方向相反 实际移位方向与 移位方向相反 // 因为开发板上 因为开发板上LED[1]在左,LED[8]在右 在左, 在左 在右 if(!dir) led_r <= (led_r << 1) + 1'b1; // LED右移;加法比移位的运算优先级高 右移; 右移 else led_r <= (led_r >> 1); // LED左移 左移 // 为什么要取反?因为开发板上的 为什么要取反?因为开发板上的LED是送 亮,送1灭 是送0亮 是送 灭 assign LED = ~led_r; // 寄存器输出 endmodule
?如何消抖
实战实例 按键消抖试验
Verilog程序 程序
//++++++++++++++++++++++++++++++++++++++ reg [19:0] cnt; // 一旦有按键按下,cnt立即被清零 一旦有按键按下, 立即被清零 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) cnt <= 20'h0; else if(key_changed1) cnt <= 20'h0; else cnt <= cnt + 1'b1; //--------------------------------------
不消抖效果
// 0亮1灭 亮 灭
// 键值 // KEY按下为 ,松开为 按下为0,松开为1 按下为
实战实例 按键消抖试验
Verilog程序 程序
always @ (posedge CLOCK_50, negedge Q_KEY) if (!Q_KEY) LED <= 4'hF; // 0灭1亮 灭 亮 else case (1'b0) key_val[1] : LED[1] <= ~LED[1]; key_val[2] : LED[2] <= ~LED[2]; key_val[3] : LED[3] <= ~LED[3]; key_val[4] : LED[4] <= ~LED[4]; default : LED <= LED ; // 缺省亮灭情况不变 endcase endmodule
?如何消抖
战实例 按键消抖试验
Verilog程序 程序 //++++++++++++++++++++++++++++++++++++++ reg [4:1] key_samp2, key_samp2_locked; // 只有当按键不变化(不抖动),且维持 只有当按键不变化(不抖动),且维持20ms以上时 ),且维持 以上时 // 才将 才将i_key采集至 采集至key_samp2 采集至 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) key_samp2 <= 4'hF; else if(cnt == 20'hF_FFFF) // 0xFFFFF/50M =20.9715ms key_samp2 <= i_key;
不消抖效果
实战实例 按键消抖试验
消抖原理
?如何消抖
理想波形
人在按键时, 人在按键时, 存在触点抖 动现象
实际波形 按下抖动 释放抖动
实战实例 按键消抖试验
Verilog程序 程序
module key_debounce( input i_clk, input i_rst_n, input [4:1] i_key, // 按下为 ,松开为 按下为0,松开为1 output reg [4:1] o_key_val // 键值 ); //++++++++++++++++++++++++++++++++++++++ reg [4:1] key_samp1, key_samp1_locked; // 将i_key采集至 采集至key_samp1 采集至 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) key_samp1 <= 4'hF; else key_samp1 <= i_key;
跑马灯
实战实例 玩转LED 玩转
Verilog程序 程序
reg [8:1] led_r; reg dir; // 定义输出寄存器 // 循环方向控制;上电缺省值为 循环方向控制;上电缺省值为0
合集下载

verilog实例

verilog实例

verilog实例Verilog是一种硬件描述语言,用于设计和建模数字电路。

下面是一个Verilog实例,用于实现一个简单的4位加法器。

verilog.module adder4bit(。

input [3:0] A,。

input [3:0] B,。

input Cin,。

output [3:0] Sum,。

output Cout.);wire [3:0] S;wire C1, C2, C3;// 4个全加器实例。

full_adderFA0(.A(A[0]), .B(B[0]), .Cin(Cin), .Sum(S[0]), .Cout(C1));full_adderFA1(.A(A[1]), .B(B[1]), .Cin(C1), .Sum(S[1]), .Cout(C2));full_adderFA2(.A(A[2]), .B(B[2]), .Cin(C2), .Sum(S[2]), .Cout(C3));full_adderFA3(.A(A[3]), .B(B[3]), .Cin(C3), .Sum(S[3]), .Cout(Cout)); assign Sum = S;endmodule.module full_adder(。

input A,。

input B,。

input Cin,。

output Sum,。

output Cout.);assign Sum = A ^ B ^ Cin;assign Cout = (A & B) | (Cin & (A ^ B));endmodule.在这个例子中,我们定义了一个4位加法器模块`adder4bit`,它有两个4位输入A和B,一个输入Cin表示进位,以及一个4位输出Sum和一个输出Cout表示进位。

在`adder4bit`模块中,我们实例化了4个全加器模块`full_adder`,并将它们连接起来形成一个级联的加法器。

最后,我们使用`assign`语句将全加器的输出连接到`Sum`和`Cout`输出。

verilog模块例化实例

verilog模块例化实例

verilog模块例化实例以下是一个Verilog模块的实例化示例:假设有一个简单的4位加法器模块(add4), 输入包括两个4位数(a和b),输出为一个5位数(sum)。

现在我们希望实例化这个模块来构建一个8位的加法器。

module add4 (input [3:0] a,input [3:0] b,output [4:0] sum);assign sum = a + b;endmodule现在,我们可以在一个顶层模块中实例化这个add4模块,并将其连接起来。

module top_module (input [7:0] a,input [7:0] b,output [8:0] sum);wire [3:0] a_part;wire [3:0] b_part;wire [4:0] sum_part;// 实例化add4模块,并将连接输入和输出add4 add4_1 (.a(a[3:0]), .b(b[3:0]), .sum(sum_part[3:0]));add4 add4_2 (.a(a[7:4]), .b(b[7:4]), .sum(sum_part[7:4]));// 连接add4模块的输出assign sum = {sum_part[7:4], sum_part[3:0]};endmodule在顶层模块中,我们首先定义了一些中间信号(a_part,b_part和sum_part),它们用于连接不同的add4模块。

然后,我们实例化了两个add4模块(add4_1和add4_2),并将它们的输入和输出连接起来。

最后,我们通过连接sum_part的高4位和低4位,得到了最终的8位和。

Verilog的135个经典设计实例

Verilog的135个经典设计实例

Verilog的135个经典设计实例1、立即数放大器:立即数放大器是一种用于将输入电平放大到更高电平的电路,它可以实现任意输入到输出的映射,并且可以在Verilog中使用。

立即数放大器的Verilog实现如下:module immedamp(in, out);input in;output out;reg [3:0] immed;assign out = immed[3];begincase (in)4'b0000: immed = 4'b1000;4'b0001: immed = 4'b1001;4'b0010: immed = 4'b1010;4'b0011: immed = 4'b1011;4'b0100: immed = 4'b1100;4'b0101: immed = 4'b1101;4'b0110: immed = 4'b1110;4'b0111: immed = 4'b1111;4'b1000: immed = 4'b1000;4'b1001: immed = 4'b1001;4'b1010: immed = 4'b1010;4'b1011: immed = 4'b1011;4'b1100: immed = 4'b1100;4'b1101: immed = 4'b1101;4'b1110: immed = 4'b1110;4'b1111: immed = 4'b1111;endcaseendendmodule2、多路复用器:多路复用器是一种用于将多个输入选择转换为单个输出的电路,它可以实现由多种方式选择的输出,并可以使用Verilog实现。

verilog的15个经典设计实例

verilog的15个经典设计实例
module block(c,b,a,clk); output c,b; input clk,a; reg c,b; always @(posedge clk)
begin b=a; c=b; end endmodule
【例 5.11】模为 60 的 BCD 码加法计数器
module count60(qout,cout,data,load,cin,reset,clk);
【例 5.6】用 fork-join 并行块产生信号波形
`timescale 10ns/1ns module wave2; reg wave; parameter cycle=5; initial
fork wave=0;
#(cycle) wave=1; #(2*cycle) wave=0; #(3*cycle) wave=1; #(4*cycle) wave=0; #(5*cycle) wave=1; #(6*cycle) $finish; join initial $monitor($time,,,"wave=%b",wave); endmodule
else
out<=out+1;
end
endmodule
//同步复位 //计数
【例 3.3】4 位全加器的仿真程序
`timescale 1ns/1ns `include "adder4.v" module adder_tp; reg[3:0] a,b; reg cin; wire[3:0] sum; wire cout; integer i,j;
output[7:0] qout;
output cout;
input[7:0] data;
input load,cin,clk,reset;

verilog实例

verilog实例

一、组合逻辑实验 (2)实验1 3X8 译码器程序 (2)实验 2 二-十进制译码器 (2)实验3 BCD 码—七段数码管显示译码器 (3)实验4 8-3编码器 (4)实验 5 8-3优先编码器 (4)实验6 十—二进制编码器 (5)实验7 三选一数据选择器 (5)实验8 半加器 (6)实验9 全加器 (7)实验10 半减器 (8)实验11 全减器 (8)实验12 多位数值比较器 (9)实验13 奇偶校验 (9)实验14 补码生成 (10)实验15 8位硬件加法器的设计 (10)实验16 4 位并行乘法器 (10)实验17 七人表决器 (10)实验18 格雷码变换 (11)二、时序逻辑实验 (11)实验 1 D 触发器 (11)实验 2 JK 触发器 (12)实验 3 四位移位寄存器 (12)实验 4 异步计数器 (13)实验 5 同步计数器 (14)实验 6 可逆计数器 (15)实验7 步长可变的加减计数器 (16)实验8 含异步清0和同步时钟使能的4位加法计数器 (17)实验9 顺序脉冲发生器 (18)实验10 序列信号发生器 (18)实验11 用状态机实现串行数据检测器 (19)实验12 分频器 (20)实验13 Moore状态机 (21)实验14 Mealy 状态机 (23)实验15 三层电梯 (24)实验16 性线反馈移位寄存器(LFSR)设计 (32)实验17 正负脉宽数控调制信号发生器 (32)三、存储器设计 (34)实验 1 只读存储器(ROM) (34)实验 2 SRAM (34)实验 3 FIFO (35)四、扩展接口实验 (39)实验 1 流水灯 (39)实验 2 VGA彩色信号显示控制器设计 (40)实验 3 PS/2键盘接口实验 (48)实验 4 PS/2鼠标接口实验 (49)五、综合实验 (58)实验 1 函数发生器 (58)实验 2 自动售货机 (61)实验 3 移位相加4位硬件乘法器电路设计 (63)一、组合逻辑实验实验1 3X8 译码器程序//Decoder: 3-to 8 decoder with an enable contmodule decoder(y,en,a) ;output [7:0] y ;input en ;input [2:0] a;reg[7:0] y ;always @ (en or a) // EN 和A 是敏感信号if(!en) // 如果使能信号为低,无效y = 8'b1111_1111 ;elsecase(a)3'b000 : y = 8'b1111_1110 ; // 最低位为低3'b001 : y = 8'b1111_1101 ;3'b010 : y = 8'b1111_1011 ;3'b011 : y = 8'b1111_0111 ;3'b100 : y = 8'b1110_1111 ;3'b101 : y = 8'b1101_1111 ;3'b110 : y = 8'b1011_1111 ;3'b111 : y = 8'b0111_1111 ;default : y = 8'bx ; // 否则为不确定信号endcaseendmodule实验 2 二-十进制译码器//Decoder: binary-to decimal decoder with an enable controlmodule b2d(y,en,a) ;output [7:0] y ;input en ;input [3:0] a;reg[7:0] y ;always @ (en or a) // EN 和A 是敏感信号if(!en) // 如果使能信号为低,无效y = 8'b1111_1111;elsebeginif(a>9)y<=a+6; //这里完成了二进制到十进制的译码,elsey<=a;end//为了方便在平台上进行观察验证///这里把数据的个位和十位分别用4 个LED 进行显示,均为二进制Endmodule实验3 BCD 码—七段数码管显示译码器module decode4_7(decodeout,a);output[6:0] decodeout;input[3:0] a;reg[6:0] decodeout;always @(a)begincase(a) //用case 语句进行译码abcdefg4'h0:decodeout=7'b1111110;4'h1:decodeout=7'b0110000;4'h2:decodeout=7'b1101101;4'h3:decodeout=7'b1111001;4'h4:decodeout=7'b0110011;4'h5:decodeout=7'b1011011;4'h6:decodeout=7'b1011111;4'h7:decodeout=7'b1110000;4'h8:decodeout=7'b1111111;4'h9:decodeout=7'b1111011;4'ha:decodeout=7'b1110111;4'hb:decodeout=7'b0011111;4'hc:decodeout=7'b1001110;4'hd:decodeout=7'b0111101;4'he:decodeout=7'b1001111;4'hf:decodeout=7'b1000111;default: decodeout=7'bx;endcaseendendmodule实验4 8-3编码器//a 8-3 codermodule coder(dout,din);output[2:0] dout;input [7:0] din;reg [2:0] dout;always @(din)case(din)8'b1111_1110 : dout<=3'b000;8'b1111_1101 : dout<=3'b001;8'b1111_1011 : dout<=3'b010;8'b1111_0111 : dout<=3'b011;8'b1110_1111 : dout<=3'b100;8'b1101_1111 : dout<=3'b101;8'b1011_1111 : dout<=3'b110;8'b0111_1111 : dout<=3'b111;default: dout<=3'bx;endcaseendmodule实验 5 8-3优先编码器module encoder(d0,d1,d2,d3,d4,d5,d6,d7,x,y,v); output x,y,v;input d0,d1,d2,d3,d4,d5,d6,d7;reg x,y,v;always @ (d0 or d1 or d2 or d3 or d4 or d5 or d6 or d7) if (d7 == 0){x,y,v} = 3'b111 ;else if (d6 == 0){x,y,v} = 3'b110 ;else if (d5 == 0){x,y,v} = 3'b101 ;else if (d4 == 0){x,y,v} = 3'b100 ;else if (d3 == 0){x,y,v} = 3'b011 ;else if (d2 == 0){x,y,v} = 3'b010 ;else if (d1 == 0){x,y,v} = 3'b001 ;else if (d0 == 0){x,y,v} = 3'b000 ;else{x,y,v} = 3'bxxx ;endmodule实验6 十—二进制编码器// decimal to binary encodermodule encoder(y,a);output [4:0] y;input [4:0] a; // input [4] 为十位,[3:0]为个位?reg [4:0] y;always @ (a) // A 是敏感信号beginif(a>9)y<=a-6; //这里完成了十进制到二进制的编码,elsey<=a;end//为了方便在平台上进行观察验证///这里把数据的个位用4 个2 进制数据表示,十位用1bit 进行显示;endmodule实验7 三选一数据选择器module mux3to1(dout,a,b,c,sel);output[1:0] dout;input [1:0] a,b,c;input[1:0] sel;reg [1:0] dout;// RTL modelingalways @(a or b or c or sel)case(sel)2'b00 : dout<=a;2'b01 : dout<=b;2'b10 : dout<=c;default :dout<=2'bx;endcaseendmodule//数据流方式描述的1 位半加器module halfadder (sum,cout,a,b); input a,b;output sum,cout;assign sum=a^b;assign cout=a&b;// carry out; endmodule附录:各种不同的描述方式:1,调用门元件实现的1 位半加器module half_add1(a,b,sum,cout); input a,b;output sum,cout;and (cout,a,b);xor (sum,a,b);endmodule2,采用行为描述的1 位半加器module half_add3(a,b,sum,cout); input a,b;output sum,cout;reg sum,cout;always @(a or b)begincase ({a,b}) //真值表描述2'b00: begin sum=0; cout=0; end2'b01: begin sum=1; cout=0; end2'b10: begin sum=1; cout=0; end2'b11: begin sum=0; cout=1; end endcaseendendmodule3,采用行为描述的1 位半加器module half_add4(a,b,sum,cout); input a,b;output sum,cout;reg sum,cout;always @(a or b)beginsum= a^b;cout=a&b;endendmodule// 1 bit full adder 1 位全加器module full_add(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign {cout,sum}=a+b+cin;endmodule附录:各种不同的描述方式实现的1位全加器1,调用门元件实现的1 位全加器module full_add1(a,b,cin,sum,cout);input a,b,cin;output sum,cout;wire s1,m1,m2,m3;and (m1,a,b),(m2,b,cin),(m3,a,cin);xor (s1,a,b),(sum,s1,cin);or (cout,m1,m2,m3);endmodule2 数据流描述的1 位全加器module full_add2(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign sum = a ^ b ^ cin;assign cout = (a & b)|(b & cin)|(cin & a);endmodule3 行为描述的1 位全加器module full_add4(a,b,cin,sum,cout);input a,b,cin;output sum,cout;reg sum,cout; //在always 块中被赋值的变量应定义为reg 型reg m1,m2,m3;always @(a or b or cin)beginsum = (a ^ b) ^ cin;m1 = a & b;m2 = b & cin;m3 = a & cin;cout = (m1|m2)|m3;endendmodule4 混合描述的1 位全加器module full_add5(a,b,cin,sum,cout);input a,b,cin;output sum,cout;reg cout,m1,m2,m3; //在always 块中被赋值的变量应定义为reg 型wire s1;xor x1(s1,a,b); //调用门元件always @(a or b or cin) //always 块语句beginm1 = a & b;m2 = b & cin;m3 = a & cin;cout = (m1| m2) | m3;endassign sum = s1 ^ cin; //assign 持续赋值语句endmodule实验10 半减器module half_sub(diff,sub_out,x,y);output diff,sub_out;input x,y;reg diff,sub_out;//行为描述always@(x or y)case ({x,y})2'b00 : begin diff= 0; sub_out = 0;end2'b01 : begin diff= 1; sub_out = 1;end2'b10 : begin diff= 1; sub_out = 0;end2'b11 : begin diff= 0; sub_out = 0;enddefault: begin diff= x; sub_out =x;endendcaseendmodule实验11 全减器module full_sub(diff,sub_out,x,y,sub_in);output diff,sub_out;input x,y,sub_in;reg diff,sub_out;//行为描述always@(x or y or sub_in)case ({x,y,sub_in})3'b000 : begin diff= 0; sub_out = 0;end3'b001 : begin diff= 1; sub_out = 1;end3'b010 : begin diff= 1; sub_out = 1;end3'b011 : begin diff= 0; sub_out = 1;end3'b100 : begin diff= 1; sub_out = 0;end3'b101 : begin diff= 0; sub_out = 0;end3'b110 : begin diff= 0; sub_out = 0;end3'b111 : begin diff= 1; sub_out = 1;enddefault: begin diff= x; sub_out =x;endendcaseendmodule实验12 多位数值比较器module comp(ABB,AEB,ASB,A,B,I1,I2,I3);output ABB,AEB,ASB; // ABB 表示A>B AEB 表示A=B, ASB 表示A<B;input [1:0] A,B;input I1,I2,I3; // I1表示上一级的A>B I2 表示上一级的A=B, I3 表示上一级的A<B; reg ABB,AEB,ASB;//行为描述always@(A or B or I1 or I2 or I3)if(A>B){ABB,AEB,ASB}=3'b100;else if(A<B){ABB,AEB,ASB}=3'b001;else // A=B,但是考虑到前一级的情况begin if(I1) //I1 表示上一级的A>B{ABB,AEB,ASB}=3'b100;else if(I3){ABB,AEB,ASB}=3'b001;//I3 表示上一级的A<B;else{ABB,AEB,ASB}=3'b010;endendmodule实验13 奇偶校验//奇偶校验位产生器module parity(even_bit,odd_bit,input_bus);output even_bit,odd_bit;input[7:0] input_bus;assign odd_bit = ^ input_bus; //产生奇校验位assign even_bit = ~odd_bit; //产生偶校验位endmodule实验14 补码生成module compo(d_out,d_in);output [7:0] d_out;input [7:0]d_in;reg [7:0] d_out;always @(d_in)if (d_in[7]==1'b0) // 正数,最高位为符号位,0说明是正数,正数补码是其本身d_out=d_in;else // 负数d_out={d_in[7],~d_in[6:0]+1'b1}; //最高位符号位不变,数据位加一构成其补码endmodule实验15 8位硬件加法器的设计//8 位硬件加法器module add8b(cout,sum,a,b,cin);output[7:0] sum;output cout;input[7:0] a,b;input cin;assign {cout,sum}=a+b+cin;endmodule实验16 4 位并行乘法器//4 位并行乘法器module mult(outcome,a,b);parameter size=4;input[size:1] a,b; //两个操作数output[2*size:1] outcome; //结果assign outcome=a*b; //乘法运算符endmodule实验17 七人表决器// for 语句描述的七人投票表决器module voter7(pass,vote);output pass; // 通过为高电平,否则为低电平input[6:0] vote; // 7个投票输入#通过为高,否定为低reg[2:0] sum;integer i;reg pass;always @(vote)beginsum=0;for(i=0;i<=6;i=i+1) //for 语句if(vote[i]) sum=sum+1;if(sum[2]) pass=1; //若超过4 人赞成,则pass=1else pass=0;endendmodule实验18 格雷码变换module BIN2GARY (EN ,DATA_IN ,DA TA_OUT );input EN ;input [3:0] DATA_IN ;output [3:0] DATA_OUT ;assign DATA_OUT [0] = (DA TA_IN [0] ^ DA TA_IN [1] ) && EN ; assign DATA_OUT [1] = (DA TA_IN [1] ^ DATA_IN [2] ) && EN ; assign DATA_OUT [2] = (DA TA_IN [2] ^ DATA_IN [3] ) && EN ; assign DATA_OUT [3] = DATA_IN [3] && EN ;endmodule二、时序逻辑实验实验 1 D 触发器module myDFF(q,qn,d,clk,set,reset);input d,clk,set,reset;output q,qn;reg q,qn;always @(posedge clk)beginif (reset) beginq <= 0; qn <= 1; //同步清0,高电平有效endelse if (set) beginq <=1; qn <=0; //同步置1,高电平有效else beginq <= d; qn <= ~d;endendendmodule实验 2 JK 触发器//带异步清0、异步置1 的JK 触发器module JK_FF(CLK,J,K,Q,RS,SET);input CLK,J,K,SET,RS;output Q;reg Q;always @(posedge CLK or negedge RS or negedge SET) beginif(!RS) Q <= 1'b0;else if(!SET) Q <= 1'b1;else case({J,K})2'b00 : Q <= Q;2'b01 : Q <= 1'b0;2'b10 : Q <= 1'b1;2'b11 : Q <= ~Q;default: Q<= 1'bx;endcaseendendmodule实验 3 四位移位寄存器//4 位移位寄存器module shifter(din,clk,clr,dout);input din,clk,clr;output[3:0] dout;reg[3:0] dout;always @(posedge clk)beginif (clr) dout<= 4'b0; //同步清0,高电平有效elsebegindout <= dout << 1; //输出信号左移一位dout[0] <= din; //输入信号补充到输出信号的最低位endendmodule// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验 4 异步计数器//行为描述方式实现的4 位异步计数器module counter(clk,clr,q0,q1,q2,q3);input clk,clr;output q0,q1,q2,q3;reg q0,q1,q2,q3;//reg q0_t,q1_t,q2_t,q3_t;reg q0_r,q1_r,q2_r,q3_r;always @(posedge clk or negedge clr)if(!clr) q0_r<=0;elseq0_r<=!q0_r;always @(posedge q0_r or negedge clr)if(!clr) q1_r<=0;elseq1_r<=!q1_r;always @(posedge q1_r or negedge clr)if(!clr) q2_r<=0;elseq2_r<=!q2_r;always @(posedge q2_r or negedge clr)if(!clr) q3_r<=0;elseq3_r<=!q3_r;assign {q0,q1,q2,q3}={q0_r,q1_r,q2_r,q3_r};endmodule// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验 5 同步计数器Verilog HDL 程序//带异步清0的同步计数器module counter(Q,CR,CLK);input CLK,CR;output[3:0] Q;reg [3:0]Q;always @(posedge CLK or negedge CR)beginif(!CR) Q <= 4'b0000;elsebeginif (Q==15)Q<=0;else Q<=Q+1;endendendmodule// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验 6 可逆计数器//同步清零的可逆计数器module counter(Q,CLK,CR,UD);input CLK,CR,UD;output[3:0] Q;reg [3:0]cnt;initialbegincnt<=4'b0000;endassign Q = cnt;always @(posedge CLK )beginif(!CR) cnt <= 4'b0000; //同步清0,低电平有效else beginif (UD) cnt = cnt + 1; //加法计数else cnt = cnt - 1; //减法计数endendendmodule// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验7 步长可变的加减计数器//同步清零的步长可变加减计数器module counter(Q,CLK,CR,UD,STEP);input CLK,CR,UD;input [1:0] STEP;output[3:0] Q;reg [3:0]cnt;initialbegincnt<=4'b0000;endassign Q = cnt;always @(posedge CLK)beginif(!CR) cnt <= 4'b0000; //同步清0,低电平有效else beginif (UD) cnt = cnt + STEP; //加法计数else cnt = cnt - STEP; //减法计数endendendmodule// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验8 含异步清0和同步时钟使能的4位加法计数器//实验八含异步清0 和同步时钟使能的4 位加法计数器module counter(clk,clear,en,qd);input clk,clear,en;output[3:0] qd;reg[3:0] cnt;always @(posedge clk or negedge clear)beginif (!clear) cnt <= 4'h0; //异步清0,低电平有效else if (en) //同步使能cnt<= cnt + 1; //加法计数endassign qd = cnt;endmodule// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验9 顺序脉冲发生器module pulsegen(q0,q1,q2,clk,rd);input clk, rd;output q0,q1,q2;reg q0,q1,q2;reg [2:0] x,y;always @(posedge clk)if(rd)beginy<=0;x<=3'b001; // give a initial valueendelsebeginy<=x;x<={x[1:0],x[2]};endassign {q0,q1,q2}=y;endmodule// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验10 序列信号发生器module sequencer(y,clk,clr);input clk,clr;reg [7:0] yt;parameter s0=8'b1000_0000, // state 0s1=8'b1100_0001, // state 1s2=8'b1110_0000, // state 2s3=8'b0001_0000,s4=8'b1111_1000,s5=8'b0000_0011,s6=8'b1111_0011,s7=8'b0000_0001; //state 7always @(posedge clk)beginif(clr)yt<=s0; // clear to state 0elsebegincase(yt)s0: yt<=s1; //change from state 0 to state 1s1 : yt<=s2; //s2 : yt<=s3; // state 2-->3s3 : yt<=s4;s4 : yt<=s5;s5 : yt<=s6;s6 : yt<=s7;s7 : yt<=s0; //state 7 to state 0default: yt<=s0; //default state 7 to s0endcaseendendassign y=yt;endmodule实验11 用状态机实现串行数据检测器module detector(got,instr,clk);output got;input instr,clk;reg [2:0] cstate,nextstate;reg got;parameter s0=0,s1=1,s2=2,s3=3,s4=4,s5=5,s6=6,s7=7; // 8 statesalways @(posedge clk) // 定义起始状态begincstate<=nextstate;endalways @(cstate or instr) // 定义状态转换begincase(cstate)s0 : begin got<=0;if(instr) nextstate<=s1; //detected the 1st bit of 1110010,i.e.,1,to s1else nextstate<=s0; // if not ,stay hereends1 : begin got<=0;if(instr) nextstate<=s2; //detected the 2nd bit of 1110010,i.e.,1,to s2else nextstate<=s0; // notends2 : begin got<=0;if(instr) nextstate<=s3; //detected the 3rd bit of 1110010,i.e.,1else nextstate<=s0; // notends3 : begin got<=0;if(!instr) nextstate<=s4; //detected the 4th bit of 1110010,i.e.,0else nextstate<=s2; // not ,stayends4 : begin got<=0;if(!instr) nextstate<=s5; //detected the 5th bit of 1110010,i.e.,0else nextstate<=s1; // notends5 : begin got<=0;f(instr) nextstate<=s6; //detected the 6th bit of 1110010,i.e.,1else nextstate<=s0; // notends6 : begin got<=0;if(!instr) nextstate<=s7; //detected the 7th bit of 1110010,i.e.,0else nextstate<=s2; // notends7 : begin got<=1; // got the sequenceif(instr) nextstate<=s1; //detected the 1st bit of 1110010,i.e.,1,chagne to s1 else nextstate<=s0; // not ,change to s0endendcaseendendmodule实验12 分频器// 分频器部分,获得便于试验观察的时钟信号,在实验台上进行观察module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule// 分频器部分用于设计仿真,10 分频module clk_diver(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[4:0] counter; //parameter cnt=10; /// 10分频always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验13 Moore状态机module moore(dataout,clk,datain,reset);output[3:0] dataout;input [1:0] datain;input clk,reset;parameter s0=2'b00, //采用格雷码编码s1=2'b01,s2=2'b11,s3=2'b10;reg [1:0]cstate,nstate;reg [3:0] dataout;always @(posedge clk or posedge reset)//时序逻辑进程if(reset) //异步复位cstate<=s0;else //--当检测到时钟上升沿时执行CASE 语句begincstate<=nstate;endalways @(cstate or datain)begincase(cstate)s0:begin if(datain==0) nstate<=s1;else nstate<=s0;ends1:begin if(datain==1) nstate<=s2;else nstate<=s1;ends2:begin if(datain==2) nstate<=s3;else nstate<=s2; ends3:begin if(datain==3) nstate<=s0;else nstate<=s3; end//由信号state 将当前状态值带出此进程,进入组合逻辑进程endcaseendalways @(cstate) //组合逻辑进程begincase(cstate)// -- 确定当前状态值s0:dataout<=4'b0001; //对应状态s0的数据输出为"0001"s1:dataout<=4'b0010;s2:dataout<=4'b0100;s3:dataout<=4'b1000;endcaseendendmodule// 分频器部分,获得便于试验观察的时钟信号module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=50_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule实验14 Mealy 状态机module mealy(dataout,clk,datain,reset);output[3:0] dataout;input [1:0] datain;input clk,reset;parameter s0=2'b00, //采用格雷码编码s1=2'b01,s2=2'b11,s3=2'b10;reg [1:0]cstate,nstate;reg [3:0] dataout;always @(posedge clk or posedge reset)//时序逻辑进程if(reset) //异步复位cstate<=s0;else //--当检测到时钟上升沿时执行CASE 语句begincstate<=nstate;endalways @(cstate or datain)begincase(cstate)s0:begin if(datain==0) nstate<=s1;else nstate<=s0;ends1:begin if(datain==1) nstate<=s2;else nstate<=s1;ends2:begin if(datain==2) nstate<=s3;else nstate<=s2; ends3:begin if(datain==3) nstate<=s0;else nstate<=s3; end//由信号state 将当前状态值带出此进程,进入组合逻辑进程endcaseendalways @(cstate or datain) //组合逻辑进程begincase(cstate)// -- 确定当前状态值s0:begin if (datain==0)dataout<=4'b0001;else dataout<=4'b0000;end//对应状态s0,输入datain 为0 时,数据输出为"0001",即输出由当前状态和输入同时控制;s1:begin if (datain==1)dataout<=4'b0010;else dataout<=4'b0101;ends2:begin if (datain==2)dataout<=4'b0100;else dataout<=4'b0011;ends3:begin if (datain==3)dataout<=4'b1000; else dataout<=4'b0110;endendcaseendendmodule实验15 三层电梯module lift_3 (buttonclk, liftclk, reset, f1upbutton, f2upbutton, f2dnbutton, f3dnbutton,stop1button, stop2button, stop3button,position, doorlight,udsig,fdnlight,fuplight);input buttonclk; //input liftclk; //电梯运行时钟input reset; // resetinput f1upbutton; //from 1st floor to upstairsinput f2upbutton; //from 2nd floor to upstairsinput f2dnbutton; //from 2nd floor to downstairsinput f3dnbutton; //from 3rd floor to downstairsinput stop1button; // signal to stop the lift on floor 1input stop2button; // stop on floor 2input stop3button; // stop on floor 3output [2:1] fuplight;reg[2:1] fuplight; //regoutput [3:2] fdnlight;reg[3:2] fdnlight;reg[3:1] stoplight;reg[1:0] position;output doorlight; // close or open 开关指示灯reg doorlight;output udsig; // up or down signalreg udsig;parameter[3:0] stopon1 = 0; /// state machineparameter[3:0] dooropen = 1;parameter[3:0] doorclose = 2;parameter[3:0] doorwait1 = 3;parameter[3:0] doorwait2 = 4;parameter[3:0] doorwait3 = 5;parameter[3:0] doorwait4 = 6;parameter[3:0] up = 7;parameter[3:0] down = 8;parameter[3:0] stop = 9;reg[3:0] mylift; //reg clearup;reg cleardn;reg[1:0] pos;always @(posedge reset or posedge liftclk)beginif (reset == 1'b1) ///asyn resetbeginmylift = stopon1 ; // defalut positon :floor 1clearup = 1'b0 ; // clear upcleardn = 1'b0 ; //clear downendelsebegincase (mylift) // FSMstopon1 : /// stop on floor 1begindoorlight = 1'b1 ;position = 1 ; //the lift positon flagpos = 1; //mylift = doorwait1 ;enddoorwait1 :beginmylift = doorwait2 ; // 2nd secondsenddoorwait2 :beginclearup = 1'b0 ; //cleardn = 1'b0 ;mylift = doorwait3 ; // 3rd sec.senddoorwait3 :beginmylift = doorwait4 ; //4th secondenddoorwait4 :beginmylift = doorclose ; //enddoorclose : // after 4 seconds ,close the doorbegindoorlight = 1'b0 ;if (udsig == 1'b0) // going upbeginif (position == 3) // on floor 3beginif (stoplight == 3'b000 & fuplight == 2'b00 & fdnlight == 2'b00) //no requestsbeginudsig = 1'b1 ; ///mylift = doorclose ;endelsebeginudsig = 1'b1 ;mylift = down ; // if not ,must be going downendendelse if (position == 2) // on floor 2beginif (stoplight == 3'b000 & fuplight == 2'b00 & fdnlight == 2'b00) //no requestsbeginudsig = 1'b0 ; //still going upmylift = doorclose ; //closingendelse if ((stoplight[3]) == 1'b1 | ((stoplight[3])== 1'b0 & (fdnlight[3]) == 1'b1))begin //inside req to stop onf.3 ,or req. to go down from f.3udsig = 1'b0 ; //still going upmylift = up ;endelsebegin // must be going down whatever happensudsig = 1'b1 ;mylift = down ;endendelse if (position == 1) // on floor 1beginif (stoplight == 3'b000 & fuplight == 2'b00 & fdnlight == 2'b00) //no req.beginudsig = 1'b0 ;mylift = doorclose ; // waiting for the going up reqendelsebeginudsig = 1'b0 ; // must be going upmylift = up ;endendendelse if (udsig == 1'b1) // if going downbeginif (position == 1) //beginif (stoplight == 3'b000 & fuplight == 2'b00 & fdnlight == 2'b00)beginudsig = 1'b0 ; // no reqmylift = doorclose ;//waiting for the req to go upendelsebeginudsig = 1'b0 ; // going up at any casemylift = up ;endendelse if (position == 2)beginif (stoplight == 3'b000 & fuplight == 2'b00 & fdnlight == 2'b00)beginudsig = 1'b1 ;mylift = doorclose ;endelse if ((stoplight[1]) == 1'b1 | ((stoplight[1]) == 1'b0 & (fuplight[1]) == 1'b1))beginudsig = 1'b1 ; //downmylift = down ;endelsebeginudsig = 1'b0 ; //mylift = up ;endendelse if (position == 3)///beginif (stoplight == 3'b000 & fuplight == 2'b00 & fdnlight == 2'b00)beginudsig = 1'b1 ;mylift = doorclose ;endelsebeginudsig = 1'b1 ;mylift = down ;endendendendup : ///going up stairsbeginposition = position + 1 ; // under the lift clockpos = pos + 1; //if (pos < 3 & ((stoplight[pos]) == 1'b1 | (fuplight[pos]) == 1'b1))begin//destination isn't the top,to stop there or going up from theremylift = stop ; // stop the liftendelse if (pos == 3 & ((stoplight[pos]) == 1'b1 | (fdnlight[pos]) == 1'b1))begin// has been on f.3, and stop here request or go dowm reqmylift = stop ; //next state : stopendelsebeginmylift = doorclose ; //endenddown : // go downbeginposition = position - 1 ;pos = pos - 1;if (pos > 1 & ((stoplight[pos]) == 1'b1 | (fdnlight[pos]) == 1'b1))beginmylift = stop ; // stop hereendelse if (pos == 1 & ((stoplight[pos]) == 1'b1 | (fuplight[pos]) == 1'b1))beginmylift = stop ;endelsebeginmylift = doorclose ; // no req to stop or go up,closedendendstop : //beginmylift = dooropen ; //next state to openenddooropen :begindoorlight = 1'b1 ;if (udsig == 1'b0) //going upbeginif (position <= 2 & ((stoplight[position]) == 1'b1 | (fuplight[position]) == 1'b1))beginclearup = 1'b1 ;endelsebeginclearup = 1'b1 ;cleardn = 1'b1 ;endendelse if (udsig == 1'b1)beginif (position >= 2 & ((stoplight[position]) == 1'b1 | (fdnlight[position]) == 1'b1))begincleardn = 1'b1 ;endelsebeginclearup = 1'b1;cleardn = 1'b1 ;endendmylift = doorwait1 ;endendcaseendendalways @(posedge reset or posedge buttonclk) // 控制按键信号灯。

iverilog例子

iverilog例子

以下是一个简单的Verilog代码示例,用于实现一个2位二进制计数器:module counter (
input clk,
input reset,
output reg [1:0] count
);
always @(posedge clk or posedge reset) begin
if (reset) begin
count <= 2'b00;
end else begin
count <= count + 2'b01;
end
end
endmodule
这个模块包含一个名为counter的实例,它具有三个端口:clk、reset和count。

clk是时钟信号,reset是复位信号,count是2位二进制输出信号。

在模块内部,使用一个always块来定义一个始终执行的逻辑。

该块使用时钟信号clk和复位信号reset作为触发条件。

在每个时钟上升沿或复位信号上升沿时,执行该块中的逻辑。

在复位条件下,将计数器count的值清零。

在时钟上升沿时,将计数器count的值加1。

这样,每当时钟信号clk的上升沿到来时,计数器就会递增。

注意,由于Verilog是一种硬件描述语言,因此需要使用仿真工具来测试和验证代码的正确性。

在实际应用中,还需要根据具体的需求和硬件平台进行修改和优化。

Verilog逻辑设计实例系列三

end end endmodule
!!!如果模型中的过程赋值语句顺序被颠倒, !!!如果模型中的过程赋值语句顺序被颠倒, 如果模型中的过程赋值语句顺序被颠倒 ( D=E; C=D; B=C; A=B; )那么会引起什么样 的后果?一组语句是按次序从上至下执行的, 的后果?一组语句是按次序从上至下执行的,由 第一条过程语句所完成的赋值的作用是瞬时的 瞬时的, 第一条过程语句所完成的赋值的作用是瞬时的, 所以D发生了变化 发生了变化, 所以 发生了变化,并将已更新的值用在第二条 语句中,以此类推。语句在同一仿真步骤中是按 语句中,以此类推。 照次序执行的,这四条语句等同于将E赋给 赋给A这一 照次序执行的,这四条语句等同于将E赋给A这一 条语句。 条语句。综合工具能够识别这种 表达式替代形式, 表达式替代形式,所综 A 合的电路是由一个触发 器组成的,如下所示: 器组成的,如下所示:
所示的门级电路是由comppare_2_algo综合而成的, 综合而成的, 图3.1所示的门级电路是由 所示的门级电路是由 综合而成的 其目的是通用门来实现该描述。 其目的是通用门来实现该描述。
图3.1 从comppare_2_algo得到的综合结果 得到的综合结果
通过列真值表的方法设计的二位比较器原理图
enable X_in1 X_in2 y_out X_in3 X_in4 X_in5
注意:连续赋值语句是一个等效的门级原 注意:连续赋值语句是一个等效的门级原 等效的 理或基本门的网表所描述的固有的、 所描述的固有的 理或基本门的网表所描述的固有的、抽象 紧凑的表示形式 表示形式。 的、紧凑的表示形式。
Hale Waihona Puke 举例了解综合的概念无论如何A或 中的任一位发生变化 中的任一位发生变化, 例3.1 无论如何 或B中的任一位发生变化,compare_2_algo中的周期 中的周期 性行为就会被激活。算法首先将所有寄存器变量初始化为0,以防止 性行为就会被激活。算法首先将所有寄存器变量初始化为 , 不需要的锁存器结果的影响。然后算法遍历决策树来确定3个输出中 不需要的锁存器结果的影响。然后算法遍历决策树来确定 个输出中 的哪个是有效的,无效的输出将保持程序开始时所付给的值。 的哪个是有效的,无效的输出将保持程序开始时所付给的值。 module compare_2_algo(A_gt_B,A_lt_B,A_eq_B, A,B); output A_gt_B, A_lt_B, A_eq_B; input [1:0] A1,A0,B1,B0; reg A_gt_B, A_lt_B, A_eq_B; ; always @ (A or B) //电平敏感行为 电平敏感行为 begin A_lt_B = 0; A_gt_B = 0; ; A_eq_B = 0; if(A == B) A_lt_B = 1; //注意:圆括号是必需的 注意: 注意 else if (A>B) A_gt_B = 1; ; else A_eq_B = 1; end endmodule

verilog参数例化实例

verilog参数例化实例Verilog参数例化实例引言:Verilog是一种硬件描述语言,广泛应用于数字电路的设计和验证。

在Verilog中,参数是一种用来定义设计中的常量的方式,可以方便地调整设计中的各种参数。

本文将以Verilog参数例化实例为主题,介绍如何使用参数实例化模块,并讨论参数的作用和优势。

一、Verilog参数的定义和用法在Verilog中,参数可以在模块定义中使用,用来定义模块中的常量。

参数的定义可以在模块的端口声明部分或模块体内进行,可以是整数、浮点数、字符串等各种类型。

参数的值在编译时确定,并且在整个设计中保持不变。

例如,我们可以定义一个参数N,用来指定模块中的某个常量的值:```verilogmodule my_module #(parameter N = 8) (input [N-1:0] data, output reg [N-1:0] result);// 模块定义体endmodule```在上述例子中,参数N的默认值为8,可以在实例化模块时进行修改。

模块中的data和result分别是输入和输出端口,宽度为N位。

二、Verilog参数例化实例的基本用法参数例化实例是指在实例化模块时,可以使用参数来指定模块中的常量值。

通过使用参数例化实例,我们可以在不修改模块定义的情况下,改变模块中的常量值,从而灵活地适应不同的设计需求。

下面以一个简单的加法器为例,演示参数例化实例的基本用法:```verilogmodule adder #(parameter N = 8) (input [N-1:0] a, input [N-1:0] b, output [N-1:0] sum);always @(*) beginsum = a + b;endendmodulemodule top;reg [N-1:0] a, b;wire [N-1:0] sum;parameter N = 8;adder #(N) my_adder(a, b, sum);endmodule```在上述例子中,我们定义了一个参数N,用来指定加法器的位宽。

《Verilog设计实例》PPT课件


精选PPT
6
task sort2; inout [t:0] x, y; reg [t:0] tmp; if( x > y ) begin tmp = x; x = y; y = tmp; end endtask endmodule
精选PPT
7
[例4]. 比较器的设计实例(利用赋 值语句设计组合逻辑) module compare(equal,a,b); parameter size=1; output equal; input [size-1:0] a, b; assign equal =(a==b)? 1 : 0; endmodule
assign outvec= h? 4'b0111 : g? 4'b0110 : f? 4'b0101:
e? 4'b0100 : d? 4'b0011 :c? 4'b0010 : b? 4'b0001:
a? 4'b0000 : 4'b1000; assign none_on = outvec[3];
精选PPT
18
[例9]. 输出驱动器设计实例 三态输出驱动器设计方案之一: module trist1( out, in, enable); output out; input in, enable; assign out = enable? in: 'bz; endmodule
精选PPT
19
三态输出驱动器设计方案之二: module trist2( out, in, enable ); output out; input in, enable;
begin
if(clk)
q=data;

Verilog实例

8
多路器(3)
module mux(out ,a,b,sel); output out; input a,b,sel; reg out; always @(a or b or sel) begin if(sel) out=a; else out=b; end endmodule
9
异步复位D触发器?
30
作业
用基本的逻辑单元,如D触发器、比较器、选择器和逻辑门 等器件设计一个双口RAM(一读一写),RAM的深度位16, RAM RAM 16 宽度为8;RAM的模型如下 1)画出电路结构图 2)用Verilog HDL写出电路
31
module trist(out,in,enable); output out; input in,enable; bufif1 mybuf1(out,in,enable); endmodule
27
例9:移位寄存器设计实例
module shifter(din,clk,clr,dout); input din,clk,clr; output[7:0] dout; reg[7:0] dout; alwayls @(posedge clk or posedge clr) begin if(clr) dout<=8’b0; else dout<={dout[6:0],din}; end endmodule
29
例11:双口RAM(一读一写)
Module ram16X8( w_clk,wr_en,wr_addr,data_in, r_clk,rd_en,rd_addr,data_out ); input w_clk,wr_en,r_clk,rd_en; input [7:0] data_in; input [3:0] wr_addr,rd_addr; output [7:0] data_out; reg [7:0] data_out; reg [7:0] mem [15:0]; always @(posedge wr_clk) if(wr_en) mem[wr_addr] <= data_in; always @(posedge rd_clk) if(rd_en) data_out <= mem[rd_addr]; endmodule
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档