实验四、时间基准电路 和 带使能的多周期计数器
1.参照代码,把后级计数器的计数范围改为0-15, 把计数器的0-15计数值经过译码,在DE0 的 HEX LED上显示成0-9-A-F的十六 进制数
后级计数器的代码
module rtl_module1(
CLK,
CNTVAL,
EN,
OV
);
input CLK;
input EN;
output [4-1:0]CNTVAL;
output OV;
reg [4-1:0]CNTVAL;
reg OV;
wire EN;
parameter cntmax=15;
always @(posedge CLK)begin
if(EN)begin
if(CNTVAL>=cntmax)begin
CNTVAL<=0;
end
else begin
CNTVAL<=CNTVAL+1'b1;
end
end
else begin
CNTVAL<=CNTVAL;
end
end
always @(CNTVAL)begin
if(CNTVAL==cntmax)begin
OV=1;
end
else begin
OV=0;
end
end
endmodule
前级计数器的代码
module rtl_module(
CLK,
CNTVAL,
OV
);
input CLK;
output [32-1:0]CNTVAL;
output OV;
reg [32-1:0]CNTVAL;
reg OV;
parameter cntmax=25000000;
always @(posedge CLK)begin
if(CNTVAL>=cntmax)begin
CNTVAL<=0;
end
else begin
CNTVAL<=CNTVAL+1'b1;
end
end
always @(CNTVAL)begin
if(CNTVAL==cntmax)begin
OV=1;
end
else begin
OV=0;
end
end
endmodule
计数器的值经过4-7译码器连接七段数码管管的引脚即可显示相应的数字和字母
4-7译码器的功能如下
module dec_4to7(
IN,
OUT
);
input [4-1:0] IN;
output [7-1:0] OUT;
reg [7-1:0]OUT;
always @(IN)begin
case(IN)
4'b0000: OUT=7'b1_000_000;//0
4'b0001: OUT=7'b1_111_001;//1
4'b0010: OUT=7'b0_100_100;//2
4'b0011: OUT=7'b0_110_000;//3
4'b0100: OUT=7'b0_011_001;//4
4'b0101: OUT=7'b0_010_010;//5
4'b0110: OUT=7'b0_000_010;//6
4'b0111: OUT=7'b1_111_000;//7
4'b1000: OUT=7'b0_000_000;//8
4'b1001: OUT=7'b0_010_000;//9
4'b1010: OUT=7'b0_001_000;//A
4'b1011: OUT=7'b0_000_011;//B
4'b1100: OUT=7'b1_000_110;//C
4'b1101: OUT=7'b0_100_001;//D
4'b1110: OUT=7'b0_000_110;//E
4'b1111: OUT=7'b0_001_110;//F
endcase
end
endmodule
BDF文件如下
2.修改时间基准发生器,设计一个使用2个HEX LED,精度为0.1秒,范围为0-9.9秒的计时秒表。自行设计上面计时器的附加控制功能(清零、暂 停)。
修改后的时间基准发生器的代码如下图所示
module rtl_module(
CLK,
CNTVAL,
OV
);
input CLK;
output [32-1:0]CNTVAL;
output OV;
reg [32-1:0]CNTVAL;
reg OV;
parameter cntmax=5000000;
always @(posedge CLK)begin
if(CNTVAL>=cntmax)begin
CNTVAL<=0;
end
else begin
CNTVAL<=CNTVAL+1'b1;
end
end
always @(CNTVAL)begin
if(CNTVAL==cntmax)begin
OV=1;
end
else begin
OV=0;
end
end
endmodule
将后级的计数器增加两个输入控制端口,分别为暂停和清零功能,分别由外部按键输入控制,其代码如下图所示
//后级计数器
module rtl_module1(
CLK,
CNTVAL,
STOP,
CLEAR,
EN,
OV
);
input STOP;
input CLEAR;
input CLK;
input EN;
output [4-1:0]CNTVAL;
output OV;
reg [4-1:0]CNTVAL;
reg OV;
wire EN;
//wire STOP;
//wire CLEAR;
parameter cntmax=9;
always @(posedge CLK )begin
if(!CLEAR)begin
CNTVAL<=0;
end
else if(EN)begin
if(STOP) begin
CNTVAL<=CNTVAL;
end
else if(CNTVAL>=cntmax)begin
CNTVAL<=0;
end
else begin
CNTVAL<=CNTVAL+1'b1;
end
end
else begin
CNTVAL<=CNTVAL;
end
end
always @(CNTVAL)begin
if(CNTVAL==cntmax)begin
OV=1;
end
else begin
OV=0;
end
end
endmodule
4-7译码器更改为输出为8位的4-8译码器,输出的最高位用来显示数码管的小数点,其小数点如下图所示
module dec_4to8(
IN,
OUT
);
input [4-1:0] IN;
output [8-1:0] OUT;
reg [8-1:0]OUT;
always @(IN)begin
case(IN)
4'b0000: OUT=8'b01_000_000;//0
4'b0001: OUT=8'b01_111_001;//1
4'b0010: OUT=8'b00_100_100;//2
4'b0011: OUT=8'b00_110_000;//3
4'b0100: OUT=8'b00_011_001;//4
4'b0101: OUT=8'b00_010_010;//5
4'b0110: OUT=8'b00_000_010;//6
4'b0111: OUT=8'b01_111_000;//7
4'b1000: OUT=8'b00_000_000;//8
4'b1001: OUT=8'b00_010_000;//9
4'b1010: OUT=8'b00_001_000;//A
4'b1011: OUT=8'b00_000_011;//B
4'b1100: OUT=8'b01_000_110;//C
4'b1101: OUT=8'b00_100_001;//D
4'b1110: OUT=8'b00_000_110;//E
4'b1111: OUT=8'b00_001_110;//F
endcase
end
endmodule
设计的BDF文件如下图所示:
实验五、 多周期移位寄存器
设计时间基准电路和带使能的多周期移位寄存器 • 电路工作在50MHz • 在每个时间基准信号有效的时钟周期 – 把一个拨码开关的状态值移位输入到寄存器的最低位 – 顺序移动移位寄存器的值 – 寄存器的每个比特送至一个LED灯上显示
前级时间基准电路的代码如下图所示
//计数值25000000的计数器
module rtl_module2(
CLK,
CNTVAL,
OV
);
input CLK;
output [32-1:0]CNTVAL;
output OV;
reg [32-1:0]CNTVAL;
reg OV;
parameter cntmax=25000000;
always @(posedge CLK)begin
if(CNTVAL>=cntmax)begin
CNTVAL<=0;
end
else begin
CNTVAL<=CNTVAL+1'b1;
end
end
always @(CNTVAL)begin
if(CNTVAL==cntmax)begin
OV=1;
end
else begin
OV=0;
end
end
endmodule
移位寄存器的代码如下图所示
//移位寄存器
module rtl_module3(
CLK,
RST,
EN,
IN,
OUT
);
parameter cnt_shift=6;
input CLK;
input RST;
input EN;
input IN;
output [cnt_shift-1:0]OUT;
reg [cnt_shift-1:0]shift_R;
assign OUT[cnt_shift-1:0]=shift_R[cnt_shift-1:0];//过程赋值一定要net型,reg不是net型,输入输出没有声明类型默认都是wire(net型)
always @(posedge CLK or posedge RST )begin
if(RST)begin
shift_R[cnt_shift-1:0]=0;
end
else if(EN) begin
shift_R[cnt_shift-1:1]<=shift_R[cnt_shift-2:0];
shift_R[0]<=IN;
end
else begin
shift_R[cnt_shift-1:0]<=shift_R[cnt_shift-1:0];
end
end
endmodule
设计的BPF文件如下图所示
设计新的功能 – 在原有的电路基础上,添加方向选择功能。 – SW0仍然是移位寄存器组的输入 – 使用SW1开关,控制移位寄存的方向 – 从实验现象上应当能够看到,SW1可以控制LED闪烁的 移动方向,以及控制SW0值的对LED组的输入位置(即 从LED组的最左边或是最右边)
在原有的移位寄存器中,增加多一个输入端口,输入信号为按键信号,用来控制移动的方向,
//带方向控制的移位寄存器
module rtl_module4(
CLK,
RST,
EN,
IN,
DIRECTION,
OUT
);
parameter cnt_shift=6;
input CLK;
input RST;
input EN;
input IN;
input DIRECTION;
output [cnt_shift-1:0]OUT;
reg [cnt_shift-1:0]shift_R;
assign OUT[cnt_shift-1:0]=shift_R[cnt_shift-1:0];//过程赋值一定要net型,reg不是net型,输入输出没有声明类型默认都是wire(net型)
always @(posedge CLK or posedge RST )begin
if(RST)begin
shift_R[cnt_shift-1:0]=0;
end
else if(EN) begin
if(DIRECTION)begin
shift_R[cnt_shift-1:1]<=shift_R[cnt_shift-2:0];
shift_R[0]<=IN;
end
else begin
shift_R[cnt_shift-2:0]<=shift_R[cnt_shift-1:1];
shift_R[cnt_shift-1]<=IN;
end
end
else begin
shift_R[cnt_shift-1:0]<=shift_R[cnt_shift-1:0];
end
end
endmodule
前级的计数器不变,其BDF文件如下图所示
实验六、计数器、ROM和DDS
电路的工作时钟是fsys= 50MHz, 拨动开关,观察丌同频率的 正弦波– 参考设计中,计数器和ROM 地址都是7 比特,连接关系如上图所示– 根据理论分析和实验结果,回答以下问题– 请回答,你能得到的正弦波频率和计数器增量值的对应关系是什么? • 设输出正弦波频率为f1,电路系统时钟为fsys,计数器步进增量为CNT • 请给出 f1 和fsys以及CNT 关系的数学表达式– 请回答,你能得到的最低频率的正弦波是多少
本次实验的计数器是增加了一个输入端口,输入信号由按键提供
//带计数征粮输入接口的计数器
module cnt_sync(
CLK,
CNTVAL,
INCR
);
input CLK;
input [9-1:0]INCR;
output [9-1:0]CNTVAL;
reg [9-1:0]CNTVAL;
always @(posedge CLK )begin
CNTVAL<=INCR+CNTVAL;
end
endmodule
正旋播表ROM文件,此文件可由Matlab生成
//
module sine_rom(
CLK , // clock
RA , // read address
RD ); // read data
input CLK;
input [6 :0] RA;
output [7 :0] RD;
reg [7 :0] RD;
always @ (posedge CLK)
case(RA)
7 'd 0 :RD = #1 8 'b 00000000; // 0 0x0
7 'd 1 :RD = #1 8 'b 00000110; // 6 0x6
7 'd 2 :RD = #1 8 'b 00001100; // 12 0xC
7 'd 3 :RD = #1 8 'b 00010010; // 18 0x12
7 'd 4 :RD = #1 8 'b 00011000; // 24 0x18
7 'd 5 :RD = #1 8 'b 00011110; // 30 0x1E
7 'd 6 :RD = #1 8 'b 00100100; // 36 0x24
7 'd 7 :RD = #1 8 'b 00101010; // 42 0x2A
7 'd 8 :RD = #1 8 'b 00110000; // 48 0x30
7 'd 9 :RD = #1 8 'b 00110110; // 54 0x36
7 'd 10 :RD = #1 8 'b 00111011; // 59 0x3B
7 'd 11 :RD = #1 8 'b 01000001; // 65 0x41
7 'd 12 :RD = #1 8 'b 01000110; // 70 0x46
7 'd 13 :RD = #1 8 'b 01001011; // 75 0x4B
7 'd 14 :RD = #1 8 'b 01010000; // 80 0x50
7 'd 15 :RD = #1 8 'b 01010101; // 85 0x55
7 'd 16 :RD = #1 8 'b 01011001; // 89 0x59
7 'd 17 :RD = #1 8 'b 01011110; // 94 0x5E
7 'd 18 :RD = #1 8 'b 01100010; // 98 0x62
7 'd 19 :RD = #1 8 'b 01100110; // 102 0x66
7 'd 20 :RD = #1 8 'b 01101001; // 105 0x69
7 'd 21 :RD = #1 8 'b 01101100; // 108 0x6C
7 'd 22 :RD = #1 8 'b 01110000; // 112 0x70
7 'd 23 :RD = #1 8 'b 01110010; // 114 0x72
7 'd 24 :RD = #1 8 'b 01110101; // 117 0x75
7 'd 25 :RD = #1 8 'b 01110111; // 119 0x77
7 'd 26 :RD = #1 8 'b 01111001; // 121 0x79
7 'd 27 :RD = #1 8 'b 01111011; // 123 0x7B
7 'd 28 :RD = #1 8 'b 01111100; // 124 0x7C
7 'd 29 :RD = #1 8 'b 01111101; // 125 0x7D
7 'd 30 :RD = #1 8 'b 01111110; // 126 0x7E
7 'd 31 :RD = #1 8 'b 01111110; // 126 0x7E
7 'd 32 :RD = #1 8 'b 01111111; // 127 0x7F
7 'd 33 :RD = #1 8 'b 01111110; // 126 0x7E
7 'd 34 :RD = #1 8 'b 01111110; // 126 0x7E
7 'd 35 :RD = #1 8 'b 01111101; // 125 0x7D
7 'd 36 :RD = #1 8 'b 01111100; // 124 0x7C
7 'd 37 :RD = #1 8 'b 01111011; // 123 0x7B
7 'd 38 :RD = #1 8 'b 01111001; // 121 0x79
7 'd 39 :RD = #1 8 'b 01110111; // 119 0x77
7 'd 40 :RD = #1 8 'b 01110101; // 117 0x75
7 'd 41 :RD = #1 8 'b 01110010; // 114 0x72
7 'd 42 :RD = #1 8 'b 01110000; // 112 0x70
7 'd 43 :RD = #1 8 'b 01101100; // 108 0x6C
7 'd 44 :RD = #1 8 'b 01101001; // 105 0x69
7 'd 45 :RD = #1 8 'b 01100110; // 102 0x66
7 'd 46 :RD = #1 8 'b 01100010; // 98 0x62
7 'd 47 :RD = #1 8 'b 01011110; // 94 0x5E
7 'd 48 :RD = #1 8 'b 01011001; // 89 0x59
7 'd 49 :RD = #1 8 'b 01010101; // 85 0x55
7 'd 50 :RD = #1 8 'b 01010000; // 80 0x50
7 'd 51 :RD = #1 8 'b 01001011; // 75 0x4B
7 'd 52 :RD = #1 8 'b 01000110; // 70 0x46
7 'd 53 :RD = #1 8 'b 01000001; // 65 0x41
7 'd 54 :RD = #1 8 'b 00111011; // 59 0x3B
7 'd 55 :RD = #1 8 'b 00110110; // 54 0x36
7 'd 56 :RD = #1 8 'b 00110000; // 48 0x30
7 'd 57 :RD = #1 8 'b 00101010; // 42 0x2A
7 'd 58 :RD = #1 8 'b 00100100; // 36 0x24
7 'd 59 :RD = #1 8 'b 00011110; // 30 0x1E
7 'd 60 :RD = #1 8 'b 00011000; // 24 0x18
7 'd 61 :RD = #1 8 'b 00010010; // 18 0x12
7 'd 62 :RD = #1 8 'b 00001100; // 12 0xC
7 'd 63 :RD = #1 8 'b 00000110; // 6 0x6
7 'd 64 :RD = #1 8 'b 00000000; // 0 0x0
7 'd 65 :RD = #1 8 'b 11111010; // -6 0xFA
7 'd 66 :RD = #1 8 'b 11110100; // -12 0xF4
7 'd 67 :RD = #1 8 'b 11101110; // -18 0xEE
7 'd 68 :RD = #1 8 'b 11101000; // -24 0xE8
7 'd 69 :RD = #1 8 'b 11100010; // -30 0xE2
7 'd 70 :RD = #1 8 'b 11011100; // -36 0xDC
7 'd 71 :RD = #1 8 'b 11010110; // -42 0xD6
7 'd 72 :RD = #1 8 'b 11010000; // -48 0xD0
7 'd 73 :RD = #1 8 'b 11001010; // -54 0xCA
7 'd 74 :RD = #1 8 'b 11000101; // -59 0xC5
7 'd 75 :RD = #1 8 'b 10111111; // -65 0xBF
7 'd 76 :RD = #1 8 'b 10111010; // -70 0xBA
7 'd 77 :RD = #1 8 'b 10110101; // -75 0xB5
7 'd 78 :RD = #1 8 'b 10110000; // -80 0xB0
7 'd 79 :RD = #1 8 'b 10101011; // -85 0xAB
7 'd 80 :RD = #1 8 'b 10100111; // -89 0xA7
7 'd 81 :RD = #1 8 'b 10100010; // -94 0xA2
7 'd 82 :RD = #1 8 'b 10011110; // -98 0x9E
7 'd 83 :RD = #1 8 'b 10011010; // -102 0x9A
7 'd 84 :RD = #1 8 'b 10010111; // -105 0x97
7 'd 85 :RD = #1 8 'b 10010100; // -108 0x94
7 'd 86 :RD = #1 8 'b 10010000; // -112 0x90
7 'd 87 :RD = #1 8 'b 10001110; // -114 0x8E
7 'd 88 :RD = #1 8 'b 10001011; // -117 0x8B
7 'd 89 :RD = #1 8 'b 10001001; // -119 0x89
7 'd 90 :RD = #1 8 'b 10000111; // -121 0x87
7 'd 91 :RD = #1 8 'b 10000101; // -123 0x85
7 'd 92 :RD = #1 8 'b 10000100; // -124 0x84
7 'd 93 :RD = #1 8 'b 10000011; // -125 0x83
7 'd 94 :RD = #1 8 'b 10000010; // -126 0x82
7 'd 95 :RD = #1 8 'b 10000010; // -126 0x82
7 'd 96 :RD = #1 8 'b 10000001; // -127 0x81
7 'd 97 :RD = #1 8 'b 10000010; // -126 0x82
7 'd 98 :RD = #1 8 'b 10000010; // -126 0x82
7 'd 99 :RD = #1 8 'b 10000011; // -125 0x83
7 'd 100 :RD = #1 8 'b 10000100; // -124 0x84
7 'd 101 :RD = #1 8 'b 10000101; // -123 0x85
7 'd 102 :RD = #1 8 'b 10000111; // -121 0x87
7 'd 103 :RD = #1 8 'b 10001001; // -119 0x89
7 'd 104 :RD = #1 8 'b 10001011; // -117 0x8B
7 'd 105 :RD = #1 8 'b 10001110; // -114 0x8E
7 'd 106 :RD = #1 8 'b 10010000; // -112 0x90
7 'd 107 :RD = #1 8 'b 10010100; // -108 0x94
7 'd 108 :RD = #1 8 'b 10010111; // -105 0x97
7 'd 109 :RD = #1 8 'b 10011010; // -102 0x9A
7 'd 110 :RD = #1 8 'b 10011110; // -98 0x9E
7 'd 111 :RD = #1 8 'b 10100010; // -94 0xA2
7 'd 112 :RD = #1 8 'b 10100111; // -89 0xA7
7 'd 113 :RD = #1 8 'b 10101011; // -85 0xAB
7 'd 114 :RD = #1 8 'b 10110000; // -80 0xB0
7 'd 115 :RD = #1 8 'b 10110101; // -75 0xB5
7 'd 116 :RD = #1 8 'b 10111010; // -70 0xBA
7 'd 117 :RD = #1 8 'b 10111111; // -65 0xBF
7 'd 118 :RD = #1 8 'b 11000101; // -59 0xC5
7 'd 119 :RD = #1 8 'b 11001010; // -54 0xCA
7 'd 120 :RD = #1 8 'b 11010000; // -48 0xD0
7 'd 121 :RD = #1 8 'b 11010110; // -42 0xD6
7 'd 122 :RD = #1 8 'b 11011100; // -36 0xDC
7 'd 123 :RD = #1 8 'b 11100010; // -30 0xE2
7 'd 124 :RD = #1 8 'b 11101000; // -24 0xE8
7 'd 125 :RD = #1 8 'b 11101110; // -18 0xEE
7 'd 126 :RD = #1 8 'b 11110100; // -12 0xF4
7 'd 127 :RD = #1 8 'b 11111010; // -6 0xFA
default : RD = #1 0;
endcase
endmodule
BDF文件如下
当增量为1时
当增量为2时
当增量为4
结论:计数器的增量越大,输。出的正旋波的频率高。 计数的增量越低,输出的频率就越低,所以输出的最低频率为50Mhz/128
f1 和fsys以及CNT 关系的数学表达式为f1=fsys*CNT/128;
时钟频率保持fsys= 50MHz 丌变, • 修改电路,把计数器的计数值和输入的计数增量信号都改为9比特, 计数值的高7位连接ROM的地址线,低2位悬空。如上图所示。– 把9比特的计数器增量输入信号连接到9个拨码开关上– 根据理论分析和实验结果,回答以下问题– 请回答,你能得到的正弦波频率和计数器增量值的对应关系是什么? • 设输出正弦波频率为f1,电路系统时钟为fsys,计数器步进增量为CNT • 请给出 f1 和fsys以及CNT 关系的数学表达式– 请回答,在这种连接方式下,你能得到的最低频率的正弦波是多少?
计数增量为1时
计数增量为3时
计数增量为7时
计数值的高7位连接ROM的地址线,低2位悬空,相当于把把计数值左移了两位,所以计数最大值是512,当计数间隔为1时,此时输出的正旋波频率最低为50Mhz/512,关系表达f1=fsys*CNT/512.