本实验测试模块中,为了生成变化的数据信号a和b,采用了#100 a=0;b=1;赋值语句。若需要比较的数据较多,所需赋值语句会增加,采用always # 100 clock=~clock产生周期时钟信号然后随机生成数据更简便。
6 / 19
选作一:设计一个字节的比较器
一、实验目的
比较两个字节的大小,如a[7:0]大于b[7:0],则输出高电平,否则输出低电平;并改写测试模型,使其能进行比较全面的测试。
二、实验设备
安装Modelsim-6.5c的PC机。 三、实验代码 ①模块源代码:
module compare_8bit(result,a,b);
input [7:0]a,b; output result;
assign result = (a>b)?1:0;
endmodule ②测试程序
`timescale 1ns/1ns
`include \
module test; reg[7:0]a,b; wire result; initial begin a=8'd0; b=8'd0;
#100 a=8'd6;b=8'd5; #100 a=8'd9;b=8'd9; #100 a=8'd12;b=8'd15; #100 $stop; end
compare_8bit m(.result(result),.a(a),.b(b));
endmodule 经过改写:
`timescale 1ns/1ns `include \
module test; reg[7:0]a,b; reg clock; wire result; initial begin a=8'd0; b=8'd0; clock=0; end
7 / 19
always # 50 clock=~clock; always@(posedge clock) begin
a={$random}%6; b={$random}%6; end initial
begin #100000 $stop; end
eight m(.result(result),.a(a),.b(b));
endmodule
四、仿真结果
经过改写:
五、实验总结
有256个可能值,为了进行比较全面的测试,改写为 always # 50 clock=~clock; always@(posedge clock) begin
a={$random}%6; b={$random}%6;
让a,b随机生成数据,可通过设置运行时间进行任意次比较。
最初测试模块使用了#100 a=8'd6;b=8'd5;的赋值语句,a,b的每个值都要手动赋予。由于一个字节(8位)
8 / 19
练习二 简单分频时序逻辑电路的设计
一、实验目的
1、掌握最基本组合逻辑电路的实现方法。 2、学习时序电路测试模块的编写。 3、学习综合和不同层次的仿真。 二、实验设备
安装Modelsim-6.5c的PC机。 三、实验内容
用always块和@(posedge clk)或@(negedge clk)的结构表述一个1/2分频器的可综合模型,观察时序仿真结果。
四、实验代码 ①模块源代码
module half_clk(reset,clk_in,clk_out); input clk_in,reset; output clk_out; reg clk_out;
always@(posedge clk_in) begin
if(! reset) clk_out=0; else clk_out=~clk_out; end
endmodule ②测试程序
`timescale 1ns/100ps `define clk_cycle 50 module top; reg clk,reset; wire clk_out;
always #`clk_cycle clk=~clk; initial begin clk = 0; reset=1; #10 reset=0; #110 reset=1; #100000 $stop; end
half_clk m0(.reset(reset),.clk_in(clk),.clk_out(clk_out)); endmodule
五、仿真结果
六、实验总结
在可综合的Verilog HDL模型,通常使用always块和@(posedge clk)或@(negedge clk)的结构来表述时序逻辑。
为了能正确地观察到仿真结果,并确定时序电路的起始相位,在可综合风格的模块中,通常定义一个复位信号reset,当reset为低电平时,对电路中的寄存器进行复位。
clk_out起始段为红色,是因为它是reg型,且尚未被赋值,仿真工具认为其为不定态。
9 / 19
选作二 七段数码管译码电路
一、实验目的
设计一个七段数码管译码电路。 二、实验设备
安装Modelsim-6.5c的PC机。 三、实验代码 ①模块源代码
module segdisplay(data,seg); input [3:0] data; output [6:0] seg; reg [6:0] paraseg; always @(data) begin case (data) 4'b0000: paraseg=7'b1111110; 4'b0001: paraseg=7'b0110000; 4'b0010: paraseg=7'b1101101; 4'b0011: paraseg=7'b1111001; 4'b0100: paraseg=7'b0110011; 4'b0101: paraseg=7'b1011011; 4'b0110: paraseg=7'b0011111; 4'b0111: paraseg=7'b1110000; 4'b1000: paraseg=7'b1111111; 4'b1001: paraseg=7'b1110011; 4'b1010: paraseg=7'b0001101; 4'b1011: paraseg=7'b0011001; 4'b1100: paraseg=7'b0100011; 4'b1101: paraseg=7'b1001011; 4'b1110: paraseg=7'b0001111; 4'b1111: paraseg=7'b0000000; endcase end
assign seg=paraseg; endmodule ②测试程序
`timescale 1ns/1ns module experiment4; wire [6:0] out; reg [3:0] data; reg clock; initial begin data = 0; clock = 0; end always #50 clock= ~clock; always@(posedge clock) begin data <= data+1; end initial begin
/ 19
10
相关推荐: