您好,欢迎来到划驼旅游。
搜索
您的当前位置:首页Verilog及FPGA学习考试必备经典程序(四)

Verilog及FPGA学习考试必备经典程序(四)

来源:划驼旅游
目录

1. 基本门电路的几种描述方法 ............................................................................. 2 2. 用bufif1 关键字描述的三态门 ......................................................................... 3 3. 用assign 语句描述的三态门 ........................................................................... 3 4. 三态双向驱动器 .............................................................................................. 3 5. 三态双向驱动器 .............................................................................................. 3 6. 3-8 译码器 .................................................................................................... 4 7. 8-3 优先编码器 .............................................................................................. 4 8. 用函数定义的8-3 优先编码器 ......................................................................... 5 9. 七段数码管译码器 .......................................................................................... 6 10. 奇偶校验位产生器 .......................................................................................... 7 11. 用if-else 语句描述的 4 选 1 MUX .................................................................. 7 12. 用case 语句描述的 4 选 1 MUX .................................................................... 7 13. 用组合电路实现的 ROM .................................................................................. 8 14. 基本D 触发器 ............................................................................................... 9 15. 带异步清0、异步置 1 的D 触发器 ................................................................ 9 16. 带同步清0、同步置 1 的D 触发器 .............................................................. 10 17. 带异步清0、异步置 1 的JK 触发器 ............................................................. 11 18. 电平敏感的 1 位数据锁存器 ......................................................................... 11 19. 带置位和复位端的 1 位数据锁存器 ............................................................... 12 20. 8 位数据锁存器 ........................................................................................... 12 21. 8 位数据寄存器 ........................................................................................... 12 22. 8 位移位寄存器 ........................................................................................... 13 23. 可变模加法/减法计数器 ................................................................................ 13 24. 4 位 Johnson 计数器(异步复位) ............................................................... 14 25. 256 ×8 RAM 模块 ........................................................................................ 14 26. 256 ×16 RAM 块 .......................................................................................... 15 27. 4 位串并转换器 ........................................................................................... 15 28. 用函数实现简单的处理器 .............................................................................. 16 29. 微处理器的测试代码 ..................................................................................... 17 30. 乘累加器(MAC )代码 ................................................................................ 18 31. 乘累加器的测试代码 ..................................................................................... 19

1

1. 基本门电路的几种描述方法

(1)门级结构描述 module gate1(F,A,B,C,D); input A,B,C,D; output F;

nand(F1,A,B); //调用门元件 and(F2,B,C,D); or(F,F1,F2); endmodule

(2 )数据流描述 module gate2(F,A,B,C,D); input A,B,C,D; output F;

assign F=(A&B)|(B&C&D); endmodule (3)行为描述

module gate3(F,A,B,C,D); input A,B,C,D; output F;

reg F;

always @(A or B or C or D) begin

F=(A&B)|(B&C&D); end endmodule

//assign持续赋值 //过程赋值 2

2. 用bufif1 关键字描述的三态门

module tri_1(in,en,out); input in,en; output out; tri out;

bufif1 b1(out,in,en); //注意三态门端口的排列顺序 endmodule

3. 用assign 语句描述的三态门

module tri_2(out,in,en); output out; input in,en;

assign out = en ? in : 'bz;

//若en=1,则out=in;若en=0,则out为高阻态 endmodule

4. 三态双向驱动器

module bidir(tri_inout,out,in,en,b); inout tri_inout; output out; input in,en,b;

assign tri_inout = en ? in : 'bz; assign out = tri_inout ^ b; endmodule

5. 三态双向驱动器

module bidir2(bidir,en,clk); inout[7:0] bidir; input en,clk; reg[7:0] temp;

assign bidir= en ? temp : 8'bz;

3

always @(posedge clk) begin

if(en) temp=bidir; else temp=temp+1; end endmodule

6. 3-8 译码器

module decoder_38(out,in); output[7:0] out; input[2:0] in; reg[7:0] out; always @(in) begin case(in)

3'd0: out=8'b11111110; 3'd1: out=8'b11111101; 3'd2: out=8'b11111011; 3'd3: out=8'b11110111; 3'd4: out=8'b11101111; 3'd5: out=8'b11011111; 3'd6: out=8'b10111111; 3'd7: out=8'b01111111; endcase end endmodule

