请选择 进入手机版 | 继续访问电脑版

risc-v中文社区

 找回密码
 立即注册
查看: 1158|回复: 0

[原创] verilog信号移相(1)

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-4-20 11:01:31 | 显示全部楼层 |阅读模式
1.代码文件说明
分频器的代码并不难,网上多数是奇偶分频分开写的代码,按照电路结构去理解,分频器分为奇偶数两个module是比较理想的。如果把奇偶两个模块写到一个module中,则会导致输出经过较多的逻辑电路,这对于一个时钟输出是极其不利的,会产生较差的时序,在做数字IC的时候要尤为注意这一点。调用本次代码时,只需例化Div.v,本次代码得到的都是占空比为50%的信号。

名字                说明
div_even.v        偶数分频module
div_odd.v        奇数分频module
Div.v                例化奇偶分频module的module
2.端口说明
仅以Div.v这个module来说明:

名字                 类型                 说明
fre_div        parameter        分频数
clk                input                 输入时钟
rst_n                input                 复位
clk_out        output        输出时钟
————————————————

//-----------------------------------------------------------------------------------------------
//  Copyright    :
//  File Name    : TOP
//  Author       : Luk.wj
//  Data         : 2021.10.14
//  Description  : TOP file for test
//-----------------------------------------------------------------------------------------------

module TOP #(
    parameter    fre_div = 4    //frequency division
) (
    input        clk,
    input        rst_n,
    output       clk_out
);

Div#(
    .fre_div   ( fre_div   )
)u1_Div(
    .clk       ( clk       ),
    .rst_n     ( rst_n     ),
    .clk_out   ( clk_out   )
);

endmodule


//-----------------------------------------------------------------------------------------------
//  Copyright    :
//  File Name    : div_even
//  Author       : Luk.wj
//  Data         : 2021.10.13
//  Description  : Even frequency division
//-----------------------------------------------------------------------------------------------

module div_even #(
    parameter    fre_div = 4    //frequency division
) (
    input            clk,
    input            rst_n,
    output reg       clk_out
);

reg  [fre_div/2-1:0]    cnt;  

always @(posedge clk or negedge rst_n) begin
   if (!rst_n) begin
       cnt     <= 0;
       clk_out <= 1'b0;
   end
   else if (cnt == (fre_div/2-1)) begin
       cnt     <= 0;
       clk_out <= ~clk_out;
   end
   else
       cnt <= cnt + 1;
end

endmodule


//-----------------------------------------------------------------------------------------------
//  Copyright    :
//  File Name    : div_odd
//  Author       : Luk.wj
//  Data         : 2021.10.13
//  Description  : Odd numkber frequency division
//-----------------------------------------------------------------------------------------------

module div_odd #(
    parameter    fre_div = 5    //frequency division
) (
    input            clk,
    input            rst_n,
    output           clk_out
);

reg  [(fre_div-1)/2:0]    cnt_p, cnt_n;  //posedge, negedge count
reg  clk_p, clk_n;                       //posedge, negedge generate clock

//====================================================  clk_p unit
always @(posedge clk or negedge rst_n) begin
   if (!rst_n) begin
       cnt_p  <= 0;
       clk_p  <= 1'b0;
   end
   else if (cnt_p == (fre_div-1)/2) begin
       clk_p  <= ~clk_p;
       cnt_p  <= cnt_p + 1;
   end
   else if (cnt_p == (fre_div-1)) begin
       cnt_p  <= 0;
       clk_p  <= ~clk_p;
   end
   else
       cnt_p  <= cnt_p + 1;
end

//====================================================  clk_n unit
always @(negedge clk or negedge rst_n) begin
   if (!rst_n) begin
       cnt_n  <= 0;
       clk_n  <= 1'b0;
   end
   else if (cnt_n == (fre_div-1)/2) begin
       clk_n  <= ~clk_n;
       cnt_n  <= cnt_n + 1;
   end  
   else if (cnt_n == (fre_div-1)) begin
       cnt_n  <= 0;
       clk_n  <= ~clk_n;
   end
   else
       cnt_n  <= cnt_n + 1;   
end

assign clk_out = clk_p | clk_n;

endmodule

版权声明:本文为CSDN博主「小火子Velsuked」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42446721/article/details/120823047

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-3-28 21:37 , Processed in 0.015828 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表