湖北商城网站建设多少钱,做婚纱摄影网站多少钱,网站做扫一扫,土地 水利 勘测设计 公司宣传册设计样本前言#xff1a;本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载
示例#xff1a;序列发生器与序列检测器
功能特性#xff1a; 采用 Xilinx Artix-7 XC7A35T芯片 配置方式#xff1a;USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器…前言本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载
示例序列发生器与序列检测器
功能特性 采用 Xilinx Artix-7 XC7A35T芯片 配置方式USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器2Mbit SRAM N25Q064A SPI Flash样图旧款为N25Q032A通用IOSwitch x8LEDx16Buttonx5DIPx8 通用扩展IO32pin 音视频/显示 7段数码管x8 VGA视频输出接口 Audio音频接口 通信接口UARTUSB转UART Bluetooth蓝牙模块 模拟接口 DAC8-bit分辨率 XADC2路12bit 1Msps ADC
目录 Ⅰ. 前置知识
0x00 序列检测器
0x01 序列发生器 Ⅱ. 示例讲解
0x00 序列发生器
0x01 序列检测器
Ⅲ. Verilog实现
0x00 序列检测器
0x01 序列发生器 Ⅰ. 前置知识
0x00 序列检测器
序列检测器在数据通讯雷达和遥测等领域中用于检测同步识别标志。
它是一种用来检测一组或多组序列信号的电路。例如检测器收到一组指定的串行码后输出标志1否则输出0。检测器每收到一个符合要求的串行码就需要用一个状态进行记忆。
若要检测的串行码长度为N位则需要N个状态另外还需要增加一个“未收到一个有效位”的初始状态共N1个状态
0x01 序列发生器
序列发生器用于产生一个指定序列串与序列检测器类似每产生一个符合要求的串行码就需要用一个状态进行记忆。
若要产生的串行码长度为N位则需要N个状态另外还需要增加一个“未产生一个有效位”的初始状态共N1个状态
❗注 进行序列发生器或者序列检测器的设计首先按要求画出状态转换图表然后按照实现方案采用经典设计方法或者Verilog语言完成设计。 Ⅱ. 示例讲解
0x00 序列发生器 设计一个序列发生器输出序列为110100 a、设计实现方法
b、基于Verilog语言完成设计
c、利用VIVADO验证并给出testbench结果波形图。 参考方法一计数器加组合输出网络类型
计数型序列信号发生器的结构框图如图示 它由计数器和组合输出网络两部分组成序列信号从组合输出网络输出。
这种类型的序列信号发生器一般分两步来设计首先根据序列的长度M设计模M计数器计数器的状态可以自定然后按计数器的状态转移关系和序列码的要求设计组合输出网络。
由于计数器的状态设置和输出网络没有直接的关系因此这种结构对于输出序列的更改比较方便而且还能同时产生多组序列码。
下面描述的为计数器加组合输出网络构成的序列信号发生器产生001011序列信号通过内部的3位计数器进行计数由计数状态和输出序列的对应关系得到其输出组合逻辑真值表从表中可以看到Q2Q1Q0从000开始计数并不断加1每个状态对应一个输出Z。通过真值表可以得到卡诺图
化简后可以得到输出逻辑函数为 Q2 Q1 Q0 Z 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 0 1 1 参考代码如下
module sequence_signal_counter(input clk, input rst_n, output outD);
//实现001011序列信号产生reg [2:0] counter;always (posedge clk) beginif(rst_n 1b0) counter 3b000;else if(counter 3b101) counter 3b000;else counter counter 1b1;endassign outD ((~counter[0]) counter[1]) | counter[2];
endmodule
参考方法二寄存器方式实现的序列信号产生器。
利用6位移位寄存器方式实现序列信号产生器在输入端din输入任意序列通过移位寄存器使得输入信号的最高位移入最低位其他各位依次向左移一位在每个时钟上升沿到来时将输入信号的最高位通过dout输出从而循环产生序列信号。
module sequence_signal_shifter(input clk, input rst, input [5:0] din, output outD); reg dout;reg [5:0] temp;assign outDdout;always(posedge clk)beginif(rst 1b0)temp din;elsebegindout temp[5];temp {temp[4:0], temp[5]};endend
endmodule 参考方法三利用有限状态机构造序列信号产生器。关于状态图和状态机的构造可以参考下面序列检测器的内容。
module sequence_signal_FSM(input clk, input rst_n, output outD);//有限状态机方式实现010011序列信号产生器reg dout; reg [2:0] pre_state, next_state; parameter s0 3b000, s1 3b001, s2 3b010, s3 3b011, s4 3b100, s5 3b101; assign outDdout;always (posedge clk or negedge rst_n) begin if(rst_n 0) pre_state s0; //让初始为输出0的状态观察与设为s5的区别else pre_state next_state; end always (pre_state) begin case(pre_state) s0: begin dout 1b0; next_state s1; end s1: begin dout 1b1; next_state s2; end s2: begin dout 1b0; next_state s3; end s3: begin dout 1b0;next_state s4; end s4: begin dout 1b1;next_state s5; end s5: begin dout 1b1;next_state s0; end default: next_state s0; endcase end
endmodule
0x01 序列检测器
设计一个序列检测器检测序列为11010
a、画出状态转换图
b、基于Verilog语言完成设计结合序列发生器编写顶层文件在vivado中验证并给出整体test bench结果波形图
下面讨论状态机的设计方法
在“11010”序列检测器中有6个状态如果加上一个Idle状态共7个状态最初的状态分析如下表 input NS/out PS 0 1 IDLE 0/0 1/0 0 0/0 1/0 1 0/0 11/0 11 110/0 11/0 110 0/0 1101/0 1101 11010/1 11/0 11010 0/0 1/0 Present State Next State/Output
对应状态图如图 首先考虑是否可以通过状态化简简化电路结构减少Verilog代码量。
可以看到状态“Idle”、状态“0”和“11010”在相同的输入下它们的次态、输出都完全相同故此三个状态可以化简为一个状态。化简结果如下表和下图。 input NS/out PS 0 1 0 0/0 1/0 1 0/0 11/0 11 110/0 11/0 110 0/0 1101/0 1101 0/1 11/0 Present State Next State/Output 接下来对化简后的状态进行命名、编码。本例将“0”“1”“11”“110”“1101”状态分别命名为“S0”“S1”“S11”“S110”“S1101”。
Verilog参考程序如下
module sequence_detector(input seq, input clk, input rst,output Z); // detector 11010
reg b;
reg [4:0]state;
assign Zb;
parameter S0 5b1_0000,S1 5b0_1000,S11 5b0_0100,S110 5b0_0010,S1101 5b0_0001;
//状态的记录利用one-hot编码
always (posedge clk or negedge rst) //low activeif (!rst) beginstate S0;b 0;endelse case(state)S0: if( seq 0)beginstate S0;b 0;endelsebeginstate S1;b 0;endS1: if( seq 0)beginstate S0;b 0;endelsebeginstate S11;b 0;endS11: if( seq 0)beginstate S110;b 0;endelsebeginstate S11;b 0;endS110: if( seq 0)beginstate S0;b 0;endelsebeginstate S1101;b 0;endS1101: if( seq 0)beginstate S0;b 1;endelsebeginstate S11;b 0;enddefault state 5bx;endcase
endmodule
Ⅲ. Verilog实现
0x00 序列检测器
设计代码:
module t_11010(reset,clk,x,z);
input reset,clk,x;
output z;
parameter y03b000,y13b001,y23b010,y33b011,y43b100,y53b101;
reg z;
reg [3:1] now,next;
always(posedge clk)
if(!reset)nowy0;
else nownext;always(x or now)
case(now)
y0:if(x) nexty1;
else nexty0;
y1:if(x) nexty2;
else nexty0;
y2:if(!x)nexty3;
else nexty2;
y3:if(x) nexty4;
else nexty0;
y4:if(!x) nexty0;
else nexty2;
default:nexty0;
endcasealways (posedge clk)
if(!reset)z0;
else if((nowy0)(x0))z1;
else z0;
endmodule仿真代码
module sim_pj1();
reg reset,clk,x;
wire z;
reg[10:0]test;
t_11010 uu1(reset,clk,x,z);
initial begin
clk0;
reset0;
test11d0;
#100 reset1;
test11b0001_1010_000;
end
always #20 clk~clk;
always #40
begin
xtest[10];
test{test[9:0],test[10]};
endendmodule仿真波形 0x01 序列发生器
设计代码
module sequence_signal_FSM(input clk, input rst_n, output outD);//有限状态机方式实现010011序列信号产生器reg dout; reg [2:0] pre_state, next_state; parameter s0 3b000, s1 3b001, s2 3b010, s3 3b011, s4 3b100, s5 3b101; assign outDdout;always (posedge clk or negedge rst_n) begin if(rst_n 0) pre_state s0; //让初始为输出0的状态观察与设为s5的区别else pre_state next_state; end always (pre_state) begin case(pre_state) s0: begin dout 1b0; next_state s1; end s1: begin dout 1b1; next_state s2; end s2: begin dout 1b0; next_state s3; end s3: begin dout 1b0;next_state s4; end s4: begin dout 1b1;next_state s5; end s5: begin dout 1b1;next_state s0; end default: next_state s0; endcase end
endmodule
仿真代码
module sim_sequence_signal_FSM();reg clk;reg rst_n;wire outD;sequence_signal_FSM uu1(clk,rst_n,outD);initial beginclk0;rst_n1;#30;rst_n0;#10;rst_n1;endalways #10 clk~clk;
endmodule仿真波形图