7. 8-3 优先编码器

module encoder8_3(none_on,outcode,a,b,c,d,e,f,g,h); output none_on; output[2:0] outcode;

4

input a,b,c,d,e,f,g,h; reg[3:0] outtemp;

assign {none_on,outcode}=outtemp; always @(a or b or c or d or e or f or g or h) begin

if(h) outtemp=4'b0111; else if(g) outtemp=4'b0110; else if(f) outtemp=4'b0101; else if(e) outtemp=4'b0100; else if(d) outtemp=4'b0011; else if(c) outtemp=4'b0010;

else if(b) outtemp=4'b0001; else if(a) outtemp=4'b0000; else outtemp=4'b1000; end endmodule

8. 用函数定义的8-3 优先编码器

module code_83(din, dout); input[7:0] din; output[2:0] dout;

function[2:0] code; //函数定义

input[7:0] din; //函数只有输入端口,输出为函数名本身 if (din[7]) code = 3'd7; else if (din[6]) code = 3'd6; else if (din[5]) code = 3'd5; else if (din[4]) code = 3'd4; else if (din[3]) code = 3'd3;

5

else if (din[2]) code = 3'd2; else if (din[1]) code = 3'd1; else code = 3'd0; endfunction

assign dout = code(din); //函数调用 endmodule

9. 七段数码管译码器

module decode47(a,b,c,d,e,f,g,D3,D2,D1,D0); output a,b,c,d,e,f,g;

input D3,D2,D1,D0; //输入的 4位 BCD码 reg a,b,c,d,e,f,g;

always @(D3 or D2 or D1 or D0) begin

case({D3,D2,D1,D0}) //用case语句进行译码 4'd0: {a,b,c,d,e,f,g}=7'b1111110; 4'd1: {a,b,c,d,e,f,g}=7'b0110000; 4'd2: {a,b,c,d,e,f,g}=7'b1101101; 4'd3: {a,b,c,d,e,f,g}=7'b1111001; 4'd4: {a,b,c,d,e,f,g}=7'b0110011; 4'd5: {a,b,c,d,e,f,g}=7'b1011011;

4'd6: {a,b,c,d,e,f,g}=7'b1011111; 4'd7: {a,b,c,d,e,f,g}=7'b1110000; 4'd8: {a,b,c,d,e,f,g}=7'b1111111; 4'd9: {a,b,c,d,e,f,g}=7'b1111011; default: {a,b,c,d,e,f,g}=7'bx; endcase

6

end endmodule

10. 奇偶校验位产生器

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

11. 用if-else 语句描述的 4 选 1 MUX

module mux_if(out,in0,in1,in2,in3,sel); output out;

input in0,in1,in2,in3; input[1:0] sel; reg out;

always @(in0 or in1 or in2 or in3 or sel) begin

if(sel==2'b00) out=in0; else if(sel==2'b01) out=in1; else if(sel==2'b10) out=in2; else out=in3; end endmodule

12. 用case 语句描述的 4 选 1 MUX

module mux_case(out,in0,in1,in2,in3,sel); output out;

input in0,in1,in2,in3; input[1:0] sel;

7

reg out;

always @(in0 or in1 or in2 or in3 or sel) begin

case(sel)

2'b00: out=in0; 2'b01: out=in1; 2'b10: out=in2; default: out=in3; endcase end endmodule

13. 用组合电路实现的 module rom(addr,data); input[3:0] addr; output[7:0] data; function[7:0] romout; input[3:0] addr; case(addr) 0 : romout = 0; 1 : romout = 1; 2 : romout = 4; 3 : romout = 9; 4 : romout = 16; 5 : romout = 25; 6 : romout = 36; 7 : romout = 49; 8 : romout = ; 9 : romout = 81;

8

ROM 10 : romout = 100; 11 : romout = 121; 12 : romout = 144; 13 : romout = 169; 14 : romout = 196; 15 : romout = 225; default : romout = 8'hxx; endcase endfunction

assign data = romout(addr); endmodule

14. 基本D 触发器

module DFF(Q,D,CLK); output Q; input D,CLK; reg Q;

always @(posedge CLK) begin Q <= D; end endmodule

15. 带异步清0、异步置 1 的D 触发器

module DFF1(q,qn,d,clk,set,reset); input d,clk,set,reset; output q,qn; reg q,qn;

always @(posedge clk or negedge set or negedge reset) begin

if (!reset) begin

9

q <= 0; //异步清 0,低电平有效 qn <= 1; end else if (!set) begin

q <= 1; //异步置 1,低电平有效 qn <= 0; end else begin q <= d; qn <= ~d; end end endmodule

16. 带同步清0、同步置 1 的D 触发器

module DFF2(q,qn,d,clk,set,reset); input d,clk,set,reset; output q,qn; reg q,qn;

always @(posedge clk) begin

if (reset) begin

q <= 0; qn <= 1; //同步清0,高电平有效 end else if (set) begin

q <=1; qn <=0; //同步置1,高电平有效 end else begin

10

q <= d; qn <= ~d; end end endmodule

17. 带异步清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) begin

