Написание кодов модуля verilog для счетчика вверх / вниз, мультиплексора 4to1, pulgen
Я довольно новичок в мире создания модулей Verilog, и мне нужно создать мультиплексор 4 на 1, генератор импульсов, счетчик вверх / вниз и отображение от шести до семи сегментов. Все они позже помещаются в модуль верхнего уровня.
Я попытался создать генератор 7segement и генератора импульсов, но мне нужна помощь в создании мультиплексора 4to1 (ранее я только создавал мультиплекс 2to1) и счетчика вверх / вниз.
это описание на моей лабораторной работе.
Pulse Gen: используется для контроля времени, в течение которого счетчик будет увеличиваться или уменьшаться. он использует вход с именем DELAU для определения промежутка времени между каждым импульсным выходом. каждый такт отсчитывается. когда количество отсчитанных тактовых импульсов равно входу задержки, генерируется импульс.
Счетчик вверх / вниз: будет увеличивать или уменьшать 8-битный регистр при каждом получении импульса. когда внешний переключатель с платы xilinx имеет высокий уровень (1), счетчик будет увеличиваться. Переключатель установлен в низкое положение (0), что приведет к уменьшению регистра. данные счета регистров выводятся на верхний уровень для светодиодов и 7-сегментного дисплея.
4to1 mux: обеспечить ввод задержки для генерации импульсов. четыре входа для мультиплексирования будут жестко заданы на верхнем уровне, чтобы обеспечить задержку 0,5, 1, 1,5 и 2 секунды соответственно. 2-битный выбор поступит от 2-х переключателей на плате xilinx. с доски пользователь сможет переключаться, выбирая время задержки, на которое счетчик будет считать вверх или вниз.
так вот что у меня так далеко. у меня действительно не так много для мукса и счетчика обновлений. (не могли бы вы также проверить мой пульген?)
4to1MUX
`timescale 1ns / 1ps
module mux4to1(sel,seg0,seg1,seg2,seg3,delay);
input [1:0] sel;
input seg0,seg1,seg2,seg3;
output delay;
wire delay;
assign seg0 = 500000000;
assign seg1 = 1000000000;
assign seg2 = 1500000000;
assign seg3 = 2000000000;
endmodule
СЧЕТЧИК ВВЕРХ / ВНИЗ
`timescale 1ns / 1ps
module updownCounter(updown,pulse,count);
input [7:0] updown,
input pulse;
output [7:0] count;
wire [7:0] count;
(i'm not sure what goes here)
endmodule
ГЕНЕРАТОР ИМПУЛЬСОВ
`timescale 1ns / 1ps
module pulsegen(clk,rst,delay,pulse);
input [28:0] delay;
output pulse;
wire pulse;
reg [28:0] count;
always @(posedge clk, posedge rst)
if (rst)
count <= 28'b0;
else if (pulse)
count <= 28'b0;
else
count <= count + 28'b1;
assign pulse = (count == delay);
endmodule
7-сегментный дисплей
`timescale 1ns / 1ps
module sevenSegDis(hex,a,b,c,d,e,f,g);
input [3:0] hex;
output a,b,c,d,e,f,g;
reg a,b,c,d,e,f,g;
always@(*)
case(hex)
4'b0000: {a,b,c,d,e,f,g}= 7'b0000001;
4'b0001: {a,b,c,d,e,f,g}= 7'b1001111;
4'b0010: {a,b,c,d,e,f,g}= 7'b0010010;
4'b0011: {a,b,c,d,e,f,g}= 7'b0000110;
4'b0100: {a,b,c,d,e,f,g}= 7'b1001100;
4'b0101: {a,b,c,d,e,f,g}= 7'b0100100;
4'b0110: {a,b,c,d,e,f,g}= 7'b0100000;
4'b0111: {a,b,c,d,e,f,g}= 7'b0001111;
4'b1000: {a,b,c,d,e,f,g}= 7'b0000000;
4'b1001: {a,b,c,d,e,f,g}= 7'b0000100;
4'b1010: {a,b,c,d,e,f,g}= 7'b0001000;
4'b1011: {a,b,c,d,e,f,g}= 7'b1100000;
4'b1100: {a,b,c,d,e,f,g}= 7'b0110001;
4'b1101: {a,b,c,d,e,f,g}= 7'b1000010;
4'b1110: {a,b,c,d,e,f,g}= 7'b0110000;
4'b1111: {a,b,c,d,e,f,g}= 7'b0111000;
default: {a,b,c,d,e,f,g}= 7'b1110111;
endcase
endmodule
1 ответ
Я думаю, что вы немного неправильно поняли описание мультиплексора. Вам не нужно создавать импульсы внутри него, поэтому цифры 500000000, 1000000000 не должны появляться там.
Вместо этого мультиплексор не должен заботиться о том, что означают его входы. Он просто должен подключить один из них к выходу, в зависимости от значения выбранного входа. Как и в 7-сегментном декодере, вы можете использовать case
утверждение для моделирования мультиплексора, и это может выглядеть так:
module mux4to1 (sel, seg0, seg1, seg2, seg3, delay);
input [1:0] sel;
input seg0, seg1, seg2, seg3;
output delay;
always @(*)
case(sel)
/* fill in the appropriate Verilog code which expresses this:
if `sel` is 0 -> `delay` is `seg0`
if `sel` is 1 -> `delay` is `seg1`
and so on */
endcase
endmodule
Ваш счетчик вверх / вниз нуждается в дополнительном тактовом входе. updown
ввод должен быть один бит, а не восемь бит.
Код счетчика должен выглядеть аналогично коду генератора импульсов. В каждом тактовом цикле должно происходить одно из следующего:
- если
pulse
0, счетчик остается как есть - если
pulse
это 1 иupdown
равно 1, счетчик увеличивается на один - если
pulse
это 1 иupdown
0, счетчик уменьшается на единицу
Ваш генератор импульсов и 7-сегментный декодер, кажется, в порядке.