input RXD//输入信号
input RXCLK//输入时钟
input RXSET//输入的复位信号
output[7:0]TXD//输出的数据,8bit
reg [7:0]TXD//输出寄存器
output[2:0]TXDS//输出信号
reg [2:0]TXDS//输出寄存
output TXCLK//输出的时钟
regTXCLK //输出时钟寄存
reg RXD_D1//输入的数据寄存器。单比特
reg RXD_D2
reg RXD_D3
reg RXD_D4
reg RXD_D5
reg RXD_D6
reg RXD_D7
reg RXD_D8//输入的数据寄存器。单比特
//在接收rxclk下,每个时候域接收rxd数据,寄存一级
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D1<=1'b0
else RXD_D1<=RXD
//在接收rxclk下,每个时候域接收rxd数据,寄存二级,即打两拍
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D2<=1'b0
else RXD_D2<=RXD_D1
//寄存三级,即打三拍
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D3<=1'b0
else RXD_D3<=RXD_D2
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D4<=1'b0
else RXD_D4<=RXD_D3
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D5<=1'b0
else RXD_D5<=RXD_D4
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D6<=1'b0
else RXD_D6<=RXD_D5
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D7<=1'b0
else RXD_D7<=RXD_D6
//寄存8级,即打8拍,
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
RXD_D8<=1'b0
else RXD_D8<=RXD_D7
///////////////////////////////////////////////////////////////////
////////////////////search for 01111110 indacation/////////////////
///////////////////////////////////////////////////////////////////
reg [2:0]l_cs,l_ns//定义2个3bit的状态信号,当前态l_cs,下一个状态l_ns
//3bit的原因在于需要选择的数据为0~7,只需3bit
parameter s_hunt=3'd0,s0=3'd1,s1=3'd2,s2=3'd3,s3=3'd4,s4=3'd5,s5=3'd6,s6=3'd7
//定义初始态s_hunt=0’
//否则选择将下一个状态l_ns赋给当前态l_cs
always @(posedge RXCLK or negedge RXSET)
if(!RXSET)
l_cs<=s_hunt
else l_cs<=l_ns
//下面的状态机用于寻找序列"0111111"
//如果找到当前的要寻找的输入数,则跳入到下一个状态,否则跳到s0态,开始新一轮的寻找,
//通过这种方法寻找到所需要的序列“01111110”
always @(l_cs or RXD)
case(l_cs)
s_hunt:begin
if(RXD==1'b0)
l_ns=s0
else l_ns=s_idle
end
s0:begin
if(RXD==1'b1)
l_ns=s1
else l_ns=s0
end
s1:begin
if(RXD==1'b1)
l_ns=s2
else l_ns=s0
end
s2:begin
if(RXD==1'b1)
l_ns=s3
else l_ns=s0
end
s3:begin
if(RXD==1'b1)
l_ns=s4
else l_ns=s0
end
s4:begin
if(RXD==1'b1)
l_ns=s5
else l_ns=s0
end
s5:begin
if(RXD==1'b1)
l_ns=s6
else l_ns=s0
end
s6:l_ns=s_idle
endcase
//定义了寄存器SE_ind,
//该部分逻辑为组合逻辑,当找到所需要找的序列“01111110”时,输出SE_ind为1,否则为0;
//该信号相当于一个指示信号。是否找到所需的序列
reg SE_ind
always @(l_cs or RXD)
if(l_cs==s6 &&RXD==1'b0)
SE_ind=1'b1
else SE_ind=1'b0
module gen_divd(reset,clkin,clkout)input reset,clkin
output clkout
parameter divdWIDTH=1 //参数定义
parameter divdFACTOR=1
reg clkout
reg [divdWIDTH:0] cnt //2位计数器,最大记到3
always @ (posedge reset or posedge clkin)
if(reset) // 高电平复位
begin
cnt<=0//计数器清零
clkout<=0//输出时钟清零
end
else
begin
cnt<=cnt+1'b1//计数开始,来一个上升沿记一次数
if(cnt==(divdFACTOR-1)) //当cnt等于1
begin
cnt<=0//计数器清零
clkout<=~clkout //输出时钟翻转一次,就是简单的2分频
//假设开始clkout时低电平,当cnt计数到1(clkin刚好一个周期)时,clkout就翻转,变成高电平,clkout一个周期,相当于clkin的2个周期,实现2分频
end
end
endmodule
module count24(Rd,EN,CLK,Qh,Ql,C)input Rd,EN,CLK
output [3:0]Qh,Ql----------------------------------输出,Qh代表十位,Qi代表个位
output C--------------------------------------------进位标志,当Qh与QI总和达到24时,C置1
reg [3:0]Qh,Ql
reg C-------------------------------------------------声明QhQIC为寄存器变量,说明应用于时序逻辑
initial
begin
Qh=4'd0Ql=4'd0C=0
end ------------------------------从initial到end表示初始化赋值,这段语句不会被综合,用于仿真
always @ (posedge CLK)
begin
if(EN==1)------------------------使能,当EN为高电平时才执行下面的程序
begin
if(Rd==0)
begin
Qh=4'd0Ql=4'd0C=0--------------当Rd为0时,QhQIC设置为0,说明Rd是复位信号
end
else if(Qh<4'd2&&Ql<4'd9)
Ql=Ql+1----------------------------------当Qh小于2,QI小于9时,时钟上升沿到来时QI加1
else if(Qh<4'd2&&Ql==4'd9)
begin
Qh=Qh+1Ql=4'd0------------当Qh小于2,且QI已等于9,Qh十位进位加1,QI恢复0
end
else if(Qh==4'd2&&Ql<4'd3)
Ql=Ql+1---------------------------当Qh等于2,QI小于3,QI加1
else -------------------------------------若前面条件不满足,将QhQIC均设置为0
begin
Qh=4'd0Ql=4'd0C=0
end
if(Qh==4'd2&&Ql==4'd3) ----------------若为23,C进1
C=1
end
end
endmodule
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)