if(!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; endcase end endmodule

18. 电平敏感的 1 位数据锁存器

module latch_1(q,d,clk); output q; input d,clk;

assign q = clk ? d : q; //时钟信号为高电平时,将输入端数据锁存 endmodule

11

19. 带置位和复位端的 1 位数据锁存器

module latch_2(q,d,clk,set,reset); output q; input d,clk,set,reset;

assign q = reset ? 0 : (set ? 1 : (clk ? d : q)); endmodule

20. 8 位数据锁存器

module latch_8(qout,data,clk); output[7:0] qout; input[7:0] data; input clk; reg[7:0] qout; always @(clk or data) begin

if (clk) qout<=data; end endmodule

21. 8 位数据寄存器

module reg8(out_data,in_data,clk,clr); output[7:0] out_data; input[7:0] in_data; input clk,clr; reg[7:0] out_data;

always @(posedge clk or posedge clr) begin

if(clr) out_data <=0;

else out_data <=in_data; end endmodule

12

22. 8 位移位寄存器

module shifter(din,clk,clr,dout); input din,clk,clr; output[7:0] dout; reg[7:0] dout; always @(posedge clk) begin

if (clr) dout<= 8'b0; //同步清0,高电平有效 else begin

dout <= dout << 1; //输出信号左移一位

dout[0] <= din; //输入信号补充到输出信号的最低位 end end endmodule

23. 可变模加法/减法计数器

module updown_count(d,clk,clear,load,up_down,qd); input[7:0] d; input clk,clear,load; input up_down; output[7:0] qd; reg[7:0] cnt; assign qd = cnt; always @(posedge clk) begin

if (!clear) cnt = 8'h00; //同步清0,低电平有效 else if (load) cnt = d; //同步预置

13

else if (up_down) cnt = cnt + 1; //加法计数 else cnt = cnt - 1; //减法计数 end endmodule

24. 4 位 Johnson 计数器(异步复位)

module johnson(clk,clr,out); input clk,clr; output[3:0] out; reg[3:0] out;

always @(posedge clk or posedge clr) begin

if (clr) out<= 4'h0; else

begin out<= out<< 1; out[0]<= ~out[3]; end end endmodule

25. 256 ×8 RAM 模块

module ram256x8(data,address,we,inclock,outclock,q); input[7:0] data; input[7:0] address; input we,inclock,outclock; output[7:0] q;

lpm_ram_dq myram(.q(q),.data(data),.address(address),

.we(we),.inclock(inclock),.outclock(outclock)); defparam myram.lpm_width=8; //定义数据宽度 defparam myram.lpm_widthad=8; //定义地址宽度

14

endmodule

26. 256 ×16 RAM 块

module map_lpm_ram(dataout,datain,addr,we,inclk,outclk); input[15:0] datain; //端口定义 input[7:0] addr; input we,inclk,outclk; output[15:0] dataout; //lpm_ram_dq元件例化

lpm_ram_dq ram(.data(datain),.address(addr),.we(we),.inclock(inclk), .outclock(outclk),.q(dataout));

defparam ram.lpm_width=16; //参数赋值 defparam ram.lpm_widthad=8;

defparam ram.lpm_indata=\"REGISTERED\"; defparam ram.lpm_outdata=\"REGISTERED\";

defparam ram.lpm_file=\"map_lpm_ram.mif\"; //RAM块中的内容取自该文件 endmodule

27. 4 位串并转换器

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

always @(posedge clk) begin

if(reset) out<=4'h0;

else if(en) out<={out,in}; //使用连接运算符 end endmodule

15

28. 用函数实现简单的处理器

module mpc(instr,out);

input[17:0] instr; //instr为输入的指令

output[8:0] out; //输出结果 reg[8:0] out; reg func;

reg[7:0] op1,op2; function[16:0] code_add; input[17:0] instr; reg add_func;

reg[7:0] code,opr1,opr2; begin

code=instr[17:16]; opr1=instr[7:0]; case(code) 2'b00: begin add_func=1;

opr2=instr[15:8]; end 2'b01: begin

add_func=0;

opr2=instr[15:8]; end 2'b10:

//从指令中提取的两个操作数 //函数的定义 //输入指令 instr的高2位是操作码 //输入指令 instr的低 8位是操作数 opr1 //从 instr中取第二个操作数 //从 instr中取第二个操作数 16

begin

add_func=1;

opr2=8'd1; //第二个操作数取为 1,实现+1操作 end default: begin

add_func=0;

opr2=8'd1; //实现-1操作 end endcase

code_add={add_func,opr2,opr1}; end endfunction always @(instr) begin

{func,op2,op1}=code_add(instr); //调用函数

if(func==1) out=op1+op2; //实现两数相加、操作数 1加 1操作 else out=op1-op2; //实现两数相减、操作数 1减 1操作 end endmodule

29. 微处理器的测试代码

`timescale 10ns/1ns `include \"mpc.v\" module mpc_tp; reg[17:0] instr; wire[8:0] out; parameter DELY=10;

17

mpc m1(instr,out); //调用待测试模块 initial begin instr=18'd0;

#DELY instr=18'b00_01001101_00101111; #DELY instr=18'b00_11001101_11101111; #DELY instr=18'b01_01001101_11101111; #DELY instr=18'b01_01001101_00101111; #DELY instr=18'b10_01001101_00101111; #DELY instr=18'b11_01001101_00101111; #DELY instr=18'b00_01001101_00101111; #DELY $finish; end

initial $monitor($time,,,\"instr=%b out=%b\ endmodule

30. 乘累加器(MAC )代码

module MAC(out,opa,opb,clk,clr); output[15:0] out; input[7:0] opa,opb; input clk,clr; wire[15:0] sum; reg[15:0] out;

function[15:0] mult; //函数定义,mult 函数完成乘法操作

input[7:0] opa,opb; //函数只能定义输入端,输出端口为函数名本身 reg[15:0] result;

integer i; begin

18

result = opa[0]? opb : 0; for(i= 1; i <= 7; i = i+1) begin

if(opa[i]==1) result=result+(opb<<(i-1)); end mult=result; end endfunction

assign sum=mult(opa,opb)+out; always @(posedge clk or posedge clr) begin

if(clr) out<=0; else out<=sum; end endmodule

31. 乘累加器的测试代码

'timescale 1ns/1ns 'include \"mac.v\" module mac_tp;

reg[7:0] opa,opb; //测试输入信号用 reg型变量 reg clr,clk;

wire[15:0] out; //测试输出信号用wire型变量 parameter DELY = 100; //测试对象调用

MAC m1(out,opa,opb,clk,clr);

always #(DELY) clk = ~clk; //产生时钟波形 initial begin //激励波形定义 clr=1;clk=0;opa=8'd0; opb=8'd0;

19

#DELY clr=0;opa=8'd1; opb=8'd10; #DELY opa=8'd2; opb=8'd10; #DELY opa=8'd3; opb=8'd10;

#DELY opa=8'd4; opb=8'd10; #DELY opa=8'd5; opb=8'd10; #DELY opa=8'd6; opb=8'd10; #DELY opa=8'd7; opb=8'd10; #DELY opa=8'd8; opb=8'd10; #DELY opa=8'd9; opb=8'd10; #DELY opa=8'd10; opb=8'd10; #DELY $finish; end

//结果显示

initial $monitor($time,,,\"clr=%b opa=%d opb=%d out=%d\ endmodule

20

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.com 版权所有 湘ICP备2023023988号-11

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务