FPGA入门实验3-6

实验四、时间基准电路 和 带使能的多周期计数器

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值